标题: 我这个程序有个bug就是倒数到4482得时候直接变成4480了,没有经过4481.请问一下是.... [打印本页]

作者: 小天才哥哥    时间: 2019-5-26 09:23
标题: 我这个程序有个bug就是倒数到4482得时候直接变成4480了,没有经过4481.请问一下是....
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar number[4],a;
uint num=4500,cen;
void time()
{
TMOD=0x01;
TH0=0xfc;
TL0=0x67;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
time();
while(1)
{
  if(cen>1000)
  {
   cen=0;
   number[0]=seg[num%10];
   number[1]=seg[num/10%10];
   number[2]=seg[num/100%10];
   number[3]=seg[num/1000%10];
   num--;
   if(num==4480)
   {
    number[0]=seg[4480%10];
    number[1]=seg[4480/10%10];
    number[2]=seg[4480/100%10];
    number[3]=seg[4480/1000%10];
    while(1);
   
   }
  }
}
}
void timer() interrupt 1
{
uchar i;
TH0=0XFC;
TL0=0X67;
cen++;
switch(i)
{
  case 0:P1=0x01;i++;P0=number[0];break;
  case 1:P1=0x02;i++;P0=number[1];break;
  case 2:P1=0x04;i++;P0=number[2];break;
  case 3:P1=0x08;i=0;P0=number[3];break;
}
}


作者: xuyaqi    时间: 2019-5-26 10:24
实际上有num=4481这个过程,只是停的时间短,没有观测到。
作者: Weit8    时间: 2019-5-26 10:37
你把:while(1)
{
  if(cen>1000)
  {
   cen=0;
   number[0]=seg[num%10];
   number[1]=seg[num/10%10];
   number[2]=seg[num/100%10];
   number[3]=seg[num/1000%10];
   num--;
   if(num==4480)
   {
    number[0]=seg[4480%10];
    number[1]=seg[4480/10%10];
    number[2]=seg[4480/100%10];
    number[3]=seg[4480/1000%10];
    while(1);
   
   }
  }
这一段代码替换成:
while(1)
{
  if(cen>1000)
  {
   cen=0;
   if(num>4480)
   {
     number[0]=seg[num%10];
     number[1]=seg[num/10%10];
     number[2]=seg[num/100%10];
     number[3]=seg[num/1000%10];
     num--;
   }
   else
   {
     number[0]=seg[4480%10];
     number[1]=seg[4480/10%10];
     number[2]=seg[4480/100%10];
     number[3]=seg[4480/1000%10];
     while(1);
   }
  }



作者: 问青天磕大地    时间: 2019-5-26 10:50
这个问题我也遇到过,应该是定时太短,if还没检测到,定时中断里的cen又执行了加动作,所以一直执行不了!
作者: wulin    时间: 2019-5-26 11:00
num--;放的位置不当,4481的过程是有的,只是时间太短暂,你看不到而已。
void main()
{
        time();
        while(1)
        {
                if(cen>1000)
                {
                        cen=0;
                        num--;
                        number[0]=seg[num%10];
                        number[1]=seg[num/10%10];
                        number[2]=seg[num/100%10];
                        number[3]=seg[num/1000%10];

                        if(num==4480)
                        {
                                number[0]=seg[4480%10];
                                number[1]=seg[4480/10%10];
                                number[2]=seg[4480/100%10];
                                number[3]=seg[4480/1000%10];
                                while(1);
                        }
                }
        }
}
作者: 47okey    时间: 2019-5-26 12:19
改成 if(num==4479) 就能显示4481
因为你的显示是在 num-- 之前 ,所以这里要多减1
另外,if(num==4479)
   {
    //number[0]=seg[4480%10]; //因为已经显示4480了,所以可以不用这几条
    //number[1]=seg[4480/10%10];
   // number[2]=seg[4480/100%10];
   // number[3]=seg[4480/1000%10];
    while(1);
   
   }
作者: 47okey    时间: 2019-5-26 12:26
wulin 发表于 2019-5-26 11:00
num--;放的位置不当,4481的过程是有的,只是时间太短暂,你看不到而已。
void main()
{

num放到前面,有个问题,上电是显示4499而不是4500
作者: wulin    时间: 2019-5-26 13:49
47okey 发表于 2019-5-26 12:26
num放到前面,有个问题,上电是显示4499而不是4500

这个问题处理极其简单,main()程序初始化时就把缓存赋初值即可
void main()
{
        time();
        number[0]=seg[num%10];
        number[1]=seg[num/10%10];
        number[2]=seg[num/100%10];
        number[3]=seg[num/1000%10];
        while(1)
        {
                if(cen>1000)
                {
                        cen=0;
                        num--;
                        number[0]=seg[num%10];
                        number[1]=seg[num/10%10];
                        number[2]=seg[num/100%10];
                        number[3]=seg[num/1000%10];

                        if(num==4480)
                        {
                                number[0]=seg[4480%10];
                                number[1]=seg[4480/10%10];
                                number[2]=seg[4480/100%10];
                                number[3]=seg[4480/1000%10];
                                while(1);
                        }
                }
        }
}
作者: 幻剑心    时间: 2019-5-26 16:37
最外面的while最前面加个延时就行了。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1