使用的STC8G1K08单片机,使 共阳极的一位数码管循环显示1-8的程序,将数码管的a-g段连接到P1.0-P1.6,单片机的p54,p55两个引脚各接一个开关,当p54按下时,数码管显示数字,此时按下p55时,数字累加,按一下加1 ,到数字8时,自动变成1。p54抬起时,数码管不显示,p55不起作用。代码已经符合要求的运行了,想再加一条,如何把数码管显示的数字存到单片机的EEPROM中,按下P54时,先读取EEPROM的数值在数码管中显示。
#include <STC8G.H>
#include <intrins.h>
// 数码管段码定义 (共阳极)
unsigned char code segmentCodes[] = {
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90 // 9
};
unsigned char currentNum = 1; // 当前显示的数字
bit keyPressed = 0; // 按键防抖标志
void delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = ms; i > 0; i--)
for (j = 1100; j > 0; j--);
}
void displayNumber(unsigned char num) {
if (num >= 1 && num <= 8) {
P1 = segmentCodes[num] & 0x7F; // P1.0-P1.6对应a-g段,屏蔽最高位
}
}
void checkKeys() {
// 检测P54按键状态(显示控制)
if (P54 == 0) {
// 当P54按下时,显示当前数字
displayNumber(currentNum);
// 检测P55按键(数字累加)
if (P55 == 0) {
if (!keyPressed) {
keyPressed = 1;
currentNum++;
if (currentNum > 8) {
currentNum = 1;
}
displayNumber(currentNum);
delay_ms(20); // 防抖延时
}
} else {
keyPressed = 0;
}
} else {
// 当P54抬起时,关闭数码管显示
P1 = 0xFF;
}
}
void main() {
// 初始化IO口
P1M0 = 0x00; // P1设置为准双向口
P1M1 = 0x00;
P5M0 = 0x00; // P5设置为准双向口
P5M1 = 0x00;
P1 = 0xFF; // 初始关闭数码管
while (1) {
checkKeys();
delay_ms(10); // 主循环延时
}
}