单排引脚数码管
- 我经常使用的是那种有共阴 共阳的 数码管。那种数码管每个需要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