|
#include <REG52.H> #include <stdio.h> sbit escl=P0^3; sbit esda=P0^2; void w24c512(uchar pageadr,uchar wdataadr,uchar wdata);//一个字节写入24C512子程序,入口:uchar pageadr,uchar wdataadr,uchar wdata uchar r24c512(uchar pageadr,uchar wdataadr);//从24C512中读取一个字节,入口uchar pageadr,uchar wdataadr,有返回值 void delay_10us(void); //==================//写24C512子程序单字节//================== //============//入口: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; //开始时序 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高字节 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低字节 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子程序单字节//================== //==================//入口: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++) { } }
|