AT89C52单片机EEPROM存储和控制三位数码管显示数字代码
时间: 2024-02-26 07:58:05 浏览: 80
好的,以下是AT89C52单片机EEPROM存储和控制三位数码管显示数字的代码:
```
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit D1 = P1^0;
sbit D2 = P1^1;
sbit D3 = P1^2;
uchar code num[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 数码管显示0-9的编码
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void write_eeprom(uchar add,uchar dat)
{
IAP_CONTR = 0x81; // 开启EEPROM写操作
IAP_ADDRH = 0x00; // 设置地址高位为0
IAP_ADDRL = add; // 设置地址低位
IAP_DATA = dat; // 设置写入的数据
IAP_TRIG = 0x46; // 执行EEPROM写操作
IAP_CONTR = 0x00; // 关闭EEPROM写操作
}
uchar read_eeprom(uchar add)
{
uchar dat;
IAP_CONTR = 0x01; // 开启EEPROM读操作
IAP_ADDRH = 0x00; // 设置地址高位为0
IAP_ADDRL = add; // 设置地址低位
IAP_TRIG = 0x46; // 执行EEPROM读操作
dat = IAP_DATA; // 读取EEPROM中的数据
IAP_CONTR = 0x00; // 关闭EEPROM读操作
return dat;
}
void display(uchar d1, uchar d2, uchar d3)
{
D1 = 0; // 选择第一个数码管
P0 = num[d1]; // 显示第一个数码管的数字
delay(5); // 稍微延时一下
D1 = 1; // 取消选中第一个数码管
D2 = 0; // 选择第二个数码管
P0 = num[d2]; // 显示第二个数码管的数字
delay(5); // 稍微延时一下
D2 = 1; // 取消选中第二个数码管
D3 = 0; // 选择第三个数码管
P0 = num[d3]; // 显示第三个数码管的数字
delay(5); // 稍微延时一下
D3 = 1; // 取消选中第三个数码管
}
void main()
{
uchar d1=0,d2=0,d3=0;
uchar dat1,dat2,dat3;
dat1 = read_eeprom(0x00); // 从EEPROM中读取第一个数码管的数字
dat2 = read_eeprom(0x01); // 从EEPROM中读取第二个数码管的数字
dat3 = read_eeprom(0x02); // 从EEPROM中读取第三个数码管的数字
while(1)
{
display(dat1,dat2,dat3); // 显示EEPROM中存储的数字
delay(500); // 延时一下
d3++; // 第三个数码管的数字加1
if(d3 >= 10)
{
d3 = 0;
d2++; // 第二个数码管的数字加1
if(d2 >= 10)
{
d2 = 0;
d1++; // 第一个数码管的数字加1
if(d1 >= 10)
{
d1 = 0;
}
}
}
write_eeprom(0x00,d1); // 将第一个数码管的数字写入EEPROM
write_eeprom(0x01,d2); // 将第二个数码管的数字写入EEPROM
write_eeprom(0x02,d3); // 将第三个数码管的数字写入EEPROM
dat1 = read_eeprom(0x00); // 从EEPROM中读取第一个数码管的数字
dat2 = read_eeprom(0x01); // 从EEPROM中读取第二个数码管的数字
dat3 = read_eeprom(0x02); // 从EEPROM中读取第三个数码管的数字
}
}
```
这段代码可以将三个数码管依次显示0-9,然后循环显示,并将每一个数码管的数字存储在EEPROM中,以便下次开机时可以恢复上次显示的数字。
阅读全文