登录/注册

STM32接数码管

STM32接数码管

更多

在STM32上连接数码管需要硬件连接和软件编程两方面的配合。以下是详细的步骤和示例代码:

一、硬件连接(以共阴数码管为例)

  1. 数码管类型

    • 共阴数码管:公共端接地,段选信号高电平有效(推荐)
    • 共阳数码管:公共端接VCC,段选信号低电平有效
  2. 连接方式

    • 直接驱动(适合少量数码管):
      • 段选(a-g + dp) → STM32的8个GPIO
      • 位选(COM1-COM4) → STM32的4个GPIO
    • 74HC595驱动(节省GPIO资源):
      • STM32 SPI/UART → 74HC595移位寄存器 → 数码管段选
      • STM32 GPIO → 位选控制(或级联第二个74HC595)

二、软件编程(使用HAL库)

示例1:直接驱动动态扫描

// 定义引脚(根据实际电路修改)
#define SEG_A  GPIO_PIN_0
#define SEG_B  GPIO_PIN_1
// ... 定义其他段选引脚
#define COM1   GPIO_PIN_8
#define COM2   GPIO_PIN_9
// ... 定义其他位选引脚

// 共阴数码管0-9的段码(a-g顺序)
const uint8_t seg_codes[] = {
  0x3F, 0x06, 0x5B, 0x4F, 0x66, // 0-4
  0x6D, 0x7D, 0x07, 0x7F, 0x6F  // 5-9
};

// 刷新数码管
void refresh_display(uint8_t *digits) {
  static uint8_t pos = 0;

  // 关闭所有位选
  HAL_GPIO_WritePin(GPIOA, COM1|COM2|COM3|COM4, GPIO_PIN_SET);

  // 设置段选数据
  uint8_t code = seg_codes[digits[pos]];
  HAL_GPIO_WritePin(GPIOB, SEG_A, (code>>0)&1 ? SET : RESET);
  // ... 同样设置SEG_B到SEG_G

  // 打开当前位选(共阴需低电平)
  switch(pos) {
    case 0: HAL_GPIO_WritePin(GPIOA, COM1, RESET); break;
    case 1: HAL_GPIO_WritePin(GPIOA, COM2, RESET); break;
    // ... 其他位
  }

  pos = (pos+1) % 4; // 循环到下一位
}

// 在定时器中断中调用(1-5ms一次)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
  uint8_t digits[4] = {1,2,3,4}; // 要显示的数字
  refresh_display(digits);
}

示例2:74HC595驱动(级联方式)

// 引脚定义
#define DATA_PIN  GPIO_PIN_7  // PA7
#define CLK_PIN   GPIO_PIN_5  // PA5
#define LATCH_PIN GPIO_PIN_6  // PA6

void shift_out(uint16_t data) {
  HAL_GPIO_WritePin(GPIOA, LATCH_PIN, RESET); // 准备锁存

  // 发送16位数据(高位在前)
  for(uint8_t i=0; i<16; i++) {
    HAL_GPIO_WritePin(GPIOA, DATA_PIN, (data & 0x8000) ? SET : RESET);
    HAL_GPIO_WritePin(GPIOA, CLK_PIN, SET);  // 上升沿移位
    HAL_GPIO_WritePin(GPIOA, CLK_PIN, RESET);
    data <<= 1;
  }

  HAL_GPIO_WritePin(GPIOA, LATCH_PIN, SET); // 输出锁存
}

// 显示函数(位选+段选合并为16位)
void display_number(uint16_t number) {
  uint8_t digits[4];
  digits[3] = number % 10;       // 个位
  digits[2] = (number/10) % 10;  // 十位
  // ... 拆分其他位

  static uint8_t pos = 0;
  uint16_t output = (1 << (pos+8)) | seg_codes[digits[pos]]; // 位选+段选
  shift_out(output);
  pos = (pos+1) % 4;
}

三、关键注意事项

  1. 动态扫描频率:建议刷新率 > 50Hz(每位显示时间1-5ms)
  2. 限流电阻:每个段选引脚串联100-330Ω电阻
  3. 驱动能力
    • 直接驱动时使用GPIO推挽输出
    • 多位数码管建议增加三极管驱动位选端
  4. 消隐处理:切换位选时先关闭显示,避免鬼影

调试技巧:先用静态显示测试单个数码管,再扩展为动态扫描。使用逻辑分析仪检查时序信号是否符合74HC595的要求(建立/保持时间)。

四、扩展建议

完整工程请参考STM32CubeMX配置GPIO/SPI+TIM,结合上述代码实现动态显示。

简述led数码管的类型和显示原理

LED数码管是一种常见的显示设备,广泛应用于各种电子设备和系统中。本文将介绍LED数码管的类型和显示原理,以帮助读者更好地了解这种设备。 LED数码管

2024-08-29 09:11:44

共阳极数码管和共阴极数码管的区别

共阳极数码管和共阴极数码管的区别 数码管是由许多发光二极管(LED)组成

2023-09-26 16:38:12

基于单片机的数码管实验 八段数码管简介

在我们生活中随处可见数码管的应用,数码管的应用形式多种多样,抛开事物表象,深入到它的本质,正所谓万变不离其中,数码管应用的原理都是基本相通的。本

2023-07-26 16:37:25

STM32--数码管显示使用

STM32 – 数码管显示简介1.硬件部分STM32F103C8T6 最小系统板 一位共阴

资料下载 佚名 2021-12-24 19:32:22

STM32F103的按键控制数码管加减仿真

STM32F103的按键控制数码管加减仿真

资料下载 Gd12 2021-06-21 09:12:50

如何识别LED数码管

  在电子制作中,经常会用到数码管。所以对于数码管的识别也就必不可免,这里作者将自己制作中整理的资料记录下来,供大家参考。

资料下载 佚名 2020-06-02 16:45:12

动态数码管的介绍和工作原理及程序详细说明

什么是动态数码管 (1)数码管还是原来的数码管(共阳极或共阴极均可);动态数码管

资料下载 生龙活虎3 2019-08-30 17:28:00

什么是数码管?使用51单片机玩转数码管的详细资料免费下载使用

数码管是由多个发光二极管封装在一起,而组成的“8”字型元器件。一般开发板上所用到的是四位共阳极(或者共阴极)的数码管,也就是说,是将

资料下载 123 2019-08-01 17:34:00

数码管的扫描

数码管的扫描方式介绍

2023-05-03 20:58:45

数码管的工作原理是什么

分为共阳极数码管和共阴极数码管。 共阳极数码管的8个发光二极管的阳极连接

2021-08-20 17:40:17

STM32数码管显示简介

STM32 – 数码管显示简介1.硬件部分STM32F103C8T6 最小系统板一位共阴

2021-08-04 08:51:18

数码管驱动

1、共阴数码管和共阳数码管的点亮方式区别 对于共阴极数码管来说,当某个发光二极管

2019-12-21 12:13:35

LED数码管的结构_led数码管安装教程

本文主要介绍了LED数码管的结构及安装教程。

2019-10-09 14:35:29

七段数码管驱动方式_七段数码管怎么

本文首先介绍了七段数码管驱动方式,其次介绍了七段数码管引脚图,最后介绍了七段数码管引脚连接方法。

2019-10-09 11:16:09

led数码管怎么接线_LED数码管的测试

本文主要介绍了LED数码管的安装接线方式及LED数码管的测试方法。

2019-10-09 10:44:50

7天热门专题 换一换
相关标签