/*
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);