登录/注册

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寄存器整体操作)

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

四位数码管12个引脚怎么分配

在电子显示技术中,四位数码管作为一种常见的显示器件,广泛应用于各种数字显示系统。其通过控制不同段(A-G)的发光二极管(LED)来显示数字或字符。对于具有12个引脚的

2025-01-30 15:00:00

采用IIC接口程序实时读取温度值并通过四位数码管实时显示

程序开发环境为IAR FOR STM8 1.40主控MCU为STM8S103F3P6温度采集芯片位TMP275,采用IIC接口显示采用四位共阴数码管

2022-03-02 07:07:18

2片HC595怎样驱动四位数码管

MicroPython-On-ESP8266——数码管的使用,2片HC595驱动四位数码管1. 背景前面在使用

2022-02-17 07:07:05

基于ATmega8单片机四位数码管静态显示Proteus仿真源程序

基于ATmega8单片机四位数码管静态显示Proteus仿真源程序

资料下载 木头1233 2023-05-05 09:18:11

MicroPython-On-ESP8266——数码管的使用,2片HC595驱动四位数码管

MicroPython-On-ESP8266——数码管的使用,2片HC595驱动四位数码管1. 背景前面在使用

资料下载 王磊 2021-12-22 18:48:20

Stm32 四位数码管

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

资料下载 张文 2021-11-26 15:36:05

51单片机-8段四位数码管

51单片机-8段四位数码管8段数码管工作原理8段四位数码管工作方式下面是本人自写的四位

资料下载 世态薄凉 2021-11-17 16:21:02

四位数码管的电路图和设计工程文件免费下载

本文档的主要内容详细介绍的是四位数码管的电路图和设计工程文件免费下载。

资料下载 张富贵 2019-10-28 08:00:00

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

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

2022-01-20 06:09:28

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

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

2021-12-15 06:46:14

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

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

2021-12-15 06:01:21

四位数码管的分类及其引脚

一、四位数码管1.四位数码管的分类四位数码管使一种半导体发光器件,其基本单元为发光二极

2021-11-29 08:17:53

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

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

2021-11-08 07:19:02

基于stm32f1xx的四位数码管小数显示实验

文章目录基于stm32f1xx的四位数码管小数显示实验一、实验目的:1.1 IO分配1.2 GPIO相关1.2.1 GPIO初始化1.2.2GPIO常用置高置低函数(以PB5为例)二、数

2021-07-21 08:13:35

四位数字密码锁

字, 并由四位数码管显示 , 然后按L键将输入的数字设置为密码。该密码由另外四位数码管显示(也可以删除这四个数码管以隐藏密码)。再由键盘输入

2019-09-08 15:08:07
7天热门专题 换一换
相关标签