用at89c51单片机在lcd1602上以十进制显示at24c02中的0x10,0x11两个单元的数值代码
时间: 2024-05-03 15:21:56 浏览: 79
以下是使用AT89C51单片机在LCD1602上以十进制显示AT24C02中0x10和0x11两个单元的数值代码:
```
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P2^0; //定义SDA引脚
sbit SCL=P2^1; //定义SCL引脚
void delay(uint x) // 延时函数
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void start() //开始信号
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
}
void stop() //结束信号
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
}
void send_byte(uchar dat) //发送一个字节
{
uchar i,temp;
temp=dat;
for(i=0;i<8;i++)
{
temp=temp<<1;
SDA=CY;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
}
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
temp=SDA;
SCL=0;
_nop_();
_nop_();
}
uchar read_byte() //读取一个字节
{
uchar i,dat;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
_nop_();
_nop_();
_nop_();
dat=(dat<<1)|SDA;
SCL=0;
_nop_();
_nop_();
_nop_();
}
return dat;
}
void write_24c02(uchar addr,uchar dat) //写入数据到24c02
{
start();
send_byte(0xa0);
send_byte(addr);
send_byte(dat);
stop();
}
uchar read_24c02(uchar addr) //从24c02读取数据
{
uchar dat;
start();
send_byte(0xa0);
send_byte(addr);
start();
send_byte(0xa1);
dat=read_byte();
stop();
return dat;
}
void init_lcd1602() //初始化LCD1602
{
send_byte(0x38);
send_byte(0x0c);
send_byte(0x06);
send_byte(0x01);
}
void write_lcd1602(uchar x,uchar y,uchar dat) //向LCD1602写入数据
{
uchar addr;
if(y==0)
addr=0x80+x;
else
addr=0xc0+x;
send_byte(addr);
send_byte(dat);
}
void main()
{
uchar a,b;
init_lcd1602();
a=read_24c02(0x10); //读取0x10单元的数据
b=read_24c02(0x11); //读取0x11单元的数据
write_lcd1602(0,0,a/100+0x30); //显示百位
write_lcd1602(1,0,(a%100)/10+0x30); //显示十位
write_lcd1602(2,0,a%10+0x30); //显示个位
write_lcd1602(4,0,b/100+0x30); //显示百位
write_lcd1602(5,0,(b%100)/10+0x30); //显示十位
write_lcd1602(6,0,b%10+0x30); //显示个位
while(1);
}
```
阅读全文