/*-----------------------
發送應答
-----------------------*/
void Ack() {
SDA=0;
SCL=1;
MDDelay();
SCL=0;
}
/*-----------------------
發送不應答
-----------------------*/
void NoAck() {
SDA=1;
SCL=1;
MDDelay();
SCL=0;
}
/*-------------------------------------------------------
寫一個byte
-------------------------------------------------------------*/
void WriteByte(unsigned char BufByte)
{
unsigned char i;
for(i=1;i<=8;i++){
SCL=1;
MDDelay();
SDA=(bit)(BufByte&0x80);//從高位開始寫入,輸出一位數據
SCL=0;
MDDelay();
BufByte<<=1;//左移一位
}
SCL=0;
}
/*--------------------------------------------------
寫(page wirte) 24C04
--------------------------------------------------*/
void Write24c04(unsigned char *ArrayData,unsigned char RomAddress,unsigned char ArrayLen)
{
Start();//發送開始信號
WriteByte(0xA0);//"寫"命令+片選地下信號(只有一個a2,a1,a0==0)
Ack();
WriteByte(RomAddress);//准備寫入EEPROM地址信息
Ack();
for(;ArrayLen!=0;ArrayLen--)
{
WriteByte(*ArrayData);
Ack();
ArrayData++;//指針下移取下一個ArrayData數組的地址
}
Stop();//發送停止信號
}
/*----------------------------------
讀一個byte
-------------------------------------*/
unsigned char Read8Bit()
{
unsigned char i,rbyte=0;
SDA=1;
for(i=1;i<=8;i++) {
SCL=1;
SCL=0;
rbyte<<=1;
if(SDA) rbyte|=0x01;
}
return(rbyte);
}
/*--------------------------------------------------
讀24C004 (Randowm read 方式)
--------------------------------------------------*/
void Read24c04(unsigned char *ReadData,unsigned char RomAddress,unsigned char bytes)
{
unsigned char i;
for(i=0;i<bytes;i++){
Start();//發送開始信號
WriteByte(0xA0);//"寫"命令+片選地下信號
Ack();
WriteByte(RomAddress+i);//寫入片地址信息
Ack();
//--------------
Start();//重復發送開始信號,注:這裡和寫不同
WriteByte(0xA1);//(讀)+片選地值(000)
Ack();
//---------
*(ReadData+i)=Read8Bit();//將讀來的數據保存至ReadBuf數組中
NoAck();
Stop();
}
}
/*--------------------------
初始化port
---------------------------*/
void Rest()
{
WP=0;//置低電平,清除寫保護
SDA=0;//數據總線置低電平
SCL=0;//時鐘置低電平
}
void main()
{
unsigned char myd[9]={'1','2','3','4','5','6','7','8','\0'};
unsigned char myRead[9];
Rest();
Write24c04(&myd,0x00,9);
delay20ms();
delay20ms();
Read24c04(&myRead,0x00,9);
delay20ms();
delay20ms();
}