本人尝试着自己写直接驱动数码管代码,但是发现了一个很无语的问题,就是四个数第一个总是不亮,且带有轻微鬼影,网上查到的许多方法实验后没用。比如显示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);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
把显示函数放到定时器中断里面,多少ms自己试试, 然后把软件延时去掉 你试试看呗 消影应该也要做一下的
我看网上例程的消影,好像都是把段选置1,或者位选置0,就是熄灭了,再点亮,我的函数里在位选之前有个大的resetbits(),思路大概就是这样= =,能当做消影吗?
正常的推挽输出就不亮,确切的说是不是很亮,没有外接上拉或者下拉。
不太清楚,不过还是建议使用外部晶振。
我看手册上,好像PB4的主要功能是NJTRST,而复用功能是个其他的,remap里才是PB4。那我如果要用PB4的话是不是在显示代码里 配置一下重映射就行?
一周热门 更多>