简介
通过操作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段共阳数码管数字显示)
代码
不需要下载, 基本代码上面都提供了
参考
普中STM32-PZ6806L开发板(HAL库函数实现-批量操作GPIO引脚实现跑马灯)



















