AT89C52单片机EEPROM保存三位数码管为528
时间: 2024-02-26 07:56:58 浏览: 75
好的,以下是一份基于C语言的代码示例,实现了您所要求的功能:
```c
#include <reg52.h>
// 定义三个IO口分别控制三位数码管的显示
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
// 定义一个变量用于保存当前显示的数字
unsigned char num = 0x28;
// 定义一个函数用于将数字转换为对应的数码管码
unsigned char num_to_led(unsigned char num) {
switch(num) {
case 0: return 0xC0;
case 1: return 0xF9;
case 2: return 0xA4;
case 3: return 0xB0;
case 4: return 0x99;
case 5: return 0x92;
case 6: return 0x82;
case 7: return 0xF8;
case 8: return 0x80;
case 9: return 0x90;
default: return 0xFF;
}
}
// 定义一个函数用于将数码管码输出到对应的IO口控制数码管的显示
void led_display(unsigned char num1, unsigned char num2, unsigned char num3) {
LED1 = num1;
LED2 = num2;
LED3 = num3;
}
// 定义一个函数用于从EEPROM中读取数据
unsigned char read_eeprom(unsigned char addr) {
unsigned char dat;
IAP_CONTR = 0x81;
IAP_ADDRH = 0x00;
IAP_ADDRL = addr;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
dat = IAP_DATA;
IAP_CONTR = 0x00;
return dat;
}
// 定义一个函数用于向EEPROM中写入数据
void write_eeprom(unsigned char addr, unsigned char dat) {
IAP_CONTR = 0x81;
IAP_ADDRH = 0x00;
IAP_ADDRL = addr;
IAP_DATA = dat;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
IAP_CONTR = 0x00;
}
// 主函数
void main() {
// 初始化EEPROM中的数据为528
write_eeprom(0, 0x28);
// 从EEPROM中读取数据,更新当前显示的数字
num = read_eeprom(0);
led_display(num_to_led(num/10), num_to_led(num%10), num_to_led(8));
while(1) {
// 每隔1秒钟从EEPROM中读取数据并更新显示
for(unsigned int i = 0; i < 50000; i++);
num = read_eeprom(0);
led_display(num_to_led(num/10), num_to_led(num%10), num_to_led(8));
}
}
```
上述代码通过定义三个IO口分别控制三位数码管的显示,以及EEPROM读写函数,实现了从EEPROM中读取数据并更新显示的功能。同时,在程序初始化时,将数据0x28保存到EEPROM中,以保证下次开机时能够正确地读取并显示数据。
阅读全文