0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32驱动四位数码管例程

STM32驱动四位数码管例程

分享:
我们将使用STM32的GPIO来驱动一个四位数码管。数码管通常是共阳或共阴的,这里我们假设使用共阳数码管(共阴的话需要调整代码中的电平逻辑)。 数码管的每个段(a,b,c,d,e,f,g,dp)由STM32的GPIO控制,而位选(即选择哪一位数码管显示)也由GPIO控制。 硬件连接: 假设我们使用4个位选引脚(选择4位数码管中的哪一个)和8个段选引脚(a,b,c,d,e,f,g,dp)。 位选引脚:我们使用GPIO的4个引脚(例如PA0-PA3)来控制,高电平有效(如果是共阳数码管,那么位选高电平时选中该位数码管)。 段选引脚:我们使用GPIO的8个引脚(例如PB0-PB7)来控制,低电平有效(因为共阳数码管,段选引脚低电平时该段亮)。 注意:如果使用共阴数码管,则位选应该低电平有效,段选高电平有效。这里以共阳为例。 为了减少GPIO的使用,也可以使用移位寄存器(如74HC595)来驱动,但本例直接使用GPIO。 动态显示原理:由于四位数码管同时显示需要较多的引脚和控制,我们采用动态扫描的方式,即每次只点亮一位数码管,依次点亮,利用人眼视觉暂留效应,看起来是同时显示的。 步骤: 1. 初始化GPIO:配置位选引脚和段选引脚为输出模式。 2. 定义数字的显示编码:0~9的段码(共阳数码管,低电平有效)。 3. 在循环中,依次选择每一位数码管,并输出该位对应的数字的段码,然后延时一段时间(1-5ms),再切换下一位。 注意:延时时间不能太短,否则亮度不够;也不能太长,否则会有闪烁。 下面是一个简单的例程(以STM32F103为例,使用标准库): 假设: 位选引脚:PA0, PA1, PA2, PA3 分别控制第1,2,3,4位数码管(共阳,高电平选中) 段选引脚:PB0~PB7 分别控制a,b,c,d,e,f,g,dp(低电平点亮) 注意:实际硬件连接可能不同,请根据实际情况调整引脚定义。

以下是一个基于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. 动态扫描原理

    • 每次只点亮1位数码管,4位快速轮询(人眼视觉暂留)
    • 每位数码管显示时间约1-5ms,刷新率>50Hz避免闪烁
  2. 共阳数码管逻辑

    • 段选:低电平点亮(0有效)
    • 位选:高电平选中(1有效)
    • 若使用共阴数码管:
      • 段码表改为高电平有效(取反原表)
      • 位选信号改为低电平有效
  3. 优化建议

    • 使用定时器中断刷新数码管,避免阻塞主程序
    • 添加消隐处理(切换位选前关闭显示)
    • 增加小数点支持(段码最高位控制)
  4. 引脚修改

    • 修改DIGIT_SELECTGPIO_Pin定义适配实际硬件
    • 段选引脚需连续8个GPIO(方便用ODR寄存器整体操作)

实际使用时请根据开发板原理图调整引脚定义,若数码管亮度不足可减小限流电阻或增加扫描时间。

四位数码管原理及驱动方式是什么?

四位数码管原理及驱动方式是什么?

csw_ying 2022-01-20 06:09:28

stm32共阴极四位数码管驱动代码分享

stm32共阴极四位数码管驱动代码分享

linlin10 2021-12-15 06:01:21

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

怎么实现基于stm32f1xx的四位数码管小数显示实验?

怎么实现基于stm32f1xx的四位数码管小数显示实验?

安徒生童话 2021-11-08 07:19:02

怎么实现c595四位数码管STM32上计时显示?

怎么实现c595四位数码管STM32上计时显示?

四哥201311 2021-12-15 06:46:14

如何用四位数码管显示外部中断的计数设计

四位数码管显示外部中断的计数设计要求程序设计硬件设计知识补充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

求大佬分享micropython四位数码管程序代码

求大佬分享micropython四位数码管程序代码

香脆面 2022-01-17 06:06:24

采用四位数码管实现时间的倒计时

目录实验目的:问题总结:实验目的:作为一个共享项目中的一部分,采用四位数码管实现时间的倒计时。问题总结:因为赠送的资料是arduino的程序,所以需要自己移植到stm32中。一开始以为TM1637用

七上八下 2022-01-12 08:01:03

你都知道Stm32有哪几位数码管

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

llc1219 2021-12-09 06:05:18

如何实现多位数码管的显示

按键累加计数,并显示于数码管。实验电路:3 实现四位数码管的动态扫描显示;通过动态扫描的方式让四位数码管分别显示个人学号后4码;写出动态扫描函数的实验代码。原始程序码:、、实训2 数码管 先显示学号 然后可依次累加数字#include #in

倪love 2021-11-18 07:16:42

常见的一/二/四位数码管引脚图详解

数码管是一种可以显示数字和其他信息的电子设备,是显示屏其中一类, 通过对其不同的管脚输入相对的电流,会使其发亮,从而显示出数字,然后显示出时间、日期、温度等所有可用数字表示的参数。通常用在空调、热水器、冰箱等电器中。那么数码管引脚图是怎样的呢?下面我们就来说说常见的一、两四位数码管引脚图。

2022-12-09 09:25:48

如何使用DS1302时钟模块搭配TM1637四位数码管制作简易电子钟?

如何使用DS1302时钟模块搭配TM1637四位数码管制作简易电子钟?

大洼球王 2021-09-26 08:35:52

STM32F103单片机驱动TM1637数码管显示模块的方法

最近项目中需要用到数码管显示,于是买了一个TM1637芯片驱动四位数码显示模块,现将调试过程记录一下,方便以后参考。使用的单片机是STM32F103C8T6最小系统使用的数码管模块是TM1637

linlin10 2021-12-08 07:08:16

24小时时钟加M蜂鸣器每到一小时响一次,用的是四位数码管,无法显示秒怎么办

24小时时钟加M蜂鸣器每到一小时响一次,用的是四位数码管,无法显示秒,

chunchristy 2020-05-29 09:17:27

详解数码管使用方法

数码管是一种半导体发光器件,其基本单元是发光二极。能显示4位数字的叫四位数码管,当然也有多位和只有一数码管,他们的电气原理相同。

2022-12-05 16:00:43

基于SMT32的数码管显示程序

1、四位数码管的简单介绍因为在学校做项目的时候使用到了数码管显示,所以就编写了一个基于SMT32的数码管显示程序。通过看手册知道这个四位数码管采用TM1637 驱动电路。内部有集成MCU数字电路接口

efwedfd 2021-08-11 08:32:30

基于Arduino UNO和四位数码的数字时钟制作方案

之前使用七段数码管或使用1602 LCD制作了许多数字时钟电路。在本文中,主要介绍通过使用Arduino UNO和四位数码制作数字时钟,并以HH:MM格式显示时间。 需要的组件 ●    47段数码管 ●    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

加载更多