4. 数码管静态显示
任务说明
本案例使用单片机(以STC89C52为例)驱动一位共阴极数码管,实现0~9数字的静态显示。核心目标是掌握数码管的段码表编写与位选控制方法。任务闭环为:编写段码表→通过P0口输出段码→通过位选引脚(P2.7)选通数码管→在开发板上观察数字变化。
硬件连接
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秒后切换下一个数字。
编译与烧录
- 使用Keil C51新建工程,芯片选择STC89C52,将上述代码保存为
main.c并加入工程; - 编译生成HEX文件(需在Options for Target → Output中勾选Create HEX File);
- 使用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后重新烧录,数码管熄灭,说明位选控制生效。