📄 led.c
字号:
#include<reg52.h>
#define char unsigned char
sbit sda=P3^3;
sbit scl=P3^2;
char a;
void delay2402()
{ ;; }
void start() //开始信号
{
sda=1;
delay2402();
scl=1;
delay2402();
sda=0;
delay2402();
}
void stop() //停止 信号
{
sda=0;
delay2402();
scl=1;
delay2402();
sda=1;
delay2402();
}
void respons() //应答
{
char i;
scl=1;
delay2402();
while((sda==1)&&(i<250))i++; //一定时间不应答就默认2402收到了
scl=0; //第九个时钟结束
delay2402();
}
void init() //总线初始化
{
sda=1; //释放总线
delay2402();
scl=1;
delay2402();
}
void write_byte(char date) //写一字节
{
char i,temp;
temp=date; //data内放的为实参
for(i=0;i<8;i++)
{
temp=temp<<1; //从高位到地位读取先把最高位移入CY最后补零,移8次
scl=0; //拉低,只有时钟为低电平sda才允许改变
delay2402();
sda=CY; //把每次移动的CY位移入sda
delay2402();
scl=1; //拉高,只有时钟为高电平才能被读或写
delay2402();
// scl=0;
// delay2402();
}
scl=0; //释放总线,读取应答信号(因为应答信号为低电平)
delay2402();
sda=1; //应答
delay2402();
}
char read_byte() //读一个字节
{
char i,k;
scl=0; //拉低,只有低电平才允许改变
delay2402();
sda=1;
delay2402();
for(i=0;i<8;i++)
{
scl=1; //为一时才允许读
delay2402();
k=(k<<1)|sda; //k左移一位最低位补零,最低位再和sda相或既把一位sda数据赋给k,左移8次就送完一个字节
scl=0; //一个时钟读(或写)一位数据,读或写都要按时序
delay2402();
}
return k;
}
void delay24021(char x)
{
char a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void write_add(char address,char date)
{
start();
write_byte(0xa0);//1010 000 0(1010为4位固定地址000为器件地址0为写命令)
respons(); //应答
write_byte(address); //写地址(2402的地址)
respons(); //应答
write_byte(date); //写数据
respons(); //应答
stop(); //停
}
char read_add(char address)
{
char date;
start();
write_byte(0xa0); //1010 000 0(1010为4位固定地址000为器件地址0为写命令)
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
void main()
{
init();
write_add(23,0xff);
delay24021(100);
P0=read_add(23);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -