標(biāo)題:
自己用的1T單片機(jī)AT24C02庫 支持STC12C5A60S2等芯片
[打印本頁]
作者:
sxhwdz
時(shí)間:
2018-10-2 20:48
標(biāo)題:
自己用的1T單片機(jī)AT24C02庫 支持STC12C5A60S2等芯片
自己一直使用的I2C庫,可供參考。
單片機(jī)源程序如下:
#include <INTRINS.H>
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define slaw 0xa0
#define slar 0xa1
sbit sclb = P3^0;
sbit sdab = P3^1;
/**************************************
延時(shí)5微秒(STC12C5A60S2@12M)
不同的工作環(huán)境,需要調(diào)整此函數(shù)
此延時(shí)函數(shù)是使用1T的指令周期進(jìn)行計(jì)算,與傳統(tǒng)的12T的MCU不同
**************************************/
void Delay5us()
{
BYTE n = 4;
while (n--)
{
_nop_();
_nop_();
}
}
//-----------------------
// 發(fā)出 START 1->0
void IICstart(void)
{
sdab=1;
sclb=1; Delay5us();
sdab=0; Delay5us();
sclb=0;
Delay5us(); //延時(shí)
}
//-----------------------
// 發(fā)出 STOP 0->1
void IICstop(void)
{
sdab=0;
sclb=1; Delay5us();
sdab=1; Delay5us();
sclb=0;
Delay5us(); //延時(shí)
}
//-----------------------
// 發(fā)出 應(yīng)答位 0
void mack(void)
{
sdab=0;
sclb=1; Delay5us(); sclb=0;
sdab=1;
Delay5us(); //延時(shí)
}
//-----------------------
// 發(fā)出 非應(yīng)答位 1
void mnack(void)
{
sdab=1;
sclb=1; Delay5us(); sclb=0;
sdab=0;
Delay5us(); //延時(shí)
}
//-----------------------
// 向 SDA 寫一個(gè)字節(jié)
bit wrbyt(BYTE out_b)
{
BYTE data i;
bit bdata sack;
ACC=out_b;
for(i=8;i>0;i--)
{
ACC = ACC<<1; sdab=CY;
sclb=1; Delay5us(); sclb=0;
Delay5us(); //延時(shí)
}
sdab=1;
sclb=1;
Delay5us(); //延時(shí)
sack=sdab; //收應(yīng)答
sclb=0;
Delay5us(); //延時(shí)
return sack; //返回應(yīng)答
}
//-----------------------
// 從 SDA 讀取一個(gè)字節(jié)
sbit ACC_bit0= ACC^0;
BYTE rdbyt(void)
{
BYTE data i;
sdab=1;
ACC=0;
for(i=8;i>0;i--)
{
ACC=ACC<<1;
sclb=1; Delay5us();
ACC_bit0=sdab;
sclb=0;
Delay5us(); //延時(shí)
}
return ACC;
}
//-----------------------
// 發(fā)送 numbyt 字節(jié)
void wrnbyt(BYTE iic_add, BYTE numbyt, BYTE xdata *data_add) reentrant
{
BYTE i;
for(i=100;i>0;i--)
{
IICstart();
if(!wrbyt(slaw)) // 發(fā)送 SLAW 字節(jié)
break;
} // return 0;
wrbyt(iic_add); // 發(fā)送 地址
for( ; numbyt>0; numbyt--)
{
wrbyt(*data_add++); // 發(fā)送
}
IICstop();
}
//-----------------------
// 讀取 numbyt 字節(jié)
void rdnbyt(BYTE iic_add, BYTE numbyt, BYTE idata *data_add) reentrant
{
BYTE i;
for(i=100;i>0;i--)
{
IICstart();
if(!wrbyt(slaw)) // 發(fā)送 SLAW 字節(jié)
break;
} // return 0;
wrbyt(iic_add); // 發(fā)送 地址
IICstart();
wrbyt(slar); // 發(fā)送 SLAr 字節(jié)
for(; numbyt>0; numbyt--)
{
*data_add++=rdbyt();
if(numbyt>0)
mack();
}
mnack();
IICstop();
}
復(fù)制代碼
所有資料51hei提供下載:
AT24C02.rar
(972 Bytes, 下載次數(shù): 37)
2018-10-2 20:45 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
路LGY
時(shí)間:
2020-5-17 11:17
想問一下最后兩個(gè)函數(shù)的參數(shù)該怎么寫呢
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1