通过操作GPIO输出电平实现驱动单个共阳数码管 0 ~ F的显示。
数码管电路原理图
数码管与主芯片电路原理图
1. 由原理图可知, 共阳极已接VCC, 所以只需要控制GPIO输出低电平就可以点亮7 + . 的数码管了.
2. 驱动管与主芯片引脚对应关系
A -> PC0、B->PC1 .... DP->PC7, 下图是驱动的每一段示意图
3. 共阳数码管段码
通过下面的表我们能看出来从0 ~ F显示需要点亮的数码管,共阳数码管, 低电平点亮, 0就是点亮,1是熄灭, 也看出来为什么要有些字母小写, 因为跟数字段码重复了, 例如b跟d的大写字母段码与8和0段码重复
值 | A | B | C | D | E | F | G | DP | HEX |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0xC0 |
1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0xF9 |
2 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0xA4 |
3 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0xB0 |
4 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0x99 |
5 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0x92 |
6 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0x82 |
7 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0xF8 |
8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0x80 |
9 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0x98 |
A | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0x88 |
b | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0x83 |
C | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0xC6 |
d | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0xA1 |
E | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0x86 |
F | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0x8E |
与上篇讲到的8个LED的电路一致, 初始化参考 普中STM32-PZ6806L开发板(HAL库函数实现-批量操作GPIO引脚实现跑马灯)
segment_display.c
#define SEG_PORT GPIOC
#define SEG_MAX_NUMBER 15 // 显示最大数字
#define SEG_MANY_NUMBER_COUNT 16 // 显示数字个数
#define SEG_ALL_SEG_CODE 0xFF // 全段选择的码
uint8_t seg_code[SEG_MANY_NUMBER_COUNT] =
{ 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x98, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E };
void Seg_ClearDisplay()
{
HAL_GPIO_WritePin(SEG_PORT, SEG_ALL_SEG_CODE, GPIO_PIN_SET);
}
void Seg_NumberDisplay(uint16_t num)
{
if (num > SEG_MAX_NUMBER)
{
return;
}
Seg_ClearDisplay();
HAL_GPIO_WritePin(SEG_PORT, ~seg_code[num], GPIO_PIN_RESET);
}
void Seg_DoForeachNumberAction(uint32_t delay_ms, uint16_t time)
{
int i = 0;
while (time--)
{
for (i = 0; i < SEG_MANY_NUMBER_COUNT; ++i)
{
Seg_NumberDisplay(i);
HAL_Delay(delay_ms);
}
}
}
main.c
int main()
{
...
while(1)
{
Seg_DoForeachNumberAction(1000, 1);
}
...
}
HAL_GPIO_WritePin(SEG_PORT, ~seg_code[num], GPIO_PIN_RESET);
GPIO_PIN_RESET : 低电平点亮, GPIO_PIN_RESET就是点亮
~seg_code[num] : 段码是按照引脚输出进行取值的, 而现在是选择引脚, 所以与逻辑刚好相反, 所以要按位取反
普中STM32-PZ6806L开发板(HAL库函数实现-7段共阳数码管数字显示)