本人尝试着自己写直接驱动数码管代码,但是发现了一个很无语的问题,就是四个数第一个总是不亮,且带有轻微鬼影,网上查到的许多方法实验后没用。比如显示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的主要功能是NJTRST,而复用功能是个其他的,remap里才是PB4。那我如果要用PB4的话是不是在显示代码里 配置一下重映射就行?
亮和灭如何控制的?你第一位数字2,间隔10ms其他间隔5ms。
break判断放到延时前面。
0.0.。。。非常感谢。。
你没懂我的意思,我以前做的也有微亮,但是本来应该灭的。
当初找到原因是灭时我拉高了阴极,这样是不合适的。灭时拉低阳极就好了。
你的可能是延时问题,可能没碰到我那种情况。
可能是不太一样,不过也算长见识了,也许会遇到你的情况,到时候就用你的方法解决就好了
一周热门 更多>