[求助] 下面是我从0到1000计数,可是为什么我记到6就错了呢,我是哪里错了啊

ylf175300   2012-2-4 09:45 楼主

下面是我从0到1000计数,可是为什么我记到6就错了呢,我是哪里错了啊,我是新手水平不高的

 

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar aa,unmp,qian,bai,shi,ge;
void dingshi();
void dealy(uint z);
void xs(uchar qian,uchar bai,uchar shi,uchar ge);
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,
0x07,0x7f,0x6f};

void main()
{
 dingshi();
  while(1)
   {
   if(aa==20)
   {
     aa=0;
    unmp++;
    if(unmp==1000)
    unmp=0;
    qian=unmp/1000;
    bai=unmp/100%10;
    shi=unmp/10%10;
    ge=unmp%10;

   }
  xs(qian,bai,shi,ge);
 }


}
void dingshi()
{
 EA=1;
 ET0=1;
 TMOD=0x01;
 TR0=1;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 unmp=0;
}
void et0() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 aa++;
}
void xs(uchar qian,uchar bai,uchar shi,uchar ge)
{
 P1=table[qian];
 P0=0xf7;
 dealy(5);

 P1=table[bai];
 P0=0xfb;
 dealy(5);

 P1=table[shi];
 P0=0xfd;
 dealy(5);

 P1=table[ge];
 P0=0xfe;
 dealy(5);

}
void dealy(uint z)
{
 uint x,y;
 for(x=200;x>0;x--)
 for(y=z;y>0;y--);

}

回复评论 (11)

void xs(void)
{

switch (aa&3) {

case 0:
 P1=table[qian];
 P0=0xf7;

break;

case 1:

 P1=table[bai];
 P0=0xfb;

break;

case 2:

 P1=table[shi];
 P0=0xfd;

break;

case 3:

 P1=table[ge];
 P0=0xfe;
break;

}

}

geshibaiqian已经是全局量了没必要在当参数传一次了,aa为扫描控制变量

unsigned int unmp;   //16位

 

while(1)
   {

    unmp++;
    if(unmp==1000)    unmp=0;
    qian=(unsinged char)(unmp/1000);
    bai==(unsinged char)(unmp/100%10);
    shi==(unsinged char)(unmp/10%10);
    ge=unmp%10;

   
  xs();
}

这几个除比较累,不如把除法变减法

[ 本帖最后由 huo_hu 于 2012-2-4 10:51 编辑 ]
点赞  2012-2-4 10:47

回复 沙发 huo_hu 的帖子

void xs(uchar qian,uchar bai,uchar shi,uchar ge)
{
P1=table[qian];
P0=0xf7;
dealy(5);

P1=table[bai];
P0=0xfb;
dealy(5);

P1=table[shi];
P0=0xfd;
dealy(5);

P1=table[ge];
P0=0xfe;
dealy(5);

}

减法怎么变啊
点赞  2012-2-4 14:32
geshibaiqian=0;
while (value>=1000) {qian++;value-=1000;}
  while(value>=100) {bai++;value-=100;}
...
点赞  2012-2-4 18:21

楼主我知道你是啥情况了 我曾经也碰到过类似情况 主要是你数码管显示函数的延时太长了 你把delay(5)改成delay(1)就可以啊原因如下:当你正在xs()函数运行时 aa已经加1了,但是这时又显示不出来 所以导致你那个问题啦

 

或者你把那个主函数判断语句那块搬到定时子程序里  就完全没问题啦

[ 本帖最后由 Learner_new 于 2012-2-4 19:33 编辑 ]
点赞  2012-2-4 19:31
我用板子给你测了一下发现还有一个问题  unmp不能用uchar定义 只能到256  要用uint定义
点赞  2012-2-4 19:38

根据我的判断,楼主清零位置不对

if(aa==20)
   {
     aa=0;
    unmp++;
    if(unmp==1000)
    unmp=0;
    qian=unmp/1000;
    bai=unmp/100%10;
    shi=unmp/10%10;
    ge=unmp%10;

   }

不应在主程序清零

一但中断程序的AA大于20,嘿嘿,楼主就永远没有机会了
http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2012-2-6 08:11
告诫大家程序中尽量不要使用if(aa==20)
{
aa=0;
}
有经验的都用if(aa>=20)
{
aa=0;
}
点赞  2012-2-14 16:25

可以参考一下我的

#include
#include
#define uint unsigned int
#define uchar unsigned char
void delayms(uint);
void display(uchar,uchar,uchar,uchar);
uchar code table[]={
   0x3f,0x06,0x5b,0x4f,
   0x66,0x6d,0x7d,0x07,
   0x7f,0x6f,0x77,0x7c,
   0x39,0x5e,0x79,0x71};
uchar qian,bai,shi,ge;
uint num,num1,num2;
sbit dula=P2^0;
sbit wela=P2^1;
void main()
{
  TMOD=0x11;
  TH0=(65536-45872)/256;
  TH0=(65536-45872)%256;
  EA=1;
  ET0=1;
  TR0=1;
  while(1)
  {
    display(qian,bai,shi,ge);
  }
}
void display(uchar qian,uchar bai,uchar shi,uchar ge)
{
   wela=1;
   P1=0x08;
   wela=0;
   P1=0x00;
   dula=1;
   P1=~table[qian];
   dula=0;
   delayms(1);
   
        wela=1;
   P1=0x04;
   wela=0;
   P1=0x00;
   dula=1;
   P1=~table[bai];
   dula=0;
   delayms(1);

   wela=1;
   P1=0x02;
   wela=0;
   P1=0x00;
   dula=1;
   P1=~table[shi];
   dula=0;
   delayms(1);

   
   wela=1;
   P1=0x01;
   wela=0;
   P1=0x00;
   dula=1;
   P1=~table[ge];
   dula=0;
   delayms(1);
}

void delayms(uint xms)
{
  uint i,j;
  for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}

void T0_time() interrupt 1
{
  TH0=(65536-45872)/256;
  TH0=(65536-45872)%256;
  num2++;
  if(num2==2)
  {
     num2=0;
     num++;
     if(num==1001)
     num=0;
          qian=num/1000;
          bai=num/100;
     shi=num%100/10;
     ge=num%10;
  }
}
点赞  2012-2-14 16:54
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TH0=(65536-45872)%256;
num2++;
if(num2==2) 这里应该是 if(num2==20)   记到20是一秒
点赞  2012-2-14 16:57
学习了
点赞  2012-2-15 16:23
你把判断和显示那段   写到中断里去  主函数  直接
void main()
{
dingshi();
while(1);
}
点赞  2012-2-17 17:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复