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

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;
}
求大侠解决,我都在这里卡了几个小时了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。