📄 子函数化实现特定地址写读数据.c
字号:
/*先将数据0x01通过IIC写入到AT24C02中,
再将其从AT24C02中读出来付给P1口,期间
需要编写延时、写数据、读数据、应答、起始、
结束这几个子函数*/
#include<reg52.h>
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
uchar a;
void delay1()//短延时,用于读写操作模块内的延时。
{ ; ; }
void delay2(uchar z)//长延时用于读写模块间的延时。
{
uchar x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void start()//根据时序图,在scl=1期间,sda有一个负跳变
{
sda=1;
delay1();
scl=1;
delay1();
sda=0;
delay1();
}
void response()//应答信号,在第九个数据后scl=1期间sda为0时即为应答。
{
uchar i;
scl=1;
delay1();
while((sda==1)&&(i<250))i++;//这条的含义是:在scl=1期间sda=0即有应答了退出执行那个下面的程序,或者是老没有应答,但是经过一点时间后认为受到了(用i控制)也就算有了应答了。
scl=0;
delay1();
}
void initial()
{
sda=1;
scl=1;
}
void write_byte(uchar dat)
{
uchar i,j;
j=dat;
for(i=0;i<8;i++)
{
j=j<<1;//将dat值左移一位,最高为进入PSW的CY位。
scl=0;
delay1();
sda=CY;
delay1();
scl=1;//写入一位数据
delay1();
// scl=0;
// delay1();
}
scl=0;
delay1();
sda=1;//释放总线,以读取应答信号
delay1();
}
uchar read_byte()
{
uchar i,j,k;
scl=0;
delay1();
sda=1;
delay1();
for(i=0;i<8;i++)
{
scl=1;
delay1();
j=sda;//将总线的一位数据给j
k=(k<<1)|j;
delay1();
scl=0;
delay1();
}
return k;
}
void stop()
{
sda=0;
delay1();
scl=1;
delay1();
sda=1;
delay1();
}
void write_add(uchar adds,uchar date)
{
start();
write_byte(0xa0);//写器件地址,高四位1010,第四位全0.
response();
write_byte(adds);//写器件内部数据地址
response();
write_byte(date);
response();
stop();
}
uchar read_add(uchar adds1)
{
start();
write_byte(0xa0);//写器件地址,高四位1010,第四位全0.
response();
write_byte(adds1);//写器件内部数据地址
response();
start();
write_byte(0xa1);
response();
a=read_byte();
stop();
return a;
}
void main()
{
initial();
write_add(23,0xaa);
delay2(100);
P1=read_add(23);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -