本人尝试着自己写直接驱动数码管代码,但是发现了一个很无语的问题,就是四个数第一个总是不亮,且带有轻微鬼影,网上查到的许多方法实验后没用。比如显示2981,981正常显示,但是2就特别暗且带鬼影。求大神指点!!
附上代码:
SMG.c 代码
#include "SMG.h"
#include "stm32f10x.h"
#include "delay.h"
void SMG_Init(void)
{
//为方便大家看,此处代码省略,其作用是定义IO口 PB4-PB15,其中PB4-PB7是位选,PB8-PB15是段选
}
void DisPlayNum(int n)
{
if (n < 9999)
{ int i;
int s;
s = n;
i=0;
for (i=0;i<4;i++)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7| //Reset所有IO口
GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|
GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15 );
switch (i) //位选
{
case 0:
GPIO_SetBits(GPIOB,GPIO_Pin_7);
break;
case 1:
GPIO_SetBits(GPIOB,GPIO_Pin_6);
break;
case 2:
GPIO_SetBits(GPIOB,GPIO_Pin_5);
break;
case 3:
GPIO_SetBits(GPIOB,GPIO_Pin_4);
break;
}
switch (s % 10) //段选
{
case 0:
GPIO_SetBits(GPIOB,GPIO_Pin_14|GPIO_Pin_15); // 0
break;
case 1:
GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); // 1
break;
case 2:
GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_13|GPIO_Pin_15); // 2
break;
case 3:
GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_15); // 3
break;
case 4:
GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15); // 4
break;
case 5:
GPIO_SetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_15); // 5
break;
case 6:
GPIO_SetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_15); // 6
break;
case 7:
GPIO_SetBits(GPIOB,GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); // 7
break;
case 8:
GPIO_SetBits(GPIOB,GPIO_Pin_15); // 8
break;
case 9:
GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_15); // 9
break;
}
s = s / 10;
delay_ms(5);
if (s==0)
break;
}
}
}
main.c代码:
此处省略include部分和Init部分
int main(void)
{
while(1)
{
DisPlayNum(2981);
delay_ms(5);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
老铁我给关了,但是出了另一个情况,就是原先不亮的PB4口,变成了最亮的,其他三位反而不亮了
有没有作用你都得改啊,四个时间肯定得一样啊不然肯定有亮有暗
你第一个亮的时间是其他3个的2倍吧?
明白你的意思了,做了微调已经显示出来了。非常感谢
{
while(1)
{
DisPlayNum(2981);
delay_ms(5); //这个去掉 因为这个导致最后一个2 显示时间长了
}
}
好。我试下、
一周热门 更多>