51单片机显示时分,求各位帮忙看看能否实现功能

icu   2010-4-18 07:17 楼主
                  
要求:b0 b1 b2 b3 位始终显示0;b4 b5显示分钟,b6 b7显示秒                                                    


                                                       #include
                                                unsigned int t=0,z=0;
                                                code unsigned char BCDto7SEG[10]={0x5f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ;
                                                unsigned char d[8]={0,0,0,0,0,0,0,0};
                                            void delay(void)
                                                {unsigned int i;
                                                for(i=0;i<123;i++);
                                                }
                                                void display(void)
                                                { unsigned char i;
                                                for(i=0;i<8;i++)
                                                {P0=BCDto7SEG[d];
                                                P2=1<                                                 delay();
                                                P2=0;
                                                }
                                                }
                 
                                                       int main(void)
                                                     {unsigned char i=0;
                                                         while(1)
                                                     {if(++i>=125)
                                                        {if(++t>5959)t=0;
                                                           d[7]=t%60%10;
                                                            d[6]=t%60/10;
                                                             d[5]=t/60%10;
                                                             d[4]=t/600;
                                                                i=0;

                       
                                                                        }
                                                       d[5]=t/60%10|0x80;
                                                           display();
                 
                                                              }       
                                                                       }
                 

                 
                 
                 
       
                 
               

          
          
          
          

                 

回复评论 (3)

首先要说的是,这个程序的书写风格真的很差,关键部位连注释都没,想看懂真的很费劲
现整理一下


  1. #include

  2. unsigned int t=0,z=0;
  3. code unsigned char BCDto7SEG[10]={0x5f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ;
  4. unsigned char d[8]={0,0,0,0,0,0,0,0};

  5. void delay(void)
  6. {
  7.     unsigned int i;
  8.     for(i=0;i<123;i++)
  9.         ;
  10. }

  11. void display(void)
  12. {
  13.     unsigned char i;
  14.     for(i=0;i<8;i++)
  15.     {
  16.         P0=BCDto7SEG[d[i]];
  17.         P2=1<
  18.         delay();
  19.         P2=0;  
  20.     }
  21. }
  22.   
  23. int main(void)
  24. {
  25.     unsigned char i=0;  
  26.     while(1)
  27.     {
  28.         if(++i>=125)
  29.         {
  30.             if(++t>5959)
  31.                 t=0;
  32.             d[7]=t%60%10;
  33.             d[6]=t%60/10;
  34.             d[5]=t/60%10;
  35.             d[4]=t/600;
  36.             i=0;
  37.         }
  38.         d[5]=t/60%10|0x80;
  39.         display();
  40.     }
  41. }




点赞  2010-4-18 17:48
    while(1)
    {
        if(++i>=125)
        {
            if(++t>5959)  根据上下程序联系,这里是否应该是改成3600?
                t=0;
            d[7]=t%60%10;
            d[6]=t%60/10;
            d[5]=t/60%10;
            d[4]=t/600;
            i=0;
        }
        d[5]=t/60%10|0x80;
        display();  
    }
请注意,display()的自身耗时是很严重的,虽然这里是用了8*125的预想估算,但是for函数在转换为汇编的时候,并不能单纯的转换为DJNZ这样简单的循环,这方面的代码研究已经有过很多人做过,谷歌上有很多相关资料。既然用单片机,最好的做法是利用定时器来做定时而且这样还能使MCU主流程空闲出来作为显示用,非常合用。
点赞  2010-4-18 17:57
大神,解释详细点,好不?
点赞  2010-4-18 19:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复