利用IIC通信协议与EEPROM进行通信,实现写、读操作
四个按键负责输入,动态数码管负责输出,iic半双工负责读写EEPROM内部的数据。 1.四个按键: key1负责将当前数码显示的数字写入EEPROM内。 key2负责读取EEPROM内的数据,并在数码管上显示出来。 key3按下一次则增加当前数码管数字,增加一位。 key4清空当前的数字为0。
定义公共所需的延时、变量简写宏定义
//详见文件Public.c与Public.h扫描并返回当前按下的按键
//详见key.c与key.h扫描并返回当前按下的按键
//详见smg.c与smg.h在SCL为高电平时,SDA产生一个下降沿即为开始。
在SCL为高电平时,SDA产生一个上降沿即为结束。
%E8%B5%B7%E5%A7%8B%E5%92%8C%E5%81%9C%E6%AD%A2%E4%BF%A1%E5%8F%B7.png)
void iic_start(void)
{
IIC_SDA=1;//如果把该条语句放在SCL后面,第二次读写会出现问题
delay_10us(1);
IIC_SCL=1;
delay_10us(1);
IIC_SDA=0; //当SCL为高电平时,SDA由高变为低
delay_10us(1);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
delay_10us(1);
}void iic_stop(void)
{
IIC_SDA=0;//如果把该条语句放在SCL后面,第二次读写会出现问题
delay_10us(1);
IIC_SCL=1;
delay_10us(1);
IIC_SDA=1; //当SCL为高电平时,SDA由低变为高
delay_10us(1);
}void iic_ack(void)
{
IIC_SCL=0;
IIC_SDA=0; //SDA为低电平
delay_10us(1);
IIC_SCL=1;
delay_10us(1);
IIC_SCL=0;
}void iic_nack(void)
{
IIC_SCL=0;
IIC_SDA=1; //SDA为高电平
delay_10us(1);
IIC_SCL=1;
delay_10us(1);
IIC_SCL=0;
}u8 iic_wait_ack(void)
{
u8 time_temp=0;
IIC_SCL=1;
delay_10us(1);
while(IIC_SDA) //等待SDA为低电平
{
time_temp++;
if(time_temp>100)//超时则强制结束IIC通信
{
iic_stop();
return 1;
}
}
IIC_SCL=0;
return 0;
}void iic_write_byte(u8 dat)
{
u8 i=0;
IIC_SCL=0;
for(i=0;i<8;i++) //循环8次将一个字节传出,先传高再传低位
{
if((dat&0x80)>0)
IIC_SDA=1;
else
IIC_SDA=0;
dat<<=1;
delay_10us(1);
IIC_SCL=1;
delay_10us(1);
IIC_SCL=0;
delay_10us(1);
}
}u8 iic_read_byte(u8 ack)
{
u8 i=0,receive=0;
for(i=0;i<8;i++ ) //循环8次将一个字节读出,先读高再传低位
{
IIC_SCL=0;
delay_10us(1);
IIC_SCL=1;
receive<<=1;
if(IIC_SDA)receive++;
delay_10us(1);
}
if (!ack)
iic_nack();
else
iic_ack();
return receive;
}%E5%BA%94%E7%AD%94%E5%93%8D%E5%BA%94.png)
%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93a.png)
%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93b.png)