📄 24c02a.c
字号:
//送出去,返回来。点亮灯。
#include<reg51.h>
#define uchar unsigned char
sbit sda=P1^1; //i2c总线控制,传输线
sbit scl=P1^0; //时钟线
uchar k;
void delay()
{; ;} //延时较小,直接用
void start() //开始时序
{
sda=1; //数据线释放
delay();
scl=1; //时钟线高电平
delay();
sda=0; //数据线关上
delay();
}
void stop() // 停止程序
{
sda=0; //时钟高,数据上升
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons() //做出回应
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++; //两个条件一个满足退出,一是数据线释放,2是默认250的时间
scl=0;
delay();
}
void init() //初始化,sda,scl都为1
{
sda=1;
delay();
scl=1;
delay();
}
void write_byte(uchar date) //写数据进24C02
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++) //一位一位送,从高位开始
{
temp=temp<<1;
scl=0; //数据可以变化
delay();
sda=CY; //用CY来进行移位
delay();
scl=1; //高电平期间数据稳定
delay();
}
scl=0;
delay();
sda=1; //总线释放
delay();
}
uchar read_byte() // 从里面读数据
{
uchar i,k;
scl=0; //数据可以变化
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=((k<<1)|sda) ; //把sda中的数据放最低位中去,循环8次
scl=0;
delay();
}
return k;
}
void write_add(uchar address,uchar date) //写入指定地址
{
start();
write_byte(0xa0); //写指令
respons(); //回应
write_byte(address); //写地址
respons();
start();
write_byte(date); //往地址里面写数据
respons();
stop();
}
uchar read_add(uchar address) //从指定地址读数据
{ uchar date;
start();
write_byte(0xa0); //写的器件地址
respons();
write_byte(address); //写地址
respons();
start(); //这句不可少
write_byte(0xa1); //读的器件地址
respons();
date=read_byte();
stop();
return date;
}
void delay1(uchar x) //延时
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void main()
{
init();
write_add(23,0xf0); //在地址23中写一个0xf0的数据
delay1(100); //延时一会
P3=read_add(23); // 在23的地址中读出写进去的数
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -