4. 数码管静态显示

任务说明

本案例使用单片机(以STC89C52为例)驱动一位共阴极数码管,实现0~9数字的静态显示。核心目标是掌握数码管的段码表编写与位选控制方法。任务闭环为:编写段码表→通过P0口输出段码→通过位选引脚(P2.7)选通数码管→在开发板上观察数字变化。

硬件连接

STC89C52 P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.7 8×220Ω 共阴极数码管 a b c d e f g dp 8 a b c d e f g dp GND PNP 位选控制线(低电平选通) 段码:P0口输出 位选:P2.7 = 0 时选通

P0口通过限流电阻连接数码管的a~dp段引脚;P2.7作为位选控制端,经PNP三极管驱动公共端。当P2.7输出低电平时,三极管导通,数码管公共端接地(共阴极),此时P0口输出的段码即可点亮对应段。

代码实现

#include <reg52.h>

sbit LSA = P2^7;    // 位选控制引脚

// 共阴极数码管段码表:0~9
unsigned char code table[] = {
    0x3F,   // 0: 0b00111111
    0x06,   // 1: 0b00000110
    0x5B,   // 2: 0b01011011
    0x4F,   // 3: 0b01001111
    0x66,   // 4: 0b01100110
    0x6D,   // 5: 0b01101101
    0x7D,   // 6: 0b01111101
    0x07,   // 7: 0b00000111
    0x7F,   // 8: 0b01111111
    0x6F    // 9: 0b01101111
};

void delay(unsigned int t) {
    while (t--);
}

void main() {
    unsigned char i;
    LSA = 0;            // 位选选通(低电平有效)
    while (1) {
        for (i = 0; i < 10; i++) {
            P0 = table[i];   // 输出段码
            delay(60000);    // 延时约0.5秒
        }
    }
}

代码说明

段码表中每个字节的bit0~bit6分别对应a~g段,bit7对应dp段(本案例不使用)。例如数字0的段码0x3F,二进制为00111111,即a、b、c、d、e、f段点亮,g段熄灭,显示为“0”。主循环中依次将0~9的段码送入P0口,每次显示保持约0.5秒后切换下一个数字。

编译与烧录

  1. 使用Keil C51新建工程,芯片选择STC89C52,将上述代码保存为main.c并加入工程;
  2. 编译生成HEX文件(需在Options for Target → Output中勾选Create HEX File);
  3. 使用STC-ISP软件将HEX文件烧录到单片机。

验证方法

将单片机最小系统板与一位共阴极数码管按上述电路连接(注意公共端必须接GND,段引脚经220Ω电阻接P0口)。上电后观察数码管显示变化:应依次循环显示0、1、2、3、4、5、6、7、8、9,每个数字停留约0.5秒。若显示数字缺笔画或出现乱码,检查段码表与硬件接线是否一致;若完全不亮,检查位选引脚P2.7是否为低电平以及公共端接地是否正确。

判定标准

  • 数码管能按顺序稳定显示0~9,且每个数字的笔画完整无缺段;
  • 修改table[]中某个段码值后重新烧录,对应数字的显示随之改变,说明段码控制生效;
  • 将LSA = 0改为LSA = 1后重新烧录,数码管熄灭,说明位选控制生效。