一、七段数码管显示模块详解
🧩 1. 基本原理
七段数码管(7-Segment Display)由 7 个 LED (标记为 a~g)组成,用来显示 十进制数字 0~9(有的加上小数点 dp,就是8段)。每个数字的显示是通过控制某些段亮/灭来实现的。
数码管的控制方式有两种:
-
共阳极:所有段的正极连接在一起,接高电平(VCC),通过对段的负极接低电平(GND)来点亮;
-
共阴极:所有段的负极连接在一起,接地,通过段的正极给高电平来点亮。
本程序是以共阴极数码管为例设计的,即:
段码位为 1(高电平)时灯灭,0(低电平)时灯亮。
🧠 2. 段码表解析
uint8_t LedShowData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};// 对应数字: 0 1 2 3 4 5 6 7 8 9
每个值代表一个数字所需显示的段的组合,按如下方式排列:
位 | 段 | 说明 |
---|---|---|
D0 | a | 最上方横 |
D1 | b | 右上 |
D2 | c | 右下 |
D3 | d | 最下方横 |
D4 | e | 左下 |
D5 | f | 左上 |
D6 | g | 中间横 |
D7 | dp | 小数点(不使用) |
这些段的状态组成一个字节,即 8 位数据,比如:
-
数字 0:亮 a, b, c, d, e, f → 0xC0(二进制 1100 0000)
-
数字 1:亮 b, c → 0xF9(二进制 1111 1001)
🔧 3. 相关函数解释
uint8_t LedShowData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0,1,2,3,4,5,6,7,8,9
uint16_t GPIO_PIN_x[] = {GPIO_Pin_0,GPIO_Pin_1,GPIO_Pin_2,GPIO_Pin_3,GPIO_Pin_4,GPIO_Pin_5,GPIO_Pin_6,GPIO_Pin_7};
✅ void LEDSEG_Init(void);
该函数初始化 GPIOA 的 0~7 引脚为推挽输出,用来控制数码管的每一段。
代码分析:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
打开 GPIOA 的时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | ... | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
-
设置 GPIOA 0~7 为 推挽输出,速度为 50MHz。
GPIO_SetBits(GPIOA, GPIO_Pin_0 ~ GPIO_Pin_7);
-
所有段位输出高电平(共阴极时,LED 熄灭)。
✅ void Digital_Display(uint8_t val);
这个函数用于在数码管上显示一个数字(0~9)。
传参:
val
:你想显示的数字(0~9)
代码解析:
uint16_t display_val = LedShowData[val];
-
从段码表中查出要显示数字的段码值。
for(i = 0;i < 8;i++){ GPIO_WriteBit(GPIOA,GPIO_PIN_x[i],display_val>>i & 0x01);}
-
遍历8位段码(从最低位到最高位),把每一位的0或1写到对应的 GPIOA 引脚上。
-
display_val >> i & 0x01
:提取第 i 位。
示例展示
例如 val = 2:查表得到 display_val = 0xA4 = 0b10100100会将 D0~D7 分别设置为对应的位。
💡 小贴士
-
若你要动态显示多个位的数码管,需要通过位选+段选组合来进行快速扫描(即动态显示法)。
-
若你是单个数码管,此代码已足够完成显示功能。
🧪 示意图(逻辑上)
GPIOA 引脚 01234567
段位对应: a b c d e f g d
Digital_Display(3); // GPIOA 写入 0xB0 => 段 a b c d g 亮
✅ 总结
函数名 | 作用 |
---|---|
LEDSEG_Init() |
初始化数码管用的 GPIO(A0~A7) |
Digital_Display(val) |
显示指定数字(0~9) |