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);

}

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

  • 9
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32是一款广泛使用的微控制器系列,它具有丰富的外设和强大的处理能力,可以用来驱动各种外部设备,包括8数码管。 要驱动8数码管,首先需要了解数码管的工作原理。8数码管通常由8个LED组成,每个LED代表一个数字或字符的一部分。通过控制每个LED的亮灭状态,可以显示不同的数字或字符。 在STM32中,可以使用GPIO(通用输入输出)外设来控制数码管。以下是一种常见的驱动方法: 1. 连接硬件:将数码管的8个引脚分别连接到STM32的8个GPIO引脚上。确保连接正确,并根据数码管的规格确定合适的电源电压和电流。 2. 配置GPIO:在STM32的代码中,需要配置相应的GPIO引脚为输出模式。可以使用寄存器设置或者使用STM32提供的库函数进行配置。 3. 控制数码管:通过设置GPIO引脚的电平状态来控制数码管的亮灭状态。根据需要显示的数字或字符,设置对应的GPIO引脚为高电平(亮)或低电平(灭)。 4. 刷新显示:由于数码管是静态显示设备,需要定时刷新显示内容。可以使用定时器中断或者延时函数来控制刷新频率,不断更新GPIO引脚的状态,以实现动态显示效果。 需要注意的是,具体的驱动方法可能会因不同的数码管型号和STM32系列而有所差异。在实际应用中,可以参考数码管STM32的相关文档和示例代码,以确保正确地驱动8数码管

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值