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条回答
3314lzp
1楼-- · 2019-08-15 14:33
 精彩回答 2  元偷偷看……
3314lzp
2楼-- · 2019-08-15 20:22
看了一下你的程序,第一位才是最后处理的。那会不会是因为延时短了呀?delay_ms(10)试试。
q247341184
3楼-- · 2019-08-15 21:52
3314lzp 发表于 2017-8-11 15:18
看了一下你的程序,第一位才是最后处理的。那会不会是因为延时短了呀?delay_ms(10)试试。

我试过很多次了,5,、10、15、20都是一样的现象,差别在于闪烁与否。而且我试了一下其他的IO口,我发现在其他IO口时候是没问题的。所以我才觉得管脚问题,但是由于布线,我必须放在这,那如果我要是关了GPIO的复用功能就是NJTRST功能的话有用嘛?
q247341184
4楼-- · 2019-08-16 02:44
wxjhby 发表于 2017-8-11 14:27
5ms 可以做好多事情了,定时器定时,程序可以做其他事情

求指点思路!!!!
q247341184
5楼-- · 2019-08-16 08:30
3314lzp 发表于 2017-8-11 15:10
定时器驱动数码管,数码管的变化会非常准确,比如说设计个数字钟呀之类的。

我用的是内部的时钟源,内部的时钟源本身就会具备相对较大的误差,而且我在做的应该不会太精确的要求时钟,那是不是可以就用我现在写出的这种方法来执行呢?
jiutianshenjian
6楼-- · 2019-08-16 13:54
 精彩回答 2  元偷偷看……

一周热门 更多>