📄 file15.c
字号:
/*
这里是at24cxx读写c语言代码,本例子实现了将一组数据写入at24cxx芯片,
并读出来用数码管的小数点加以显示读出来的数据的二进制表示。
比如,数码管最后一个显示的是'm'的二进制(6DH)的结果。
*/
#include <8051.h>
#define uchar unsigned char
#define uint unsigned int
#define AddWr 0xa0 /*器件地址选择及写标志*/
#define AddRd 0xa1 /*器件地址选择及读标志*/
#define segdata P0 //数据 输出
#define sege P2_7 //显示 选中
#define segb P2_6 //位 选
#define segd P2_5 //段 选
/*有关全局变量*/
#define Sda P2_3 /*串行数据*/
#define Scl P2_4/*串行时钟*/
#define WP P2_5/*硬件写保护*/
void i2c_delay(void);
void mDelay(uint j);
void Start(void);
void Stop(void);
void Ack(void);
void NoAck(void);
void Send(uchar Data) ;
uchar Read(void);
void writeROM(uchar Data[],uchar Address,uchar Num);
void readROM(uchar Data[],uchar Address,uchar Num);
void main()
{
uchar code Number[]={'h','e','j','o','i','n','.','c','o','m',1,2,3,4};
uchar f;
uchar buf[10];
P3_7 = 0;
P0 = 0;
P2=255;
P1=255;
WP= 1;
writeROM(Number,0,10); /*将初始化后的数值写入EEPROM*/
mDelay(20);
readROM(buf,0,10);
mDelay(20);
sege = 0;
for(f=0;f<10;f++)
{
segdata = buf[f];
segd = 1;
segd = 0;
segdata = 1;
segb = 1;
segb = 0;
mDelay(5535);
}
while(1){};
}
// 下面是at24cxx的读写程序
void i2c_delay(void)
{
uchar i;
for(i=1;i<255;i++){}
}
void mDelay(uint j)
{
uchar i;
for(;j>0;j--)
{
for(i=0;i<255;i--)
{;}
}
}
/*发送起始条件*/
void Start(void) /*起始条件*/
{
Sda=1;
Scl=1;
i2c_delay();
Sda=0;
i2c_delay();
}
void Stop(void) /*停止条件*/
{
Sda=0;
Scl=1;
i2c_delay();
Sda=1;
i2c_delay();
}
void Ack(void) /*应答位*/
{
Sda=0;
i2c_delay();
Scl=1;
i2c_delay();
Scl=0;
}
void NoAck(void) /*反向应答位*/
{
Sda=1;
i2c_delay();
Scl=1;
i2c_delay();
Scl=0;
}
void Send(uchar Data) /*发送数据子程序,Data为要求发送的数据*/
{
uchar BitCounter=8; /*位数控制*/
uchar temp; /*中间变量控制*/
do
{
temp=Data;
Scl=0;
i2c_delay();
if((temp&0x80)==0x80)/* 如果最高位是1*/
Sda=1;
else Sda=0;
Scl=1;
temp=Data<<1; /*RLC*/
Data=temp;
BitCounter--;
}while(BitCounter);
Scl=0;
}
uchar Read(void) /*读一个字节的数据,并返回该字节值*/
{
uchar temp=0;
uchar temp1=0;
uchar BitCounter=8;
Sda=1;
do{
Scl=0;
i2c_delay();
Scl=1;
i2c_delay();
if(Sda) /*如果Sda=1;*/
temp=temp|0x01; /*temp的最低位置1*/
else temp=temp&0xfe; /*否则temp的最低位清0*/
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}while(BitCounter);
return(temp);
}
void writeROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start(); /*发送启动信号*/
Send(0xa0); /*发送SLA+W*/
Ack();
Send(Address+i); /*发送地址*/
Ack();
Send(*(PData+i));
Ack();
Stop();
mDelay(20);
}
}
void readROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Start();
Send(0xa1);
Ack();
*(PData+i)=Read();
Scl=0;
NoAck();
Stop();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -