IIC总线通信是一种重要的通信方式,使用下列程序可以将写入AT24C256中的数据显示到LCD1602上:
IIC.h:
#ifndef _IIC_H
#define _IIC_H
#include "reg52.h"
#include "intrins.h"
sbit SCL=P0^1;
sbit SDA=P0^2;
void iic_delay(void);
void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WriteByte(unsigned char dat);
unsigned char ReadByte(void);
unsigned char ReadByteN(void);
#endif
IIC.c:
#include "IIC.h"
/**********延时函数,i=1时延时1ms**********/
void iic_delay(void)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}
/************IIC起始信号************/
void IIC_Start(void)
{
SCL = 0;
SDA = 1; //SCL低电平时拉高SDA,为起始信号做准备
iic_delay();
SCL = 1; //拉高SCL,延时
iic_delay();
SDA = 0; //拉低SDA,延时
iic_delay();
SCL = 0; //拉低SCL
}
/************IIC停止信号*************/
void IIC_Stop(void)
{
SCL = 0;
SDA = 0; //SCL低电平时拉低SDA,为停止信号做准备
iic_delay();
SCL = 1; //拉高SCL,延时
iic_delay();
SDA = 1; //拉低SDA,延时
iic_delay();
SCL = 0; //拉低SCL
}
/*********写入一个字节数据*********/
bit IIC_WriteByte(unsigned char dat)
{
bit ack; //位定义应答位
unsigned char mask;
for(mask=0x80;mask!=0;mask>>=1) //高位到低位依次传输
{
if( (mask&dat) == 0 ) SDA = 0;
else SDA = 1;
iic_delay();
SCL = 1;
iic_delay();
SCL = 0; //SCL由高变低完成一位的传送
}
SDA = 1;
iic_delay();
SCL = 1;
ack = SDA;
iic_delay();
SCL = 0;
return ack; //返回0表示写入成功,返回1表示写入失败
}
/********接收一个字节数据********/
unsigned char ReadByte(void)
{
unsigned char mask;
unsigned char dat;
SDA = 1; //将SDA拉高,设置数据线为输入方式
for(mask=0x80;mask!=0;mask>>=1)
{
iic_delay();
SCL = 1;
if(SDA == 0) dat&=~mask; //SDA为0时,dat的对应位清零
else dat|=mask; //SDA不为零时,dat的对应位置1
iic_delay();
SCL = 0;
}
SDA = 0;
iic_delay();
SCL = 1;
iic_delay();
SCL = 0;
return dat;
}
unsigned char ReadByteN(void)
{
unsigned char mask;
unsigned char dat;
SDA = 1; //将SDA拉高,设置数据线为输入方式
for(mask=0x80;mask!=0;mask>>=1)
{
iic_delay();
SCL = 1;
if(SDA == 0) dat&=~mask; //SDA为0时,dat的对应位清零
else dat|=mask; //SDA不为零时,dat的对应位置1
iic_delay();
SCL = 0;
}
SDA = 1;
iic_delay();
SCL = 1;
iic_delay();
SCL = 0;
return dat;
}
main.c:
#include "reg52.h"
#include "LCD1602.H"
#include "IIC.h"
#include "AT24CXX.h"
unsigned char t[10];
unsigned char d;
void delay_ms(unsigned int k)
{
unsigned int i,j;
for(i=k;i>0;i--)
{
for(j=78;j>0;j--);
}
}
void main(void)
{
LCD_Init(); //LCD初始化
LCD_WriteString(1,1,"AT24C256");
WriteByte_AT24C256(0x08,123); //写数据
delay_ms(10);
d = ReadByte_AT24C256(0x08); //读数据
t[0] = d/100+'0';
t[1] = (d/10)%10+'0';
t[2] = d%10+'0'; //分离数据
LCD_WriteString(2,1,t);
while(1)
{
;
}
}
