多位数加减数码管显示,用定时器消除闪烁问题

2019-07-16 06:06发布

    while(!key_dec);
    delay_ms(10);
    while(!key_dec);
    if(num>0)
     num--;
    else
     num=999;
   
   }
  }
  if(num>999)
   tempdata[3]=duma[num/1000];
  else
   tempdata[3]=0;
  if(num>99)
   tempdata[2]=duma[num%1000/100];
  else
   tempdata[2]=0;
  if(num>9)
  tempdata[1]=duma[num%1000%100/10];
  else
   tempdata[1]=0;         
  tempdata[0]=duma[num%1000%100%10];
  display(0,3);
}
}
/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三
个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void display(uchar fisbit,uchar num)
{
static uchar i;
for(i=0;i<num;i++)
{
  P0=0;//清空数据,防止交替重影
  dula=1;
  dula=0;
  
  P0=wema[i+fisbit];
  wela=1;
  wela=0;

  P0=tempdata;
  dula=1;
  dula=0;
  delay_ms(2);
}
}

void delay_us2x(uchar t)
{
while(t--);
}
void delay_ms(uchar t)
{
while(t--)
{
  delay_us2x(245);
   delay_us2x(245);
}
}
void init()
{
key_add=1;
key_dec=1;
}

这个按键盘可以实现数码管显示加减,不过有闪烁,下面这个程序是想通过定时器消除数码管闪烁,可是按键盘数码管不变化,一直显示0
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key_add=P3^3;
sbit key_dec=P3^4;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code duma[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code wema[]={
0x7f,0xbf,0xdf,0xef,0xf7,
0xfb,0xfd,0xfe};
uchar tempdata[8];
void display(uchar fisbit,uchar num);
void delay_us2x(uchar t);
void delay_ms(uchar t);
void init();
void init_timer0();
void main()
{
uint num=0;
init();
init_timer0();
while(1)
{
  if(!key_add)
  {
   delay_ms(10);
   if(!key_add)
   {
    while(!key_add);
    //delay_ms(10);
    //while(!key_add);
     num++;
    if(num==1000)
     num=0;
   }
  }
  if(!key_dec)
  {
   delay_ms(10);
   if(!key_dec)
   {
    while(!key_dec);
    //delay_ms(10);
    //while(!key_dec);
    if(num>0)
     num--;
    else
     num=999;
   
   }
  }
  if(num>999)
   tempdata[3]=duma[num/1000];
  else
   tempdata[3]=0;
  if(num>99)
   tempdata[2]=duma[num%1000/100];
  else
   tempdata[2]=0;
  if(num>9)
  tempdata[1]=duma[num%1000%100/10];
  else
   tempdata[1]=0;         
  tempdata[0]=duma[num%1000%100%10];
  //display(0,8);
}
}
void display(uchar fisbit,uchar num)
{
static uchar i;
for(i=0;i<num;i++)
{
  P0=0;//清空数据,防止交替重影
  dula=1;
  dula=0;
  
  P0=wema[i+fisbit];
  wela=1;
  wela=0;

  P0=tempdata;
  dula=1;
  dula=0;
  delay_ms(1);
}
}
void delay_us2x(uchar t)
{
while(t--);
}
void delay_ms(uchar t)
{
while(t--)
{
  delay_us2x(245);
   delay_us2x(245);
}
}
void init_timer0()
{
TMOD|=0x01;
TH0=(65536-2000)/256;    // 2ms
  TL0=(65536-2000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-2000)/256;   
  TL0=(65536-2000)%256;
display(0,8);
}
void init()
{
key_add=1;
key_dec=1;
}
求大侠解决,我都在这里卡了几个小时了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
电纸人
1楼-- · 2019-07-16 08:36
 精彩回答 2  元偷偷看……
z00
2楼-- · 2019-07-16 12:12
处理按键的时候,关闭定时器

把定时器时间修改的小一些
lqwuliang
3楼-- · 2019-07-16 12:58
可以用状态机的思想写数码管,按键处理时互不影响

评分

参与人数 1积分 +10 收起 理由 zhou2sheng + 10 感谢您的参与,您的支持是我们最大的动力..

查看全部评分

youzizhile
4楼-- · 2019-07-16 17:49
多位数加减数码管显示,用定时器消除闪烁问题
我之前做过数码管的动态扫描显示,调节显示速度,同时在下次变化显示前消隐,可以去掉闪烁问题的
heishe1989
5楼-- · 2019-07-16 23:36
路过学习一下
依然落叶飘零
6楼-- · 2019-07-17 04:12
 精彩回答 2  元偷偷看……

一周热门 更多>