Stm32 四位数码管

本文介绍了STM32驱动四位数码管的原理,包括数码管的工作方式、编码规则,以及如何使用TM1637芯片进行控制。通过驱动程序和测试程序的展示,详细解析了如何创建一个滴答时钟,使数码管显示时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

四位数码管

关键词: stm32 滴答时钟 数码管 四位数码管

主要内容:

  • 数码管原理
  • 四位数码管
  • 驱动程序
  • 测试程序

文档参考:

最新地址: https://taotaodiy-mcu.readthedocs.io/en/latest/sensor/digit.html

四位数码管

数码管原理

数码管主要用来显示数据。

判断延时是否结束

数码管内部实际上就是8个发光二极管,我通过给A-H编号的发光二极管给高低不同的电平,最终使得数码管显示不同的字符。
如图所示,数码管分共阴(即发光二极管阴极连到一起)还是共阳(即发光二极管阳极连到一起)。

digit002

比如说我们希望,数码管显示5这个数字。那我们的思路是什么呢?

首先我们想要的效果应该是这样:

判断延时是否结束

也就是,通过电路和程序控制数码管的A,F,G,C,D这五个发光二极管发光即可。

上图已经对数码管用A-H进行了排序,如果用0/1来表示发光二极管的亮灭,

5这个数字就可以得到下面的一串有序编码。

#对应的数码管编号
H G F E D C B A
#共阴二极管亮为1,灭为0
0 1 1 0 1 1 0 1  --> 0x6b

这样就得到一个编码,0x6b,
是的,数码管原理就是如此,我们给他这样一个编码就能在数码管上显示5

共阳数码管则相反

#共阳二极管亮为0,灭为1
1 0 0 1 0 0 1 0  --> 0x92

对于单个数码管我们就可以得出 0-f 的编码,如下。

#共阳数码管编码
unsigned int DIGIT_ANODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //0~f
#共阴数码管编码
unsigned int DIGIT_CATHODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~f

多位数码管

上面是单个数码管的显示原理和数码管编码由来,当我们需要同时显示一段数据的时候就需要多段数码管,也就是多个数码管的组合。
这就存在一个问题,一个数码管需要8个IO来控制,那么再加几个数码管,不就把IO占用光了吗?

于是就有了位选,数码管通用八根段选,使用位选来控制单个数码管显示。

四位数码管

当然这样还是比较费IO,于是就有了各种数码管控制芯片。

文章开头的图片是一个四位数码管,使用TM1637来控制显示,下面是它的显示和控制原理。

四位数码管

数码管编码

这里的四位数码管唯一不一样的地方就是中间多了两个点,主要是为了显示时间,有那种闪烁的效果。
显示数

### STM32 控制四位数码管教程 #### 使用STM32CubeMX配置GPIO引脚 为了使STM32能够控制四位数码管,首先需要利用STM32CubeMX工具初始化必要的硬件资源。具体来说,就是设置好连接到数码管各个段和位选线上的GPIO引脚模式为推挽输出[^1]。 ```c // 配置 GPIO 引脚用于驱动数码管 __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2; // 假设 PA0,PA1,PA2 连接到数码管 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` #### 编写函数以刷新数码管显示内容 编写一个名为`Display_Refresh()`的C语言函数负责定期更新数码管所要呈现的数据。此过程涉及扫描每一位并发送相应的字形编码给对应的IO口,在循环内依次点亮每一个LED七段显示器从而形成连续视觉效果。 ```c void Display_Refresh(uint8_t *data){ static uint8_t pos=0; HAL_GPIO_WritePin(DIGIT_PORT,DIGIT_PINS[pos],RESET); // 关闭当前位 SEGMENT_WRITE(data[pos]); // 设置段数据 pos=(pos+1)%DIGITS_COUNT; // 更新位置指针 HAL_GPIO_WritePin(DIGIT_PORT,DIGIT_PINS[pos],SET); // 打开新一位 } ``` #### 定义全局变量存储待显示数值 定义两个数组分别保存每位数码管应展示的具体字符以及对应二进制形式下的段码表,以便于后续调用上述提到的刷新函数时可以直接索引获取所需信息。 ```c uint8_t displayBuffer[DIGITS_COUNT]; // 存储欲显数字缓冲区 const uint8_t segCodeTable[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; // 字型码表 (共阴极) ``` #### 主程序逻辑结构设计 最后一步是在主函数里创建定时器中断服务例程ISR或者采用延时等待的方式周期性触发前面编写的刷新操作,确保屏幕始终处于最新状态。 ```c int main(void){ /* 初始化 */ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while(1){ Display_Refresh(displayBuffer); // 刷新显示屏 // 可在此处加入其他处理... HAL_Delay(5); // 调整延迟时间影响亮度 } } ```
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贪贪贪丶慎独

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值