单片机数码管显示计数器代码优化:减少闪烁
单片机数码管显示计数器代码优化:减少闪烁
以下代码使用单片机控制数码管显示计数器,通过添加延时,在数码管刷新时降低了刷新速度,以减少闪烁。另外,代码开始时将数码管的所有段选IO口置高电平,以避免初始化时的闪烁现象。
#include <reg52.h>
// 定义数码管连接的IO口
sbit digit1 = P0^0;
sbit digit2 = P0^1;
sbit digit3 = P0^2;
sbit digit4 = P0^3;
// 定义数码管段选连接的IO口
sbit segA = P1^0;
sbit segB = P1^1;
sbit segC = P1^2;
sbit segD = P1^3;
sbit segE = P1^4;
sbit segF = P1^5;
sbit segG = P1^6;
sbit segDP = P1^7;
// 定义按键连接的IO口
sbit keyPlus = P2^0;
sbit keyMinus = P2^1;
// 数码管段选码表
unsigned char code segTable[] = {
0xC0, // '0'
0xF9, // '1'
0xA4, // '2'
0xB0, // '3'
0x99, // '4'
0x92, // '5'
0x82, // '6'
0xF8, // '7'
0x80, // '8'
0x90 // '9'
};
unsigned char count = 0; // 计数值
// 数码管刷新函数
void display(unsigned char num) {
unsigned char digit;
digit1 = 1;
digit2 = 1;
digit3 = 1;
digit4 = 1;
// 获取个位数
digit = num % 10;
P2 = segTable[digit];
digit1 = 0;
delay(1); // 降低刷新速度以减少闪烁
// 获取十位数
digit = num / 10 % 10;
P2 = segTable[digit];
digit2 = 0;
delay(1);
// 获取百位数
digit = num / 100 % 10;
P2 = segTable[digit];
digit3 = 0;
delay(1);
// 获取千位数
digit = num / 1000 % 10;
P2 = segTable[digit];
digit4 = 0;
delay(1);
}
// 延时函数
void delay(unsigned int time) {
unsigned int i, j;
for(i = 0; i < time; i++)
for(j = 0; j < 125; j++);
}
void main() {
digit1 = 1;
digit2 = 1;
digit3 = 1;
digit4 = 1;
while(1) {
// 按下1号键
if(keyPlus == 0) {
delay(10); // 延时一小段时间,用于消除按键抖动
if(keyPlus == 0) {
while(keyPlus == 0); // 等待按键释放
if(count < 9) {
count++;
display(count);
}
}
}
// 按下2号键
if(keyMinus == 0) {
delay(10);
if(keyMinus == 0) {
while(keyMinus == 0);
if(count > 0) {
count--;
display(count);
}
}
}
}
}
代码说明:
#include <reg52.h>包含头文件,定义了一些常用的寄存器和宏定义。sbit定义位变量,用于控制数码管的段选和按键的连接。segTable数组存储了每个数字对应的段选码。display()函数用于刷新数码管显示。delay()函数用于产生延时,降低数码管的刷新速度。main()函数中,程序进入一个死循环,不断检测按键状态,并根据按键状态更新计数器,并将计数器值显示在数码管上。
代码优化:
- 在
display()函数中,每个数字的显示之间加入了delay(1),降低了刷新速度,减少了闪烁。 - 在
main()函数中,按键检测代码中加入了delay(10),用于消除按键抖动。 - 在
main()函数开始处,将所有段选IO口置高电平,避免初始化时出现的闪烁现象。
通过这些优化,可以有效减少数码管显示过程中的闪烁现象,使显示更加稳定清晰。
原文地址: https://www.cveoy.top/t/topic/bOOL 著作权归作者所有。请勿转载和采集!