单片机数码管显示计数器代码优化:减少闪烁

以下代码使用单片机控制数码管显示计数器,通过添加延时,在数码管刷新时降低了刷新速度,以减少闪烁。另外,代码开始时将数码管的所有段选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);
                }
            }
        }
    }
}

代码说明:

  1. #include <reg52.h> 包含头文件,定义了一些常用的寄存器和宏定义。
  2. sbit 定义位变量,用于控制数码管的段选和按键的连接。
  3. segTable 数组存储了每个数字对应的段选码。
  4. display() 函数用于刷新数码管显示。
  5. delay() 函数用于产生延时,降低数码管的刷新速度。
  6. main() 函数中,程序进入一个死循环,不断检测按键状态,并根据按键状态更新计数器,并将计数器值显示在数码管上。

代码优化:

  1. display() 函数中,每个数字的显示之间加入了 delay(1),降低了刷新速度,减少了闪烁。
  2. main() 函数中,按键检测代码中加入了 delay(10),用于消除按键抖动。
  3. main() 函数开始处,将所有段选IO口置高电平,避免初始化时出现的闪烁现象。

通过这些优化,可以有效减少数码管显示过程中的闪烁现象,使显示更加稳定清晰。

单片机数码管显示计数器代码优化:减少闪烁

原文地址: https://www.cveoy.top/t/topic/bOOL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录