#define DIO_LED GET_BITFIELD(&PD_ODR).bit0
#define CLK_LED GET_BITFIELD(&PD_ODR).bit2
void I2CStart(void)
{
DIO_LED=1;
CLK_LED=1;
nop();
DIO_LED=1;
nop();
DIO_LED=0;
nop();
CLK_LED=0;
}
/********************Stop函数*************************/
void I2CStart(void)
{
CLK_LED=0;
nop();
nop();
DIO_LED=0;
nop();
nop();
CLK_LED=1;
nop();
nop();
nop();
DIO_LED=1;
nop();
CLK_LED=0;
DIO_LED=0;
}
/***************发送8bit数据,从低位开始**************/
void I2CWritebyte(unsigned char oneByte)
{
unsigned char i;
for(i=0;i<8;i++)
{
CLK_LED=0;
if(oneByte&0x01)
DIO_LED=1;
else
DIO_LED=0;
nop();
CLK_LED=1;
oneByte=oneByte>>1;
}
//8位数据传送完
CLK_LED = 0; //判断芯片发过来的ACK应答信号
nop();
while(DIO_LED==1);
nop();
CLK_LED = 1;
nop();
}
/************显示函数,地址自加一************/
void disp0(unsigned char *p)
{
unsigned char i;
I2CStart();
I2CWritebyte(0x40); //数据命令设置:地址自动加1,写数据到显示寄存器
I2CStop();
I2CStart();
I2CWritebyte(0xc0); //地址命令设置:初始地址为00H
for(i=0;i<6;i++) //发送4字节数据到显存
{
I2CWritebyte(*p);
p++;
}
I2CStop();
I2CStart();
I2CWritebyte(0x8C); //显示控制命令:开显示,脉冲宽度为11/16.
I2CStop();
}
/************显示函数,固定地址写数据************/
void disp(unsigned char add, unsigned char value)
{
I2CStart();
I2CWritebyte(0x44); //数据命令设置:固定地址,写数据到显示寄存器
I2CStop();
I2CStart();
I2CWritebyte(add); //地址命令设置:写入add对应地址
//I2CWritebyte(CODE[value]); //给add地址写数据
I2CStop();
I2CStart();
I2CWritebyte(0x8C); //显示控制命令:开显示,脉冲宽度为11/16.
I2CStop();
}
/***************读按键程序**************/
unsigned char read_key()
{
unsigned char rekey,i;
I2CStart();
I2CWritebyte(0x42); //写读键指令0x42
DIO_LED=1;
for(i=0;i<8;i++)
{
CLK_LED=0;
nop();
nop();
rekey=rekey>>1; //先读低位
nop();
nop();
CLK_LED=1;
if(DIO_LED)
rekey=rekey|0x80;
else
rekey=rekey|0x00;
nop();
}
CLK_LED = 0; //判断芯片发过来的ACK应答信号
nop();
nop();
while(DIO_LED==1);
nop();
nop();
CLK_LED = 1;
nop();
nop();
I2CStop();
return rekey;
}