已经解决了
谢谢大家了 大家么事可以看哈!
可以断电存储!!!!!!
#include<reg52.h> char code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f } ;
sbit dula=P2^6; sbit wela=P2^7; sbit sda=P2^0; //数据线 sbit scl=P2^1; //时钟线 char aa ,bb,cc,temp,shi,ge,tt; int read_add(char); char read_byte(); void delay() //延时5微秒 {; ;}
void delay1(int z) { int x,y; for(x=0;x<z;x++) for(y=0;y<110;y++); } void start() //起始信号 { sda=1; delay(); scl=1; delay(); sda=0; delay(); }
void stop() //终止信号 { sda=0; delay(); scl=1; delay(); sda=1; delay(); }
void respons() //应答信号 { char i; scl=1; delay(); while((sda==1)&&(i<250)) //等待应答 如果有应答或者一段时间后没有应答就跳出 i++; scl=0; delay(); }
void init() //初始化 { aa=0; bb=0; cc=1; tt=read_add(23); temp=tt; ge= tt%10; shi=tt/10; // temp=0; //sda=1; //把总线打开 // scl=1; TMOD=0X01; //打开计数器0 TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; EA=1; ET0=1; }
void write_byte(char date) //读取一个字节 { char i,temp; temp=date; scl=0; delay(); for(i=0;i<8;i++) //移动八位是一个字节 { temp=temp<<1; //左移移位后 将最高位移到了CY当中 sda=CY; //将最高位送出去 delay(); scl=1; delay(); scl=0; delay(); } sda=1; //释放总线 delay(); }
char read_byte() //读字节 { char i,j,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); j=sda; k=(k<<1)|j;//将j给k八次 刚好k里面存着八个数据 scl=0; delay(); } return k; }
void write_add(char address,char date) //在制定的位置写数据 { start(); write_byte(0xa0);//这是器件的地址 前四位固定 后三位是0 最后一个是0 表示往里面写数据 respons();//写完后等待应答 write_byte(address);//写地址 器件内部存储的地址 respons(); write_byte(date);//往里面写数据 respons(); stop(); }
int read_add(char address) { char date; start(); write_byte(0xa0); respons(); write_byte(address); respons(); start(); write_byte(0xa1); respons(); date=read_byte(); stop(); return date; } void display(int shi,int ge) { /* P0=0X00; P1=0x0e; P0=table[bai]; delay(z); */ // dula=0; dula=1; P0=table[ge]; //送数字8到段码端口 // dula=1; dula=0;
wela=0; P0=0xfd; //数码管位选 wela=1; wela=0;;
//dula=1; // write_add(bb,table[shi]); // delay1(100); // dula=1; // P0=table[shi]; // dula=0; // write_add(bb,table[shi]); // delay1(100); delay1(1); /* wela=1; P0=0xfd; wela=0; delay1(1); */ // dula=0; dula=1; P0=table[shi]; //送数字8到段码端口 // dula=1; dula=0;
wela=0; P0=0xfe; //数码管位选 wela=1; wela=0; //dula=1; // write_add(bb,table[ge]); // delay1(100); // dula=1; // dula=0; // write_add(cc,table[ge]); delay1(1); /* wela=1; P0=0xfe; wela=0; delay1(1); */ } void main() { init(); /* wela=1; P0=0xfc; wela=0; */ while(1) { if(aa==20) { aa=0; temp++; write_add(23,temp); if(temp==100) temp=0; shi=temp/10; ge=temp%10; } display( shi, ge); /* write_add(23,table[]); delay1(100); P1=read_add(23); */ } // while(1); } void timer0() interrupt 1 { A TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; } |