#include<intrins.h>//程序虽然长,但是不是很复杂岩册简,关键在于理解IIC的工作机理
#define uchar unsigned char
#define uint unsigned int
#define DELAY5US _nop_()_nop_()_nop_()_nop_()_nop_()
sbit VSDA = P1^0
sbit VSCL = P1^1
sbit LED = P1^7
uchar SLAW
void STA() //发现:24C02C 是 256字节*8位的串行EEPROM存储器芯片,注意是ROM只读的
{ //但是这个例子将0-255这些数据写入到了ROM当中,怎么写的,是烧进去的,
VSDA = 1 //这个不是很理解啊
VSCL = 1
DELAY5US
VSDA = 0
DELAY5US
VSCL = 0
}
void STOP()
{
VSDA = 0
VSCL = 1
DELAY5US
VSDA = 1
VSCL = 1
DELAY5US
}
void MACK()
{
VSDA = 0
VSCL = 1
DELAY5US
VSCL = 0
}
void MNACK()
{
VSDA = 1
VSCL = 1
DELAY5US
VSCL = 0
}
void CACK()
{
VSDA = 1
VSCL = 1
F0 = 0
if ( 1 == VSDA )
{
F0 = 1
}
VSCL = 0
}
void WRBYTE(uchar idata *p)
{
uchar idata n = 8, temp
temp = *p
while(n--)
{
if ( 0x80 == (temp&0x80) )
{
VSDA = 1
VSCL = 1
DELAY5US
VSCL = 0
}
else
{
VSDA = 0
VSCL = 1
DELAY5US
VSCL = 0
}
temp = temp<<1
}
}
void RDBYTE(uchar idata *p)
{
uchar idata n = 8, temp = 0
while(n--)
{
VSDA = 1
VSCL = 1
temp = temp<<1
if ( 1 == VSDA )
temp = temp|0x01
else
temp = temp&0xfe
VSCL = 0
}
*p = temp
}
void delayMoreThan5ms()
{
uint i
for ( i = 0i <1000i++ )
{
DELAY5US
}
}
int main()
{
uchar ch, *p
uint i
SLAW = 0xA2//0xA0是slave write地址字节(写),A是1010是器件地址,由厂家决定
for ( i = 0i <= 255i++ ) //1010(A)是24C02C所属系列的器件地址
{ //0000是自己决定的,前3个0由24C02C芯片的A0A1A2决定
STA() //最后一个0是写的意思,1则为读
p = &SLAW //4个(器件地址),3个(引脚地址),一个(读写选择位)。
WRBYTE(p) //应答信号是关键啊
CACK() //发送对应写, 接收对应读
if ( 1 == F0 )
{
LED = 0
while(1)
}
ch = i
p = &ch
WRBYTE(p)
CACK()
if ( 1 == F0 )
{
LED = 0
while(1)
}
WRBYTE(p)
CACK()
STOP()
delayMoreThan5ms()
}
while(1)
return 0
}
你确定你外部电路没有接错么?24c02只有256字节,所以轿芦辩不需要用到高8位地址;只要000h-0ffh就可以直接访问,闭缺24c04就需要用P2连接高8位地址,不然是无法正常访问0ffh以上的地址的哗仿。存在存储器慎派里面 , 是一个8脚的集成块 ,现在宽陵贺的彩电常用型号有:24C02、24C04、24C08、24C16、24C32等等。要用专门的编写程序器才能写入,有两汪帆种:一种把集成块插入编写器后直接写入,另一种需要通过USB接口连接电脑写入。一般卖元器件的店子就有卖,还有说明书。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)