以下是一个基于STM32标准外设库(使用寄存器操作)驱动四位数码管的完整例程,采用动态扫描方式,适用于共阳数码管(若使用共阴需调整逻辑):
硬件连接示例(以STM32F103C8T6为例)
| 数码管引脚 | STM32引脚 | 功能说明 |
|---|---|---|
| a | PB0 | 段选a |
| b | PB1 | 段选b |
| c | PB2 | 段选c |
| d | PB3 | 段选d |
| e | PB4 | 段选e |
| f | PB5 | 段选f |
| g | PB6 | 段选g |
| dp | PB7 | 小数点 |
| DIG1 | PA0 | 位选1(千位) |
| DIG2 | PA1 | 位选2(百位) |
| DIG3 | PA2 | 位选3(十位) |
| DIG4 | PA3 | 位选4(个位) |
代码实现
#include "stm32f10x.h"
// 共阳数码管0-9的段码表(0点亮,1熄灭)
const uint8_t SEGMENT_CODE[] = {
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90 // 9
};
// 位选控制数组
const uint16_t DIGIT_SELECT[] = {
GPIO_Pin_0, // DIG1
GPIO_Pin_1, // DIG2
GPIO_Pin_2, // DIG3
GPIO_Pin_3 // DIG4
};
void GPIO_Configuration(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOA和GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
// 配置PB0-PB7为推挽输出(段选)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置PA0-PA3为推挽输出(位选)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void DisplayNumber(uint16_t num) {
uint8_t digits[4];
// 分离各位数字
digits[0] = num / 1000; // 千位
digits[1] = (num % 1000) / 100; // 百位
digits[2] = (num % 100) / 10; // 十位
digits[3] = num % 10; // 个位
for(uint8_t i = 0; i < 4; i++) {
// 关闭所有位选(共阳数码管位选低电平关闭)
GPIOA->ODR |= (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
// 发送段码到PB端口(注意:STM32输出需取反)
GPIOB->ODR = (uint16_t)(~SEGMENT_CODE[digits[i]]);
// 打开当前位选(共阳数码管高电平选中)
GPIOA->ODR &= ~DIGIT_SELECT[i]; // 清除对应位
// 延时保持显示(1-5ms)
for(volatile uint32_t j = 0; j < 5000; j++);
}
}
int main(void) {
GPIO_Configuration();
while(1) {
// 示例:显示数字1234
DisplayNumber(1234);
}
}
关键点说明
-
动态扫描原理:
- 每次只点亮1位数码管,4位快速轮询(人眼视觉暂留)
- 每位数码管显示时间约1-5ms,刷新率>50Hz避免闪烁
-
共阳数码管逻辑:
- 段选:低电平点亮(0有效)
- 位选:高电平选中(1有效)
- 若使用共阴数码管:
- 段码表改为高电平有效(取反原表)
- 位选信号改为低电平有效
-
优化建议:
- 使用定时器中断刷新数码管,避免阻塞主程序
- 添加消隐处理(切换位选前关闭显示)
- 增加小数点支持(段码最高位控制)
-
引脚修改:
- 修改
DIGIT_SELECT和GPIO_Pin定义适配实际硬件 - 段选引脚需连续8个GPIO(方便用ODR寄存器整体操作)
- 修改
实际使用时请根据开发板原理图调整引脚定义,若数码管亮度不足可减小限流电阻或增加扫描时间。
2片HC595怎样驱动四位数码管呢
MicroPython-On-ESP8266——数码管的使用,2片HC595驱动四位数码管1. 背景前面在使用四位数码管时,需要用来12个GPIO接口,结果咱micropython能驱动
linlin10
2022-02-17 07:07:05
四位数码管12个引脚怎么分配
在电子显示技术中,四位数码管作为一种常见的显示器件,广泛应用于各种数字显示系统。其通过控制不同段(A-G)的发光二极管(LED)来显示数字或字符。对于具有12个引脚的四位数码管,合理的引脚分配
2025-01-30 15:00:00
四位数码管的分类及其引脚
一、四位数码管1.四位数码管的分类四位数码管使一种半导体发光器件,其基本单元为发光二极管。按照发光二极管连接方式可以分为共阳极数码管和共阴极数码管。共阳数码管使指将所有发光二极管的阳极接在一起形成
五斤麻辣油
2021-11-29 08:17:53
基于stm32f1xx的四位数码管小数显示实验
文章目录基于stm32f1xx的四位数码管小数显示实验一、实验目的:1.1 IO分配1.2 GPIO相关1.2.1 GPIO初始化1.2.2GPIO常用置高置低函数(以PB5为例)二、数四位码管实验
安徒生童话
2021-07-21 08:13:35
采用IIC接口程序实时读取温度值并通过四位数码管实时显示
程序开发环境为IAR FOR STM8 1.40主控MCU为STM8S103F3P6温度采集芯片位TMP275,采用IIC接口显示采用四位共阴数码管四位数码管驱动芯片位TM1650,采用IIC接口
uvysdfydad
2022-03-02 07:07:18
四位数字密码锁
字, 并由四位数码管显示 , 然后按L键将输入的数字设置为密码。该密码由另外四位数码管显示(也可以删除这四个数码管以隐藏密码)。再由键盘输入四位数字,然后按U键开锁,当输入的数字与密码相同时,显示开锁成功。反之显示密码错误,并记录错误次数。连续输错密码3次以上时,电路锁定一段时间。
efans_c575a5
2019-09-08 15:08:07
如何用四位数码管显示外部中断的计数设计
用四位数码管显示外部中断的计数设计要求程序设计硬件设计知识补充P3端口中断IETCON设计要求 分别用两个开关使用中断操作实现计数和清零。目的就是搞清楚中断是如何工作的。CSDN文本编辑实现首行
overheat
2021-11-23 06:24:36
基于89c51的74ls138模块的四位数码管动态显示简介
基于89c51的74ls138模块的四位数码管动态显示简介本人的开发板上只有八位数码管,因此是将p2口的三位接在138的输入上,输出口的前四位接在八位数码管的位选段上以实现四位数码管的显示。动态
h1654155957.9185
2021-12-07 10:48:03
怎样去设计一种四位数字电子钟
)74LS00引脚及其功能(4)数码管引脚及其功能(5)NE555定时器七.设计过程一.实验名称:四位数字电子钟设计二.设计目的1.掌握数字系统设计的基本方法和流程2.掌握计数器、译码器、数码管等常见器件的原理和使用方法3.设计一个具有时分显示的电子钟,准确计时,设置形式显示时分,小时要求24,分钟计
gXDhn
2021-07-22 09:50:18
采用四位数码管实现时间的倒计时
目录实验目的:问题总结:实验目的:作为一个共享项目中的一部分,采用四位数码管实现时间的倒计时。问题总结:因为赠送的资料是arduino的程序,所以需要自己移植到stm32中。一开始以为TM1637用
七上八下
2022-01-12 08:01:03
如何实现多位数码管的显示
按键累加计数,并显示于数码管。实验电路:3 实现四位数码管的动态扫描显示;通过动态扫描的方式让四位数码管分别显示个人学号后4码;写出动态扫描函数的实验代码。原始程序码:、、实训2 数码管 先显示学号 然后可依次累加数字#include #in
倪love
2021-11-18 07:16:42
常见的一/二/四位数码管引脚图详解
数码管是一种可以显示数字和其他信息的电子设备,是显示屏其中一类, 通过对其不同的管脚输入相对的电流,会使其发亮,从而显示出数字,然后显示出时间、日期、温度等所有可用数字表示的参数。通常用在空调、热水器、冰箱等电器中。那么数码管引脚图是怎样的呢?下面我们就来说说常见的一位、两位和四位的数码管引脚图。
2022-12-09 09:25:48
STM32F103单片机驱动TM1637数码管显示模块的方法
最近项目中需要用到数码管显示,于是买了一个TM1637芯片驱动的四位数码显示模块,现将调试过程记录一下,方便以后参考。使用的单片机是STM32F103C8T6最小系统使用的数码管模块是TM1637
linlin10
2021-12-08 07:08:16
24小时时钟加M蜂鸣器每到一小时响一次,用的是四位数码管,无法显示秒怎么办
24小时时钟加M蜂鸣器每到一小时响一次,用的是四位数码管,无法显示秒,
chunchristy
2020-05-29 09:17:27
基于SMT32的数码管显示程序
1、四位数码管的简单介绍因为在学校做项目的时候使用到了数码管显示,所以就编写了一个基于SMT32的数码管显示程序。通过看手册知道这个四位数码管采用TM1637 驱动电路。内部有集成MCU数字电路接口
efwedfd
2021-08-11 08:32:30
基于Arduino UNO和四位数码的数字时钟制作方案
之前使用七段数码管或使用1602 LCD制作了许多数字时钟电路。在本文中,主要介绍通过使用Arduino UNO和四位数码制作数字时钟,并以HH:MM格式显示时间。 需要的组件 ● 4位7段数码管 ● 74HC595 ● DS3231 RTC模块 ● Arduino U
2020-12-13 10:35:00
Haawking DSC2803X 经验贴 004 四位数码管实验(74hc595驱动方式)
本帖最后由 底色北路 于 2021-10-29 12:03 编辑 Haawking DSC2803X 经验贴004 四位数码管实验(74hc595驱动方式)一、说明:作者:LiuZenglin
底色北路
2021-10-26 21:25:38
esp8266驱动FD1642芯片的四位数码管程序
[table][tr][td][table][tr][td]esp8266小巧便宜适合各种DIY,网上买了一片FD1642芯片的四位数码管,橙色的暖色很好看。只是这个芯的的驱动不好找,网上找了几个
過眼云煙╮而巳
2021-04-12 14:24:36
0.1-3.0 GHz 四位数字衰减器 (1 dB LSB) skyworksinc
电子发烧友网为你提供()0.1-3.0 GHz 四位数字衰减器 (1 dB LSB)相关产品参数、数据手册,更有0.1-3.0 GHz 四位数字衰减器 (1 dB LSB)的引脚图、接线图、封装手册
2025-05-26 18:29:41
51单片机静态数码管和动态数码管原理及实验 精选资料推荐
的数码管显示。一般一位数码管有10个引脚,二位数码管也是10个引脚,四位数码管是12个引脚。为了更方便区分段选和...
胡政鹏邮箱
2021-07-21 07:47:52
数码管显示原理是什么
1数码管显示原理我们先来看几个数码管的图片, 左图为单位数码管、中图为双位数码管、右图为四位数码管, 另外还有右下角不带点的数码管,最右图还有“米”字数码管等。不管将几位数码管连在一起,数码管的显示
风来吴山
2021-12-08 07:47:12
数码管的显示原理是什么呢
3.1 数码管显示原理这便是数码管的图片,叫做四位数码管,当然也有双位,单位数码管,也还有不带小数点的以及“米”字型。无论数码管的造型怎么要,其原理都是相同的,通过控制发光二极管来显示数字。以上
hy381
2022-02-22 06:45:10