#define uchar unsigned char
#define uint unsigned int
sbit SCK=P3^6; //串行時鐘輸入
sbit SDA=P3^7; //串行數據輸入/輸出
void Start()//起始信號
{
SDA=1;
delay5us();//延時要大于4.7us,取5u
SCK=1;
delay5us();
SDA=0;
delay5us();
}
void Stop()//結束信號
{
SDA=0;
delay5us();//延時要大于4.7us,取5us
SCK=1;
delay5us();
SDA=1;
delay5us();
}
void Ack()//應答信號
{
SDA=0;
SCK=0;
delay5us();
SCK=1;
delay5us();
SCK=0;
}
/*SCK在高電平期間,SDA被拉為低電平表示應答*/
bit WaitAck()//等待應答信號
{
SDA=1;//釋放總線
delay5us();
SCK=1;
delay5us();
if(SDA)//無應答
{
SCK=0;
Stop();
return 0;
}
else
{
SCK=0;
return 1;
}
}
void InputOneByte(uchar dat)//寫入一個字節AT24C02
{
uchar iVal;
for(iVal=0;iVal<8;iVal++)
{
SCK=0;
delay5us();
SDA=(dat & 0x80)>>7;//將數據的最高位放入SAD,如0011 0010
//則將末位0送入SDA
delay5us();
SCK=1;
dat<<=1;//數據左移一位,準備存第二位數
}
SCK=0;
}
uchar OutputOneByte()//讀取一個字節
{
uchar iVal;
uchar x;//保存讀取到的值
SDA=1;//釋放總線,以讓SDA線轉由接收設備(AT24C02)控制
for(iVal=0;iVal<8;iVal++)
{
SCK=0;
delay5us();
SCK=1;
delay5us();
x<<=1;//從低位開始讀
if(SDA)
x |= 0x01;//將SDA上的數據通過按位“或“運算存入x中
}
SCK=0;
return x;
}
void WriteAddAndDate(uchar add,uchar dat)
{
Start();//啟動
InputOneByte(0xA0);//寫入器件AT24C02地址
WaitAck();//等待器件應答
InputOneByte(add);//存放數據的地址
WaitAck();//等待器件應答
InputOneByte(dat);//要保存的數據
WaitAck();//等待器件應答
Stop();
}
uchar ReadDataFromDatAdd(uchar DatAdd)//從某個地址讀取數據
{
uchar Data;
Start();
InputOneByte(0xA0);//寫入器件AT24C02地址
WaitAck();//等待器件應答
InputOneByte(DatAdd);//存放數據的地址
WaitAck();//等待器件應答
Start();
InputOneByte(0xA1);//讀取數據的器件地址
WaitAck();//等待器件應答
Data=OutputOneByte();//d讀取數據
Stop();
return Data;
}
void main()
{
float AT;
/**********AT24C02轉換***********/
LCD_Initial();
GotoXY(0,0);//設定顯示位置
WriteAddAndDate(0X01,0X85);
AT=ReadDataFromDatAdd(0X00);
sprintf(table2,"The data is:%f",AT);//將數據寫入table2中
Print(table2);//打印
while(1);
}
|