3位单排数码管控制过程详解

本文详细介绍了单排数码管的控制原理和具体操作流程,重点在于如何避免IO冲突和实现扫描点亮方式,适用于资源紧张的嵌入式硬件设计。通过STM8S105单片机为例,说明了数码管的初始化设置和显示数字0的操作步骤。
摘要由CSDN通过智能技术生成

单排引脚数码管

  • 我经常使用的是那种有共阴 共阳的 数码管。那种数码管每个需要IO引脚
    比较多,还需要额外的驱动芯片译码器什么的,成本高。在特殊情况下,IO资源比较紧张的餐品是,IO的数量则显得非常昂贵。使用这种单排的可以使用单片机直接驱动,中间加个限流电阻就可以。单排的价格也不贵。

外形
数码管引脚分布
段码对照

一、控制原理

引脚控制引脚对应

  • 是通过每两个IO引脚相互配合使用来点亮一个段。如图中,我要电量DIG1的A段,那么我需要控制 数码管的pin1 为0、pin6为高
    那么A段就点亮,其它的同理。若想显示个0,那么就 依次点亮 A、B、C、D、E、F 6个Led 。
    注意我这里说的是依次,不是同时点亮这些Led。这是和普通数码管不同的地方。

那好 我们依次点亮那几个led 来显示个数字 0。正常的流程初始化这几个IO的工作模式。然后控制需要的IO 。
Led_A 亮:pin6 =1、pin1=0 ;
Led_B 亮:pin2 =1、pin5=0 ;
Led_C 亮:pin2 =1、pin3=0 ;
Led_D 亮:pin2 =1、pin1=0 ;
Led_E 亮:pin1 =1、pin3=0 ;
Led_F 亮:pin6 =1、pin5=0 ;

那么问题来了这点亮一个0字 ,在LED_A的控制上 需要pin1为低电平,而在Led_F上 pin1需要高电平,这不就冲突了吗。另外若是程序运行起来 ,这点亮的可不止那几个灯。若你在初始化时给IO个初始为高电平或低电平的初始值,那亮的都多了。
问题在哪呢?首先我们要知道,这个数码管的控制要满足的条件是:点亮一个灯,只允许控制该灯的2个IO引脚有高低电平,不允许别的IO有高低电平。
好了,我在使用时刚开始就错了,我同时初始化这6个IO引脚为输出模式。这样我们在控制时,就有好几个与这个引脚有关的灯会亮起来,因为也满足导通条件了啊。

那么应该怎么控制呢,核心思想:我们不能同时设置这6个IO引脚的工作模式输出,只允许同时设置2个IO,用到那个led,就设置和它连接的IO为输出,其余不用的就全部设置为输入。这个没有使用的Led 引脚上就不会满足导通条件了。

二、具体操作流程

使用的是STM8S105
1、为确保不使用的IO 引脚没有 电流输出。首先应把使用6个IO引脚全部设置成输入模式。
2、对需要使用的引脚,即需要点亮Led的两个io引脚设置为输出模式,然后对这两个io 。根据情况一个输出高电平一个输出低电平。

代码:

//用于数码管的引脚重置--6个io 全部设置为浮空输入模式
void SMG_Pin_Reset(void)
{
   
//浮空输入无中断
  GPIO_Init(SMG_GPIO_PORT, (GPIO_Pin_TypeDef)(SMG_PIN1|SMG_PIN2|SMG_PIN3|SMG_PIN4|SMG_PIN5|SMG_PIN6), GPIO_MODE_IN_FL_NO_IT);
}

//HighPinNum 需要设定为高电平的引脚 LowPinNum需要设定为低电平的引脚
//            每次点亮新的Led时都要关闭所有SMG引脚 防止别的LED亮
void SMG_LEDN_Set(u8 HighPinNum,u8 LowPinNum)
{
   
  SMG_Pin_Reset();//重置一次消除残影 关闭所有引脚
  GPIO_Init(SMG_GPIO_PORT, SMG_GetPin(HighPinNum), GPIO_MODE_OUT_PP_LOW_FAST
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值