第五章 驱动静态数码管显示
1. 导入
在掌握了LED与蜂鸣器的控制后,本章将引入一种更复杂的输出设备------数码管。数码管能够显示数字和部分字符,广泛应用于电子钟、计数器、仪表等场合。
本章聚焦于静态数码管显示,即每个数码管的段选线独立控制,不采用动态扫描方式。通过本章学习,你将掌握:
- 数码管的结构与工作原理;
- 共阴极与共阳极数码管的驱动方法;
- 如何通过单片机I/O口输出特定段码以显示数字;
- 实现数字0~9的静态显示;
- 为后续学习动态扫描、多位显示打下基础。
2. 硬件设计
2.1 数码管结构
最常见的数码管为7段数码管 (含a、b、c、d、e、f、g七段)和8段数码管(加一个小数点dp)。
引脚排列通常为双列直插形式,共10个引脚(含两个公共端)。
2.2 数码管类型
类型 | 公共端 | 特点 |
---|---|---|
共阴极(Common Cathode) | 所有LED阴极连在一起接GND | 段选线输入高电平点亮对应段 |
共阳极(Common Anode) | 所有LED阳极连在一起接VCC | 段选线输入低电平点亮对应段 |
本章以共阴极数码管为例。
2.3 引脚识别
使用万用表"二极管档"识别数码管引脚:
- 找公共端:若某引脚与其他多个引脚导通且红笔接该脚时亮,则为共阴极公共端;
- 确认a~g及dp段对应引脚。
2.4 电路连接
假设使用共阴极数码管,段选线(a~g, dp)连接到P0口:
数码管段 | 连接单片机引脚 |
---|---|
a | P0.0 |
b | P0.1 |
c | P0.2 |
d | P0.3 |
e | P0.4 |
f | P0.5 |
g | P0.6 |
dp | P0.7 |
公共端(COM)接地(GND)。
注意:P0口为开漏输出,必须外接上拉电阻(10kΩ排阻)或使用驱动芯片。
3. 软件设计
3.1 段码编码原理
要显示某个数字,需点亮特定段。例如:
- 显示"0":a、b、c、d、e、f 亮 → g灭 →
0x3F
(共阴极) - 显示"1":b、c 亮 →
0x06
- 显示"2":a、b、d、e、g 亮 →
0x5B
共阴极数码管段码表(a~g, dp 对应 P0.0 ~ P0.7)
数字 | 段码(十六进制) | 说明 |
---|---|---|
0 | 0x3F | abcdef |
1 | 0x06 | bc |
2 | 0x5B | abged |
3 | 0x4F | abgcd |
4 | 0x66 | fgbc |
5 | 0x6D | afgcd |
6 | 0x7D | afgcde |
7 | 0x07 | abc |
8 | 0x7F | abcdefg |
9 | 0x6F | abcdfg |
段码计算方式:假设 a=P0.0, b=P0.1, ..., g=P0.6, dp=P0.7,则"0"对应二进制
00111111
=0x3F
。
3.2 定义段码数组
c
#include <reg52.h>
// 共阴极段码表
unsigned char code seg_code[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
使用
code
关键字将数据存入程序存储器(Flash),节省RAM。
3.3 简单静态显示"8"
c
void main() {
P0 = seg_code[8]; // 显示数字8
while(1); // 保持
}
若P0接的是a~g段,则显示"8"。
3.4 循环显示0~9
c
void delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 125; j++);
}
void main() {
unsigned char i;
while(1) {
for (i = 0; i < 10; i++) {
P0 = seg_code[i]; // 显示数字i
delay_ms(500); // 延时500ms
}
}
}
实现0~9依次显示,每秒切换一次。
3.5 显示带小数点的数字
若需显示"5.",即数字5加小数点亮:
c
P0 = seg_code[5] | 0x80; // 0x80 = 10000000,点亮dp
| 0x80
表示将P0.7置1(共阴极,高电平点亮dp)。
3.6 多位静态数码管显示(扩展)
若系统中有多个数码管,每个都独立连接到不同I/O口(如P0、P1、P2),则可分别控制。
例如:
- 数码管1 → P0(显示十位)
- 数码管2 → P1(显示个位)
显示数字"25":
c
P0 = seg_code[2]; // 十位显示2
P1 = seg_code[5]; // 个位显示5
此为真正"静态显示",每个数码管持续点亮,无需扫描。
3.7 编译与下载
- Keil中新建工程,包含代码;
- 确保
reg52.h
正确; - 编译生成HEX文件;
- 使用STC-ISP下载至单片机;
- 观察数码管是否按预期显示数字。
若显示混乱:
- 检查段选线连接是否错位;
- 确认数码管是共阴还是共阳;
- 若为共阳极,段码需取反:
~seg_code[i]
。
4. 小结
本章通过驱动静态数码管,掌握了数字显示的基本原理与实现方法,主要内容包括:
- 硬件连接:学会识别数码管类型与引脚,正确连接段选线与公共端;
- 段码编码:理解a~g段与数字的关系,掌握共阴极与共阳极的编码差异;
- 软件实现:使用数组存储段码,实现0~9循环显示;
- 扩展能力:支持小数点显示与多位静态控制;
- 开发流程:完成从设计、编码到烧录验证的全过程。
4.1 常见问题与解决
问题 | 原因 | 解决方法 |
---|---|---|
数码管不亮 | 未供电、公共端未接地/接VCC | 检查电源与公共端连接 |
显示乱码 | 段选线接错 | 对照段码表逐段测试 |
某段不亮 | 对应I/O未输出、线路断开 | 用万用表测电压 |
亮度低 | P0口无上拉电阻 | 外接10kΩ上拉排阻 |
显示固定 | 程序未循环或跑飞 | 检查while(1) 与延时函数 |
4.2 下一步学习建议
- 学习动态数码管扫描,节省I/O资源;
- 使用定时器实现精确显示刷新;
- 实现计时器功能,结合数码管显示时间;
- 引入按键,实现数字可调输入。
本章标志着你已掌握基本的数字显示能力,下一章将进入动态数码管扫描的学习,进一步提升显示控制水平。