• STM32驱动2位数码管


    数码管简介

    一般我们用的数码管是8位的,其实就是在一个模块中集成了8个LED,分别显示笔划,如下图
    在这里插入图片描述
    电路原理如下,若是将所有LED的N极连接到一起,叫共阴,若是将P连接到一起,叫共阳。
    在这里插入图片描述

    我用红字标出了每个笔划对应的定义。
    2位数码管,就是有2个8段的显示,并把它们集成到了一起,其abcdefg和dp脚都连到了一起,2个公共端分别表示左边和右边的选择。
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    驱动

    本例中我用的是共阳2段数码管,以下均以此为例。
    对于1位的数码管很简单,以共阳为例,将3脚和8脚接地,其他引脚接单片机的IO口,输出低电平时,相应的笔划就会亮了。
    一般来说共阳用得多些,因为许多单片机的IO口驱动能力,高低电平的最大驱动电流是不同的,灌电流时驱动能力要强些。STM32是推挽输出,不存在这个问题,共阳还是共阴随意,对于F1系列,只要总电流不超过150mA即可。(印象中是这个值,不对请指正)
    但是对于2位或更多的数码管来说,这个方法就不行了,需要用到交错扫描的方式。
    即先只显示第1位的要显示的数字,比如1,此时其他的位数都不亮。
    再显示第2位的数字,比如9。此时其他的位数也都不亮。
    再显示第1位的数字比如1
    再显示第2位的数字比如9
    如此循环,即可以在2位或多位数码管上显示相应信息,每位显示的时间不要太长,会发生闪烁。也不要太短,灯的亮度会变小。
    为了不占用单片机的处理能力,这个扫描的工作应该放到中断中完成。

    实现

    所有相关管脚设置为GPIO的输出功能,推挽方式
    本例中我用的是共阳2段数码管。
    我把显示0~9做了一个表格,A~F请自行实现
    以0为例,只有G不亮,所以G没有驱动
    我的A段是接到PB3上的,其余类推
    在这里插入图片描述
    整理后如下图,只是将所有属于一个GPIO_PORT的归拢到了一起
    在这里插入图片描述

    以显示1.9为例,

    1. 左边的公共端9脚输出高电平,准备显示左边这个数码管。
      PA15和PA12需要输出低电平,也就是GPIOA->ODR & (~0x0000)。
      PB3和4为高,即GPIOB->ODR & (~0x0000)
      PD32均为低,PD1为高,即GPIOD->ODR & (~0x000c)
    2. 将dp所连的IO口PC1置低,以显示小数点。
    3. 延时10ms,此时可以显示数字1
    4. 右边的公共端输出高电平,准备显示右边数码管。
      GPIOA->ODR & (~0x0000)
      GPIOA->ODR & (~0x0000)
      GPIOA->ODR & (~0x0000)
    5. dp所连的IO口PC1置高,不显示右边的小数点。
    6. 延时10ms,显示右边的数字9
    7. 循环即可显示1.9了

    定义一个二给数组,将GPIOA,B,D的数据放到数组里面。

    完整代码如下

    下面只给出了演示功能的代码,实际使用时,需要将代码放到定时器中断内,第一次进中断时显示第1位,第二次进中断时显示第2位,如此循环就可以了。

    u16 dpy_value[10][3] = {0x9000, 0x0008, 0x000e,
                            0x0000, 0x0000, 0x000c,
                            0x8000, 0x0018, 0x0006,
                            0x0000, 0x0018, 0x000e,
                            0x1000, 0x0010, 0x000c,
                            0x1000, 0x0018, 0x000a,
                            0x9000, 0x0018, 0x000a,
                            0x0000, 0x0008, 0x000c,
                            0x9000, 0x0018, 0x000e,
                            0x1000, 0x0018, 0x000e};
    
    
    void dpy_display(u8 dpyL, u8 dot, u8 dpyR)
    {
      DPY_L(1); // 左边显示
      DPY_R(0);
      GPIOA->ODR |= 0x9000;	//先将所有连接到数码管的引脚全部拉高
      GPIOB->ODR |= 0x0018;
      GPIOD->ODR |= 0x000e;
      GPIOA->ODR &= ~dpy_value[dpyL][0]; //再将相关的引脚拉低
      GPIOB->ODR &= ~dpy_value[dpyL][1];
      GPIOD->ODR &= ~dpy_value[dpyL][2];
      if(dot==0)
        DPY_DP(1);
      else
        DPY_DP(0);
      HAL_Delay(5);
    
      DPY_L(0); // 右边显示
      DPY_R(1);
      GPIOA->ODR |= 0x9000;
      GPIOB->ODR |= 0x0018;
      GPIOD->ODR |= 0x000e;
      GPIOA->ODR &= ~dpy_value[dpyR][0];
      GPIOB->ODR &= ~dpy_value[dpyR][1];
      GPIOD->ODR &= ~dpy_value[dpyR][2];
      DPY_DP(1);
      HAL_Delay(5);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    如下图
    在这里插入图片描述

  • 相关阅读:
    SD NAND 的 SDIO在STM32上的应用详解(中篇)
    SQL后计算的利器SPL
    【MATLAB教程案例15】基于WOA鲸鱼优化算法的函数极值计算matlab仿真及其他应用
    对享元模式的理解
    过拟合、欠拟合、泛化误差、训练误差
    大模型之Prompt研究和技巧
    使用baostock获取上市公司情况
    MacOS原版镜像iso下载
    2057. 值相等的最小索引
    美团面试:说说Netty的零拷贝技术?
  • 原文地址:https://blog.csdn.net/13011803189/article/details/126560474