//************************************ /* 程序功能:记忆开机的次数,并显示在数码管上 */ //************************************ #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar code num[]={0x80,0xed,0x42,0x48,0x2c,0x18,0x10,0xcc,0x00,0x08}; //****管脚定义**** sbit scl=P0^3;//艾方西的数据线 sbit sda=P0^4;//艾方西的时钟线 sbit rck=P2^0; sbit sck=P2^1; sbit si=P2^2; //数码管的串行数据输入端 sbit key1=P1^0; //====函数的声明===== void delayus();//微秒级延时函数 void delayms();//毫秒级延时函数 void start();//起始函数 void stop();//终止函数 void ack();//应答函数 void noack();//非应答函数 void write_byte(uchar date);//写字节函数 uchar read_byte();//读字节函数 void xie(uchar add,uchar date);//写操作函数 uchar du(uchar add);//读操作函数 void write_595(uchar date);//数码管 void smg_595(uint j,uint i); //************************************ void delayus() { ; ; ; } /*void delayms(uint time) { uint i,j; for(i=time;i>0;i--) for(j=110;j>0;j--); } */ void start() { sda=1; delayus(); scl=1;//时钟线在高电平期间,数据线由高到底的跳变表示起始 delayus(); sda=0; delayus(); } void stop() { sda=0; delayus(); scl=1; //时钟线在高电平期间,数据线由底到高的跳变表示终止 delayus(); sda=1; delayus(); } void ack() { uint i=0; scl=1; if((sda==1)&(i<250))i++; scl=0; delayus(); } void noack() { sda=1; delayus(); scl=0; delayus(); scl=1; delayus(); scl=0; } void write_byte(uchar date) { uint i; scl=0; for(i=0;i<8;i++) { if(date&0x80) { sda=1; } else { sda=0; } scl=1; date=date<<1; delayus(); scl=0; sda=1; delayus(); } sda=1; delayus(); } uchar read_byte() { uint i; uchar date=0x00; sda=1; delayus(); scl=0; delayus(); for(i=0;i<8;i++) { scl=1; delayus(); date=date<<1; if(sda) { date++; } scl=0; delayus(); } return date; } void xie(uchar add,uchar date) { start(); write_byte(0xa0); ack(); write_byte(add); ack(); write_byte(date); ack(); stop(); } uchar du(uchar add) { uchar k; start(); write_byte(0xa0); ack(); write_byte(add); ack(); start(); write_byte(0xa1); ack(); k=read_byte(); noack(); stop(); return k; } void chushihua() { sda=1; scl=1; } void main() { uchar k=0; k=du(7); k=k%10; smg_595(k,k); k++; xie(7,k); while(1); } void smg_595(uint j,uint i) { write_595(num[i]); write_595(num[j]); rck=0; rck=1; } void write_595(uchar date) { uint i; for(i=0;i<8;i++) { date>>=1; sck=0; si=CY; sck=1; } }