#include <reg52.h> sbit CS=P2^7; sbit SK=P2^6; sbit DI=P2^5; sbit DO=P2^4;
/* extern unsigned char ReadChar(unsigned char address); extern void WriteChar(unsigned char address,unsigned char InData); extern void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number); extern void WriteString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number); */
// Write enable must precede all programming modes. void Ewen(void) { unsigned char temp,InData; CS=0; SK=0; CS=1; InData=0x98; // 10011XXXX for(temp=9;temp!=0;temp--) { // 9 DI=InData&0x80; SK=1; SK=0; InData<<=1; } CS=0; }
// Disables all programming instructions. void Ewds(void) { unsigned char temp,InData; CS=0; SK=0; CS=1; InData=0x80; // 10000XXXX for(temp=9;temp!=0;temp--) { // 9 DI=InData&0x80; SK=1; SK=0; InData<<=1; } CS=0; }
// Reads data stored in memory, at specified address. unsigned int Read(unsigned char address) { unsigned char temp; unsigned int result; Ewen(); SK=0; DI=1; // 110 A5-A0 CS=0; CS=1; SK=1; SK=0; // 1 address=address&0x3f|0x80; for(temp=8;temp!=0;temp--) { // 8 DI=address&0x80; SK=1; SK=0; address<<=1; } DO=1; for(temp=16;temp!=0;temp--) { // 16 SK=1; result=(result<<1)|DO; SK=0; } CS=0; Ewds(); return(result); }
// Writes memory location An - A0. void Write(unsigned char address,unsigned int InData) { unsigned char temp; Ewen(); SK=0; DI=1; // 101 A5-A0 CS=0; CS=1; SK=1; SK=0; // 1 address=address&0x3f|0x40; for(temp=8;temp!=0;temp--) { // 8 DI=address&0x80; SK=1; SK=0; address<<=1; } for(temp=16;temp!=0;temp--) { // 16 DI=InData&0x8000; SK=1; SK=0; InData<<=1; } CS=0; DO=1; CS=1; SK=1; while(DO==0) { // busy test SK=0; SK=1; } SK=0; CS=0; Ewds(); }
/* // Erase memory location An - A0. void Erase(unsigned char address) { unsigned char temp; Ewen(); SK=0; DI=1; // 111 A5-A0 CS=0; CS=1; SK=1; SK=0; // 1 address|=0xc0; for(temp=8;temp!=0;temp--) { // 8 DI=address&0x80; SK=1; SK=0; address<<=1; } CS=0; DO=1; CS=1; SK=1; while(DO==0) { SK=0; SK=1; } SK=0; CS=0; Ewds(); }
// Erases all memory locations. Valid only at VCC = 4.5V to 5.5V. void Eral(void) { unsigned char temp,InData; Ewen(); CS=0; SK=0; CS=1; InData=0x90; // 10010XXXX for(temp=9;temp!=0;temp--) { // 9 DI=InData&0x80; SK=1; SK=0; InData<<=1; } CS=0; DO=1; CS=1; SK=1; while(DO==0) { SK=0; SK=1; } SK=0; CS=0; Ewds(); }
// Writes all memory locations. Valid only at VCC = 4.5V to 5.5V. void Wral(unsigned int InData) { unsigned char temp,address; Ewen(); CS=0; SK=0; CS=1; address=0x88; // 10001XXXX for(temp=9;temp!=0;temp--) { // 9 DI=address&0x80; SK=1; SK=0; address<<=1; } for(temp=16;temp!=0;temp--) { // 16 DI=InData&0x8000; SK=1; SK=0; InData<<=1; } CS=0; DO=1; CS=1; SK=1; while(DO==0) { SK=0; SK=1; } SK=0; CS=0; Ewds(); }
*/
unsigned char ReadChar(unsigned char address) { unsigned char temp=address>>1; if(address&0x01) return((unsigned char)(Read(temp)>>8)); else return((unsigned char)(Read(temp))); }
void WriteChar(unsigned char address,unsigned char InData) { unsigned char temp=address>>1; if(address&0x01) Write(temp,(unsigned int)(Read(temp)&0x00ff|(InData<<8))); else Write(temp,(unsigned int)(Read(temp)&0xff00|InData)); }
void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number) { while(Number!=0) { *RamAddress=ReadChar(RomAddress); RamAddress++; RomAddress++; Number--; } }
void WriteString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number) { unsigned int temp; if(Number==0) return; if(RomAddress&0x01) { WriteChar(RomAddress,*RamAddress); RamAddress++; RomAddress++; Number--; } if(Number==0) return; while(Number>>1) { temp=*RamAddress; RamAddress++; temp=temp|(*RamAddress)<<8; RamAddress++; Write(RomAddress>>1,temp); RomAddress++; RomAddress++; Number--; Number--; } if(Number) WriteChar(RomAddress,*RamAddress); } |
|