AT89C52单片机EEPROM保存三位数码管为528并可用独立按键控制数字更改和保存代码
时间: 2024-02-26 10:56:53 浏览: 142
51单片机STC89C52RC开发板例程之AT24C02(EEPROM)保存计时数程序源代码.rar
好的,以下是一份基于C语言的代码示例,实现了您所要求的功能:
```c
#include <reg52.h>
// 定义三个IO口分别控制三位数码管的显示
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
// 定义两个IO口分别连接独立按键,用于数字更改和保存操作
sbit KEY1 = P1^0;
sbit KEY2 = P1^1;
// 定义一个变量用于保存当前显示的数字
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);
// 循环检测独立按键状态,实现数字更改和保存操作
while(1) {
// 检测KEY1按键是否按下,如果按下则将num加1
if(KEY1 == 0) {
num++;
if(num > 99) {
num = 0;
}
led_display(num_to_led(num/10), num_to_led(num%10), num_to_led(8));
while(KEY1 == 0);
}
// 检测KEY2按键是否按下,如果按下则将当前数字保存到EEPROM中
if(KEY2 == 0) {
write_eeprom(0, num);
while(KEY2 == 0);
}
// 从EEPROM中读取数据,更新当前显示的数字
num = read_eeprom(0);
led_display(num_to_led(num/10), num_to_led(num%10), num_to_led(8));
}
}
```
上述代码通过定义三个IO口分别控制三位数码管的显示,以及两个IO口分别连接独立按键,实现了数字更改和保存操作。同时,通过调用EEPROM的读写函数,实现了将当前数字保存到EEPROM中,并在下次开机时从EEPROM中读取数据并更新显示的功能。
阅读全文