STM32直接驱动数码管问题。

2019-08-14 16:40发布

本人尝试着自己写直接驱动数码管代码,但是发现了一个很无语的问题,就是四个数第一个总是不亮,且带有轻微鬼影,网上查到的许多方法实验后没用。比如显示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);
}
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
38条回答
q247341184
1楼-- · 2019-08-17 05:16
lanlzp 发表于 2017-8-11 13:56
也不能说 不能当IO口用,在关掉调试功能的时候还是可以用的吗

我看手册上,好像PB4的主要功能是NJTRST,而复用功能是个其他的,remap里才是PB4。那我如果要用PB4的话是不是在显示代码里 配置一下重映射就行?
jiutianshenjian
2楼-- · 2019-08-17 06:43
本帖最后由 jiutianshenjian 于 2017-8-11 15:42 编辑
q247341184 发表于 2017-8-11 15:36
正常的推挽输出就不亮,确切的说是不是很亮,没有外接上拉或者下拉。

亮和灭如何控制的?你第一位数字2,间隔10ms其他间隔5ms。
break判断放到延时前面。
q247341184
3楼-- · 2019-08-17 11:07
3314lzp 发表于 2017-8-11 15:37
不太清楚,不过还是建议使用外部晶振。

0.0.。。。非常感谢。。
q247341184
4楼-- · 2019-08-17 13:06
 精彩回答 2  元偷偷看……
jiutianshenjian
5楼-- · 2019-08-17 16:36
q247341184 发表于 2017-8-11 15:40
就是IO口置0或者1.直接连的板子。

你没懂我的意思,我以前做的也有微亮,但是本来应该灭的。
当初找到原因是灭时我拉高了阴极,这样是不合适的。灭时拉低阳极就好了。
你的可能是延时问题,可能没碰到我那种情况。
q247341184
6楼-- · 2019-08-17 20:10
jiutianshenjian 发表于 2017-8-11 15:46
你没懂我的意思,我以前做的也有微亮,但是本来应该灭的。
当初找到原因是灭时我拉高了阴极,这样是不合 ...

可能是不太一样,不过也算长见识了,也许会遇到你的情况,到时候就用你的方法解决就好了

一周热门 更多>