?? +
字號:
/*-----------------------------------------------
名稱:IIC協(xié)議 EEPROM24c02
內(nèi)容:此程序用于檢測EEPROM性能,測試方法如下:寫入24c02一些數(shù)據(jù),然后在內(nèi)存中清除這些數(shù)據(jù),
掉電后主內(nèi)存將失去這些信息,然后從24c02中調(diào)入這些數(shù)據(jù)。看是否與寫入的相同。
------------------------------------------------*/
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include <intrins.h> //包含NOP空指令函數(shù)_nop_();
#define AddWr 0xae //寫數(shù)據(jù)地址,需要參考24c02芯片文檔
#define AddRd 0xaf //讀數(shù)據(jù)地址
sbit Sda=P1^2; //定義總線連接端口
sbit Scl=P1^1;
sbit WP=P1^0; //寫保護(hù),這里不使用
/*------------------------------------------------
延時程序
------------------------------------------------*/
void mDelay(unsigned char j)
{
unsigned int i;
for(;j>0;j--)
{
for(i=0;i<125;i++)
{;}
}
}
/*------------------------------------------------
啟動IIC總線
------------------------------------------------*/
void Start(void)
{
Sda=1;
_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Sda=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
}
/*------------------------------------------------
停止IIC總線
------------------------------------------------*/
void Stop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
}
/*------------------------------------------------
應(yīng)答IIC總線
------------------------------------------------*/
void Ack(void)
{
Sda=0;
_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
_nop_();_nop_();
}
/*------------------------------------------------
非應(yīng)答IIC總線
------------------------------------------------*/
void NoAck(void)
{
Sda=1;
_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
_nop_();_nop_();
}
/*------------------------------------------------
發(fā)送一個字節(jié)
------------------------------------------------*/
void Send(unsigned char Data)
{
unsigned char BitCounter=8;
unsigned char temp;
do
{
temp=Data;
Scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*------------------------------------------------
讀入一個字節(jié)并返回
------------------------------------------------*/
unsigned char Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8;
Sda=1;
do
{
Scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
/*------------------------------------------------
寫入數(shù)據(jù)
------------------------------------------------*/
void WrToROM(unsigned char Data[],unsigned char Address,unsigned char Num)
{
unsigned char i;
unsigned char *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(AddWr); //寫入芯片地址
Ack();
Send(Address+i);//寫入存儲地址
Ack();
Send(*(PData+i));//寫數(shù)據(jù)
Ack();
Stop();
mDelay(20);
}
}
/*------------------------------------------------
讀出數(shù)據(jù)
------------------------------------------------*/
void RdFromROM(unsigned char Data[],unsigned char Address,unsigned char Num)
{
unsigned char i;
unsigned char *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start(); //寫入芯片地址
Send(AddWr);
Ack();
Send(Address+i);//寫入存儲地址
Ack();
Start();
Send(AddRd); //讀入地址
Ack();
*(PData+i)=Read();//讀數(shù)據(jù)
Scl=0;
NoAck();
Stop();
}
}
/*------------------------------------------------
主程序
------------------------------------------------*/
void main()
{
unsigned char Number[4]={0x06,0x5b,0x4f,0x66};// 顯示碼值 1234
unsigned char i;
WP=0; //寫保護(hù)關(guān)掉
P2=0x00;
WrToROM(Number,4,4); //寫入24c02
mDelay(200);
Number[0]=0; //清除當(dāng)前數(shù)據(jù)
Number[1]=0;
Number[2]=0;
Number[3]=0;
RdFromROM(Number,4,4); //調(diào)用存儲數(shù)據(jù)
while(1)
{
P0=Number[i]; //顯示存儲數(shù)據(jù)
mDelay(200); //延時用于演示顯示數(shù)據(jù)
mDelay(200);
i++;
if(i==4)
i=0;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -