//==========================头文件加载===============================#include <reg52.h> //加载52系列单片机头文件//===========================端口声明================================sbit CLK=P3^6; //74hc574时钟信号线sbit G=P2^4; //74hc574使能sbit IIC_SDA=P2^6; //声明IIC总线的数据线接在单片机的P2.5端口。
sbit IIC_SCL=P2^5; //声明IIC总线的时钟线接在单片机的P2.7端口。
unsigned char tabl[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0BF,0x8C};//0,1,2,3,4,5,6,7,8,9,-,P//===========================函数声明================================void display(unsigned char aa);void delay(unsigned int t);void delay_IIC(void);void IIC_Init(void);void IIC_start(void);void IIC_stop(void);bit IIC_Tack(void);void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data);unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr); void IIC_write_byte(unsigned char Data);unsigned char IIC_read_byte(void);//============================主函数=================================void main() //主函数{unsigned char Data=2,addr=0x01;//---------------------------系统初始化--------------------------IIC_Init();//初始化IIC总线。
//P1=0x7f;//LED8先亮。
while(1) //死循环{IIC_single_byte_write(0xa0,0x02,Data);//保存LED的状态delay(50000);//延时约0.5SData=IIC_single_byte_read(0xa0,0x02);//读出LED的状态if(Data<10)Data++;elseData=0;display(Data);delay(50000);//延时约0.5S}}//==========================功能子函数=============================== void delay(unsigned int t){//延时函数while(t){t--;}; //延时循环计数}//-------------------------------------------------------------------void delay_IIC(void){//IIC总线限速延时函数。
//该函数是空函数,延时4个机器周期。
;;}//-------------------------------------------------------------------void IIC_Init(void){//IIC总线初始化函数IIC_SDA=1;//释放IIC总线的数据线。
IIC_SCL=1;//释放IIC总线的时钟线。
}//-------------------------------------------------------------------void IIC_start(void){//IIC总线产生起始信号函数IIC_SDA=1;//拉高数据线IIC_SCL=1;//拉高时钟线delay_IIC();IIC_SDA=0;//在时钟线为高电平时,拉低数据线,产生起始信号。
delay_IIC();IIC_SCL=0;//拉低时钟线}//-------------------------------------------------------------------void IIC_stop(void){//IIC总线产生停止信号函数IIC_SDA=0;//拉低数据线delay_IIC();IIC_SCL=1;//拉高时钟线。
delay_IIC();IIC_SDA=1;//时钟时线为高电平时,拉高数据线,产生停止信号。
delay_IIC();}//-------------------------------------------------------------------bit IIC_Tack(void){//接收应答信号函数bit ack;//定义一个位变量,来暂存应答状态。
IIC_SDA=1;//释放数据总线,准备接收应答信号。
delay_IIC();IIC_SCL=1;//拉高时钟线。
delay_IIC();ack=IIC_SDA;//读取应答信号的状态。
delay_IIC();IIC_SCL=0;//拉低时钟线。
delay_IIC();return ack;//返回应答信号的状态,0表示应答,1表示非应答。
}//-------------------------------------------------------------------void IIC_write_byte(unsigned char Data){//向IIC总线写入一个字节的数据函数unsigned char i;for(i=0;i<8;i++)//有8位数据{IIC_SDA=Data&0x80;//写最高位的数据delay_IIC();IIC_SCL=1; //拉高时钟线,将数写入到设备中。
delay_IIC();IIC_SCL=0;//拉低时钟线,允许改变数据线的状态delay_IIC();Data=Data<<1;//数据左移一位,把次高位放在最高位,为写入次高位做准备 }}//-------------------------------------------------------------------unsigned char IIC_read_byte(){//从IIC总线读取一个字节的数据函数unsigned char i;unsigned char Data; //定义一个缓冲寄存器。
for(i=0;i<8;i++)//有8位数据{IIC_SCL=1;//拉高时钟线,为读取下一位数据做准备。
delay_IIC();Data=Data<<1;//将缓冲字节的数据左移一位,准备读取数据。
delay_IIC();if(IIC_SDA)//如果数据线为高平电平。
Data=Data|0x1;//则给缓冲字节的最低位写1。
IIC_SCL=0;//拉低时钟线,为读取下一位数据做准备。
delay_IIC();}return Data;//返回读取的一个字节数据。
}//-------------------------------------------------------------------void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data){//向任意地址写入一个字节数据函数IIC_start();//产生起始信号IIC_write_byte(Daddr);//写入设备地址(写)IIC_Tack();//等待设备的应答IIC_write_byte(Waddr);//写入要操作的单元地址。
IIC_Tack();//等待设备的应答。
IIC_write_byte(Data);//写入数据。
IIC_Tack();//等待设备的应答。
IIC_stop();//产生停止符号。
}//-------------------------------------------------------------------unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr){//从任意地址读取一个字节数据函数unsigned char Data;//定义一个缓冲寄存器。
IIC_start();//产生起始信号IIC_write_byte(Daddr);//写入设备地址(写)IIC_Tack();//等待设备的应答IIC_write_byte(Waddr);//写入要操作的单元地址。
IIC_Tack();//等待设备的应答。
IIC_start();//产生起始信号IIC_write_byte(Daddr+1);//写入设备地址(读)。
IIC_Tack();//等待设备的应答。
Data=IIC_read_byte();//写入数据。
IIC_stop();//产生停止符号。
//-------------------返回读取的数据--------------------return Data;//返回读取的一个字节数据。
}//-------------------------------------------------------------------void display(unsigned char aa){P2=0xf0;G=0; //74hc574使能CLK=0; //n产生上升沿,数据写入74hc574P0=tabl[aa]; //n给数码CLK=1;}//===================================================================如有侵权请联系告知删除,感谢你们的配合!。