4. 数码管静态显示

任务目标

驱动一位共阴极数码管,循环显示数字0~9。通过本案例掌握数码管段码表的推导方法,理解静态显示(锁存输出)与动态扫描的区别。

硬件连接与原理

一位共阴极数码管有8个段引脚(a~g、dp)和1个公共阴极。将段引脚通过限流电阻(220Ω)连接到单片机P0口(需上拉电阻)或P2口,公共阴极接地。本例使用P0口,段码表中对应位为1时该段点亮。

段码表推导

共阴极数码管段码 = 该数字点亮段的二进制值,按 dp g f e d c b a 顺序排列(P0.7~P0.0)。例如数字“0”点亮a、b、c、d、e、f,熄灭g和dp,二进制为 0011 1111 = 0x3F。

完整代码(C语言,Keil/STC)

#include <reg51.h>

// 共阴极数码管段码表:0~9
unsigned char code segCode[10] = {
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

void delay(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 120; j++);
}

void main() {
    unsigned char i;
    while (1) {
        for (i = 0; i < 10; i++) {
            P0 = segCode[i];  // 输出段码,静态显示
            delay(500);       // 保持500ms
        }
    }
}

编译与烧录

  1. 使用Keil uVision创建工程,选择对应单片机型号(如AT89C52或STC89C52)。
  2. 将上述代码保存为 main.c 并添加到工程。
  3. 编译生成HEX文件(需在Options for Target → Output中勾选Create HEX File)。
  4. 使用STC-ISP或USB转TTL烧录器将HEX文件下载到单片机。

验证方法

上电后观察数码管:应依次显示0、1、2、3、4、5、6、7、8、9,每个数字停留约0.5秒,然后循环。若显示数字缺笔画或乱码,检查段码表与硬件接线是否一致(尤其确认是共阴极而非共阳极)。

常见问题

  • 数码管不亮:检查公共阴极是否接地,P0口是否加上拉电阻(10kΩ排阻)。
  • 显示数字错误:确认段码表位序与硬件接线对应关系,可先单独点亮某一段验证。
  • 亮度偏低:P0口驱动能力有限,可改用P2口或增加三极管驱动。

静态显示原理说明

静态显示指每个数码管的段码由单片机持续输出,直到更新新数据。本案例只有一位数码管,无需锁存器或扫描,代码直接对P0口赋值即可保持显示。若多位数码管使用静态显示,每个数码管需独立I/O口或锁存芯片(如74HC573),硬件成本较高,因此多位显示通常采用动态扫描。

一位共阴极数码管与P0口连接示意 STC89C52 P0.0~P0.7 P0.0(a) P0.1(b) P0.2(c) P0.3(d) P0.4(e) P0.5(f) P0.6(g) P0.7(dp) 共阴极数码管 a b c d e f g dp 公共阴极 → GND 220Ω×8