mei13634698139 发表于 2012-10-6 22:04:45

数码管动态扫描时钟问题 求助高手解释

怎么调试都是闪烁 而且闪烁的越快秒走的也越快求高手指点

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
void display(uchar hh,uchar hl,uchar mh,uchar ml,uchar sh,uchar sl);
uchar a1,a2,a3,a4,a5,a6;
uchar hl,hh,ml,mh,sh,sl,aa,s,m,h,i;
uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,
                     0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar code seg[]={0,4,8,12,16,20,24,28,32};//由2.42.32.2138译码器导出位选

uchar LedOut[]={0,0,0x40,0,0,0x40,0,0};       
void DelayMs(uint z)
{
   
        uint x,y;
        for(x=z;x>0;x--)
           for(y=110;y>0;y--);
}

void delay_us(unsigned int n)
{
if (n == 0)
{
return ;
}
while (--n);
}
uchar trans(uchar h,uchar m,uchar s)//时间转换
{
       
        hh=h/10;
        hl=h%10;
        mh=m/10;
        ml=m%10;
        sh=s/10;
        sl=s%10;
        return (hh,hl,mh,ml,sh,sl) ;
}



void T0_INT()
{
    TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
}
       
void time()
{
if(aa==20)
                {
                        aa=0;
                        s++;
                        if(s==60)
                        {
                                s=0;
                                m++;
                                if(m==60)
                                {
                                        m=0;
                                        h++;
                                        if(h==24)
                                        h=0;
                                }
                        }
                           trans(h,m,s);
                display(hh,hl,mh,ml,sh,sl);


             }
             
}

void display(uchar hh,uchar hl,uchar mh,uchar ml,uchar sh,uchar sl)//显示函数
{
                     LedOut=DSY_CODE;
                                     LedOut=DSY_CODE;
                                                                            
                                     LedOut=DSY_CODE;                                       
                                       LedOut=DSY_CODE;
                                                                                    
                                     LedOut=DSY_CODE;                  
                                     LedOut=DSY_CODE;
                   for(i=0;i<8;i++)
                          {                          
                             P0=LedOut;
                                  
                                   P2=seg;
                                  DelayMs(15);                                                   
                           }

}
/*主函数*/
void main()
{
       
T0_INT();

          while(1)
          {
                time();
                  }
       
}
void time0() interrupt 1 //T1中断控制时钟运行
{
TH0=0x3c;
TL0=0xb0;
aa++;
}

xfdr 发表于 2012-10-7 22:47:05

void time0() interrupt 1 //T1中断控制时钟运行
{
   TH0=0x3c;
   TL0=0xb0;
   aa++;

      if(aa==20)
               {
                         aa=0;
                         s++;
                         if(s==60)
                         {
                                 s=0;
                                 m++;
                                 if(m==60)
                                 {
                                       m=0;
                                       h++;
                                       if(h==24)
                                       h=0;
                                 }
                         }
             aa=0;
         flag=1
             }
}

         while(1)
         {
               if(flag)
             {
               flag=0;
               trans(h,m,s);
               display(hh,hl,mh,ml,sh,sl);
            }
               
            }

lxa0 发表于 2012-10-7 22:54:46

看不懂C~~~~~~~~~~~~

876192514 发表于 2012-10-8 01:49:36

void time0() interrupt 1 //T1中断控制时钟运行
{
TH0=0x3c;
TL0=0xb0;
aa++;
time();

}

在这里面处理时间 不要放到主程序 但是不要把显示部分也加进入

dongls 发表于 2012-10-8 06:53:50

看楼主的程序,应该是50ms中断一次,你把time()中的s,m,h值放在主函数中,那么在两次中断之间,这个计算程序可以执行无限次.

gvgvfghv 发表于 2012-10-8 10:15:10

把time()第一行中if aa==20改成aa>=20

mei13634698139 发表于 2012-10-16 13:51:16

感谢各位高人,,小弟问题已经解决
页: [1]
查看完整版本: 数码管动态扫描时钟问题 求助高手解释