/************************main.c文件程序源代碼**************************/
#include <reg52.h>
extern void LcdInit();
extern void LcdShowStr(unsigned char x, unsigned char y, const unsigned char *str);
extern void I2CStart();
extern void I2CStop();
extern unsigned char I2CReadACK();
extern unsigned char I2CReadNAK();
extern bit I2CWrite(unsigned char dat);
void E2Read(unsigned char *buf, unsigned char addr, unsigned char len);
void E2Write(unsigned char *buf, unsigned char addr, unsigned char len);
void ArrayToHexStr(unsigned char *str, unsigned char *array, unsigned char len);
void main ()
{
unsigned char i;
unsigned char buf[5];
unsigned char str[20];
LcdInit(); //初始化液晶
E2Read(buf, 0x90, sizeof(buf)); //從E2中讀取一段數(shù)據(jù)
ArrayToHexStr(str, buf, sizeof(buf)); //轉(zhuǎn)換為十六進(jìn)制字符串
LcdShowStr(0, 0, str); //顯示到液晶上
for (i=0; i<sizeof(buf); i++) //數(shù)據(jù)依次+1,+2,+3...
{
buf[ i] = buf[ i] + 1 + i;
}
E2Write(buf, 0x90, sizeof(buf)); //再寫回到E2中
while(1)
{}
}
void ArrayToHexStr(unsigned char *str, unsigned char *array, unsigned char len) //把一個(gè)字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串的格式
{
unsigned char tmp;
while (len--)
{
tmp = *array >> 4; //先取高4位
if (tmp <= 9) //轉(zhuǎn)換為0-9或A-F
*str = tmp + '0';
else
*str = tmp - 10 + 'A';
str++;
tmp = *array & 0x0F; //再取低4位
if (tmp <= 9) //轉(zhuǎn)換為0-9或A-F
*str = tmp + '0';
else
*str = tmp - 10 + 'A';
str++;
*str = ' '; //轉(zhuǎn)換完一個(gè)字節(jié)添加一個(gè)空格
str++;
array++;
}
}
void E2Read(unsigned char *buf, unsigned char addr, unsigned char len) //E2讀取函數(shù),數(shù)據(jù)接收指針buf,E2中的起始地址addr,讀取長度len
{
do { //用尋址操作查詢當(dāng)前是否可進(jìn)行讀寫操作
I2CStart();
if (I2CWrite(0x50<<1)) //器件應(yīng)答則跳出循環(huán),繼續(xù)執(zhí)行,非應(yīng)答則進(jìn)行下一次查詢
break;
I2CStop();
} while(1);
I2CWrite(addr); //寫入起始地址
I2CStart(); //發(fā)送重復(fù)啟動(dòng)信號
I2CWrite((0x50<<1)|0x01); //尋址器件,后續(xù)為讀操作
while (len > 1) //連續(xù)讀取len-1個(gè)字節(jié)
{
*buf = I2CReadACK(); //最后字節(jié)之前為讀取操作+應(yīng)答
buf++;
len--;
}
*buf = I2CReadNAK(); //最后一個(gè)字節(jié)為讀取操作+非應(yīng)答
I2CStop();
}
void E2Write(unsigned char *buf, unsigned char addr, unsigned char len) //E2寫入函數(shù),源數(shù)據(jù)指針buf,E2中的起始地址addr,寫入長度len
{
while (len--)
{
do { //用尋址操作查詢當(dāng)前是否可進(jìn)行讀寫操作,即等待上一次寫入操作完成
I2CStart();
if (I2CWrite(0x50<<1)) //器件應(yīng)答則跳出循環(huán),繼續(xù)執(zhí)行,非應(yīng)答則進(jìn)行下一次查詢
break;
I2CStop();
} while(1);
I2CWrite(addr); //寫入起始地址
I2CWrite(*buf); //寫入一個(gè)字節(jié)數(shù)據(jù)
I2CStop(); //結(jié)束寫操作,以等待寫入完成
buf++; //數(shù)據(jù)指針遞增
addr++; //E2地址遞增
}
}