普中STM32-PZ6806L开发板(HAL库函数实现-7段共阳数码管数字显示)

2023-12-28 14:08:47

简介

通过操作GPIO输出电平实现驱动单个共阳数码管 0 ~ F的显示。

电路原理图

数码管电路原理图
在这里插入图片描述
数码管与主芯片电路原理图
在这里插入图片描述

其他知识

1. 由原理图可知, 共阳极已接VCC, 所以只需要控制GPIO输出低电平就可以点亮7 + . 的数码管了.
2. 驱动管与主芯片引脚对应关系
	A -> PC0、B->PC1 .... DP->PC7, 下图是驱动的每一段示意图

在这里插入图片描述
3. 共阳数码管段码
通过下面的表我们能看出来从0 ~ F显示需要点亮的数码管,共阳数码管, 低电平点亮, 0就是点亮,1是熄灭, 也看出来为什么要有些字母小写, 因为跟数字段码重复了, 例如b跟d的大写字母段码与8和0段码重复

ABCDEFGDPHEX
0000000110xC0
1100111110xF9
2001001010xA4
3000011010xB0
4100110010x99
5010010010x92
6010000010x82
7000111110xF8
8000000010x80
9000110010x98
A000100010x88
b110000010x83
C011000110xC6
d100001010xA1
E011000010x86
F011100010x8E

实现步骤

创建项目

与上篇讲到的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引脚实现跑马灯)

文章来源:https://blog.csdn.net/halo_hsuh/article/details/135261877
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。