STM32驱动四位数码管例程
STM32驱动四位数码管例程
更多
以下是一个基于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寄存器整体操作)
- 修改
实际使用时请根据开发板原理图调整引脚定义,若数码管亮度不足可减小限流电阻或增加扫描时间。
四位数码管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
MicroPython-On-ESP8266——数码管的使用,2片HC595驱动四位数码管
MicroPython-On-ESP8266——数码管的使用,2片HC595驱动四位数码管1. 背景前面在使用
资料下载
王磊
2021-12-22 18:48:20
基于stm32f1xx的四位数码管小数显示实验
文章目录基于stm32f1xx的四位数码管小数显示实验一、实验目的:1.1 IO分配1.2 GPIO相关1.2.1 GPIO初始化1.2.2GPIO常用置高置低函数(以PB5为例)二、数
2021-07-21 08:13:35
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览