//=-----------------------------------------------------------------------------
--
/*模块调用:
读数据:read(unsigned int address)
写数据:write(unsigned int address,unsigned char dd) dd为要写的 数据字节*/
//------------------------------------------------------------------------------
----
sbit sda=P3^0
sbit scl=P3^1
sbit a0=ACC^0 //定义ACC的位,利用ACC *** 作
速度最快
sbit a1=ACC^1
sbit a2=ACC^2
sbit a3=ACC^3
sbit a4=ACC^4
sbit a5=ACC^5
sbit a6=ACC^6
sbit a7=ACC^7
//------------------------------------------------------------------------------
--------
#pragma disable
void s24(void) //起始函数
{
_nop_()
scl=0
sda=1
scl=1
_nop_()
sda=0
_nop_()
_nop_()
scl=0
_nop_()
_nop_()
sda=1
}
//------------------------------------------------------------------------------
-------
#pragma disable
void p24(void) //停止函数
{
sda=0
scl=1
_nop_()
_nop_()
sda=1
}
//------------------------------------------------------------------------------
------
#pragma disable
unsigned char rd24(void) /////////////////从24c16读一字节数据
{ ACC=0x00
sda=1
scl=1a7=sda_nop_()_nop_()_nop_()_nop_()scl=0
scl=1a6=sda_nop_()_nop_()_nop_()_nop_()scl=0
scl=1a5=sda_nop_()_nop_()_nop_()_nop_()scl=0
scl=1a4=sda_nop_()_nop_()_nop_()_nop_()scl=0
scl=1a3=sda_nop_()_nop_()_nop_()_nop_()scl=0
scl=1a2=sda_nop_()_nop_()_nop_()_nop_()scl=0
scl=1a1=sda_nop_()_nop_()_nop_()_nop_()scl=0
scl=1a0=sda_nop_()_nop_()_nop_()_nop_()scl=0
sda=1scl=1_nop_()_nop_()_nop_()_nop_
()scl=0/// ///////////////24c16的一位回答位。
return(ACC)
}
//------------------------------------------------------------------------------
----
#pragma disable
void wd24(unsigned char dd) ////////////////向24c16写一字节数据
{ sda=1
ACC=dd
sda=a7scl=1_nop_()_nop_()_nop_()_nop_()scl=0
sda=a6scl=1_nop_()_nop_()_nop_()_nop_()scl=0
sda=a5scl=1_nop_()_nop_()_nop_()_nop_()scl=0
sda=a4scl=1_nop_()_nop_()_nop_()_nop_()scl=0
sda=a3scl=1_nop_()_nop_()_nop_()_nop_()scl=0
sda=a2scl=1_nop_()_nop_()_nop_()_nop_()scl=0
sda=a1scl=1_nop_()_nop_()_nop_()_nop_()scl=0
sda=a0scl=1_nop_()_nop_()_nop_()_nop_()scl=0
sda=0scl=1//scl=0(在下面程序中)
}
//---------------------------------------------------------------------------
#pragma disable
unsigned char read(unsigned int address)
{
unsigned char dd
s24() ////////////////////////开始条件
wd24(0xa0) /////////////////////////写器件地址(写命令)
_nop_()_nop_()_nop_()_nop_()
scl=0 ///////////////////////////////////接收器件地
址确认信号
wd24(address) //////////////////////////// 写数据地址
_nop_()_nop_()_nop_()_nop_()
scl=0
s24
()///////////////////////////////////开始条件
wd24(0xa1)/////////////////////////////写器件地址(读命
令)
scl=0
dd=rd24() //////////////////////////////////读 一字节
p24() ////////////////////////////////////停止条件
return(dd)
}
//------------------------------------------------------------------------------
--
#pragma disable
void write(unsigned int address,unsigned char dd)
{
s24() /////////////////开始条件
wd24(0xa0) ////////////////////////写器件地址;
scl=0
wd24(address) /////////////////////写数据地址
scl=0
wd24(dd) //////////////////////////写dd数据
scl=0
p24() /////////////////////////停止条件;
}
// ************************************************************// I2存储器函数区
//
// ============================================================
// SPROM脉冲延时
//
void Sdelay(void)
{
unsigned char n
for(n=4n>0n--)
return
}
// ============================================================
// SPROM开始位
//
void s24XX(void)
{
SDA24XX=1SCK24XX=1
Sdelay()
SDA24XX=0// Tsu:start=4.7uS
Sdelay()
SCK24XX=0// Thd:start=4uS
return
}
// ============================================================
// SPROM停止位
//
void p24XX(void)
{
SDA24XX=0
Sdelay()SCK24XX=1
Sdelay()SDA24XX=1// Tsu:stop=4uS
return
}
// ============================================================
// 写数据到SPROM数据线
// 返回:ACK状态
bit w24XX(unsigned char c)
{
ACC=c
for(c=8c>0c--)
{
SDA24XX=0x80 &ACC// 数据高位送SDA针并左移一位
SCK24XX=1_nop_() // Clock high time
SCK24XX=0
_nop_()
}
SDA24XX=1
_nop_()
SCK24XX=1CY=SDA24XX
_nop_()
SCK24XX=0
Sdelay()
return(CY)
}
// ============================================================
// SPROM字节读
// 参数:地址a
unsigned char rb24XX(unsigned char a)
{
s24XX()
w24XX(0xa0)w24XX(a)
s24XX()w24XX(0xa1)
SDA24XX=1
ACC=0 // 利用ACC返回数据
for(a=0a<8a++) // 使用a变量兼作循环变量
{
SCK24XX=1
ACC+=ACCif(SDA24XX)ACC++// 读相应位
SCK24XX=0
Sdelay()
}
p24XX()
return(ACC)
}
// ============================================================
// SPROM字节写
// 参数: 地址a, 数据d
// 返回: 1表示写失败
bit wb24XX(unsigned char a, unsigned char d)
{
s24XX()
w24XX(0xa0) // 控制字
w24XX(a) // 地址
w24XX(d)p24XX() // 数据
for(a=255a>0a--)
{
s24XX()
if(w24XX(0xa0)==0)break
WDT()
}
p24XX()
return(CY)
}
// SPROM¿ªÊ¼Î»
//
void s24XX(void)
{
SDA24XX=1SCK24XX=1
Sdelay()
SDA24XX=0// Tsu:start=4.7uS
Sdelay()
SCK24XX=0// Thd:start=4uS
return
}
1) 你的写函数,调用时地址是 23 不是 0x232) 你的读函数,调用时地址是 0,不是 0x23 , 你写的位置同你读的位置是不同的。
上面两个是比较大的问题。
3)连续读,每读一个字节后要加一个ACK,就是第9个CLK,DAT拉低,就像你写时 每写一个字节调用一次 respons() 读时也要,不过相反。写时是读DAT为低, 读时是89C52把 DAT拉低。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)