extern void WrToDecode0_3();
void main()
{
...............
WrToConfig();
//WrToDisplay_test();
WrToLight();
WrToDecode0_3();
Loop:
WrToDigit0();
......
goto Loop;
}
#define uchar unsigned char
#define uint unsigned int
#define Byte unsigned char
#define Word unsigned int
#define bool bit
#define true 1
#define false 0
//内存数据定义
#define BR_1K2L 0XE8
#define SlvAdr_W 0X38 //被控器地址+写命令,SLA+W max6959AAPE
#define SlvAdr_R 0XB8 //被控器地址+读命令,SLA+R max6959AAPE
uchar ByteCnt; //I2C 数据字节计数器
uchar SubAdr; //被控器单元地址
uchar XmtDat[5]; //发送数据缓冲区
uchar Digit[10];
extern void I2CStart(void);
extern void I2CStop(void);
extern bool WaitAck(void);
extern void SendAck(void);
extern void SendNotAck(void);
extern void I2CSendByte(Byte ch);
extern Byte I2CReceiveByte(void);
void WrToConfig()
{
I2CStart();//发送启动信号,启动I2C 总线
I2CSendByte(SlvAdr_W);//送器件地址
WaitAck();
I2CSendByte(0x04);//发送单元地址=config寄存器地址
WaitAck();
I2CSendByte(0x21);//发送config命令not shutdown*/
WaitAck();
I2CStop();
}
void WrToDisplay_test()
{
I2CStart();//发送启动信号,启动I2C 总线
I2CSendByte(SlvAdr_W);//送器件地址
WaitAck();
I2CSendByte(0x07);//发送单元地址=display test 寄存器地謈
WaitAck();
I2CSendByte(0x00);//发送显示测试命令
WaitAck();
I2CStop();
}
void WrToDigit0()
{
I2CStart();//发送启动信号,启动I2C 总线
I2CSendByte(SlvAdr_W);//送器件地址
WaitAck();
I2CSendByte(0x20);//发送单元地址=dig0寄存器地址
WaitAck();
I2CSendByte(0x0F);//发送显示的数据
WaitAck();
I2CStop();
}
void WrToLight()
{
I2CStart();//发送启动信号,启动I2C 总线
I2CSendByte(SlvAdr_W);//送器件地址
WaitAck();
I2CSendByte(0x02);//发送单元地址=亮度寄存器地址
WaitAck();
I2CSendByte(0x3e);//发送亮度数据=22。64mA
WaitAck();
}
void WrToDecode0_3()
{
I2CStart();//发送启动信号,启动I2C 总线
I2CSendByte(SlvAdr_W);//送器件地址
WaitAck();
I2CSendByte(0x01);//发送单元地址=亮度寄存器地址
WaitAck();
I2CSendByte(0x0f);//发送亮度数据=22。64mA
WaitAck();
}
/*————————————————————
〖说明〗I2C总线驱动程序(用两个普通IO模拟I2C总线)
默认11.0592Mhz的晶振。
〖版本〗V1.00A Build 0803
—————————————————————*/
/*whm*/
/******* MAX6959接口与AT89C2051接口地址****/
#include <AT892051.H>
#ifndef SDA
#define SDA P1_6
#define SCL P1_5
#endif
#define uchar unsigned char
#define uint unsigned int
#define Byte unsigned char
#define Word unsigned int
#define bool bit
#define true 1
#define false 0
extern uchar SystemError;
extern void _nop_(void);
//_nop_()为等待一个时钟周期
#define SomeNOP(); _nop_();_nop_();_nop_();_nop_();
/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
EA=0;
SDA=1; SCL=1; SomeNOP();//INI
SDA=0; SomeNOP(); //START
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CStop(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
SCL=0; SDA=0; SomeNOP(); //INI
SCL=1; SomeNOP(); SDA=1; //STOP
EA=1;
}
/**--------------------------------------------------------------------------------
调用方式:bit I2CAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
bool WaitAck(void)
{
uchar errtime=255;//因故障接收方无ACK,超时值为255。
SDA=1;SomeNOP();
SCL=1;SomeNOP();
while(SDA)
{
errtime--;
if (!errtime)
{
I2CStop();
SystemError=0x11;
return false;
}
}
SCL=0;
return true;
}
/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0; SomeNOP();
SCL=1; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
}**--------------------------------------------------------------------------------*/
void SendNotAck(void)
{
SDA=1; SomeNOP();
SCL=1; SomeNOP();
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CSendByte(Byte ch)
{
uchar i=8;
while (i--)
{
SCL=0;
_nop_();
SDA=(bit)(ch&0x80);
ch < <=1;
SomeNOP();
SCL=1;
SomeNOP();
}
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
Byte I2CReceiveByte(void)
{
uchar i=8;
Byte ddata=0;
SDA=1;
while (i--)
{
ddata < <=1;
SCL=0;SomeNOP();
SCL=1;SomeNOP();
ddata|=SDA;
}
SCL=0;
return ddata;
}