| #include <REG52.H> #include <stdio.h> sbit escl=P0^3; sbit esda=P0^2; void w24c512(uchar pageadr,uchar wdataadr,uchar wdata);//一個(gè)字節(jié)寫(xiě)入24C512子程序,入口:uchar pageadr,uchar wdataadr,uchar wdata uchar r24c512(uchar pageadr,uchar wdataadr);//從24C512中讀取一個(gè)字節(jié),入口uchar pageadr,uchar wdataadr,有返回值 void delay_10us(void); //==================//寫(xiě)24C512子程序單字節(jié)//================== //============//入口:uchar pageadr,uchar wdataadr,uchar wdata======== void w24c512(usigned char device,unsigned int wdataadr,uchar wdata) { uchar i,msb,lsb; uchar deviceadr; escl=0; delay_10us(); esda=1; delay_10us(); escl=1; delay_10us(); esda=0; delay_10us(); escl=0; //開(kāi)始時(shí)序 if (device==0) { deviceadr=0xa0; } else { deviceadr=0xa2; } order=deviceadr; for(i=0;i<8;i++) { esda=order7; delay_10us(); escl=1; delay_10us(); escl=0; delay_10us(); order=order<<1; } delay_10us(); escl=1; delay_10us(); escl=0; //page adr sequ msb=wdataadr/256; lsb=wdataadr % 256; order=msb; for(i=0;i<8;i++) { esda=order7; delay_10us(); escl=1; delay_10us(); escl=0; delay_10us(); order=order<<1; } delay_10us(); escl=1; delay_10us(); escl=0; //msb高字節(jié) order=lsb; for(i=0;i<8;i++) { esda=order7; delay_10us(); escl=1; delay_10us(); escl=0; delay_10us(); order=order<<1; } delay_10us(); escl=1; delay_10us(); escl=0; //lsb低字節(jié) order=wdata; for(i=0;i<8;i++) { esda=order7; delay_10us(); escl=1; delay_10us(); escl=0; delay_10us(); order=order<<1; } delay_10us(); escl=1; delay_10us(); escl=0; //want to write a byte esda=0; delay_10us(); escl=1; delay_10us(); esda=1; delay_10us(); escl=0; delay_10us(); delay_10us(); delay_10us(); } //stop //==================//讀24C512子程序單字節(jié)//================== //==================//入口:uchar pageadr,uchar wdataadr,有返回值====== uchar r24c16(usigned char device,unsigned int wdataadr,uchar wdata){ uchar i,msb,lsb,deviceadr; escl=0; delay_10us(); esda=1; delay_10us(); escl=1; delay_10us(); esda=0; delay_10us(); escl=0; //start sequ if (device==0) { deviceadr=0xa0; } else { deviceadr=0xa2; } order=deviceadr; for(i=0;i<8;i++) { esda=order7; delay_10us(); escl=1; delay_10us(); escl=0; delay_10us(); order=order<<1; } delay_10us(); escl=1; delay_10us(); escl=0; //page adr sequ msb=wdataadr/256; lsb=wdataadr % 256; order=msb; for(i=0;i<8;i++) { esda=order7; delay_10us(); escl=1; delay_10us(); escl=0; delay_10us(); order=order<<1; } delay_10us(); escl=1; delay_10us(); escl=0; //unit adr sequ order=lsb; for(i=0;i<8;i++) { esda=order7; delay_10us(); escl=1; delay_10us(); escl=0; delay_10us(); order=order<<1; } delay_10us(); escl=1; delay_10us(); escl=0; //unit adr sequ escl=0; delay_10us(); esda=1; delay_10us(); escl=1; delay_10us(); esda=0; delay_10us(); escl=0; //restart if (device==0) { deviceadr=0xa1; } else { deviceadr=0xa3; } order=deviceadr; for(i=0;i<8;i++) { esda=order7; delay_10us(); escl=1; delay_10us(); escl=0; delay_10us(); order=order<<1; } delay_10us(); escl=1; delay_10us(); escl=0; //page adr sequ order=0x00; esda=1; for(i=0;i<8;i++) { order=order<<1; escl=1; delay_10us(); order0=esda; delay_10us(); escl=0; delay_10us(); } //read data esda=1; escl=1; delay_10us(); escl=0; //ack esda=0; delay_10us(); escl=1; delay_10us(); esda=1; delay_10us(); escl=0; delay_10us(); delay_10us(); delay_10us(); wdataadr=order; return(wdataadr); } //stop void delay_10us(void) { unsigned int i; for(i=0;i<600;i++) { } }
|