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条回答
wxjhby
1楼-- · 2019-08-16 16:35
q247341184 发表于 2017-8-11 15:26
求指点思路!!!!

把显示函数放到定时器中断里面,多少ms自己试试, 然后把软件延时去掉  你试试看呗   消影应该也要做一下的
q247341184
2楼-- · 2019-08-16 18:51
wxjhby 发表于 2017-8-11 15:32
把显示函数放到定时器中断里面,多少ms自己试试, 然后把软件延时去掉  你试试看呗   消影应该也要做一下 ...

我看网上例程的消影,好像都是把段选置1,或者位选置0,就是熄灭了,再点亮,我的函数里在位选之前有个大的resetbits(),思路大概就是这样= =,能当做消影吗?
q247341184
3楼-- · 2019-08-16 19:30
jiutianshenjian 发表于 2017-8-11 15:31
不亮的时候,是拉高阴极还是拉低阳极

正常的推挽输出就不亮,确切的说是不是很亮,没有外接上拉或者下拉。
3314lzp
4楼-- · 2019-08-16 21:12
q247341184 发表于 2017-8-11 15:27
我用的是内部的时钟源,内部的时钟源本身就会具备相对较大的误差,而且我在做的应该不会太精确的要求时钟 ...

不太清楚,不过还是建议使用外部晶振。
q247341184
5楼-- · 2019-08-16 23:43
 精彩回答 2  元偷偷看……
q247341184
6楼-- · 2019-08-17 03:13
wxjhby 发表于 2017-8-11 13:20
好好看看PB4他的功能    PB4 I/O FT NJTRST    你不知道调试端口是不能直接作为IO口的么?

我看手册上,好像PB4的主要功能是NJTRST,而复用功能是个其他的,remap里才是PB4。那我如果要用PB4的话是不是在显示代码里 配置一下重映射就行?

一周热门 更多>