跑秒程序理解

  1 /*2018年7月29日 17点40 于福安公寓
  2 对于通过定时器定时来显示时间,就要通过向显示函数中传入要显示的参数,
  3 这个参数可以通过在中断函数中或者显示主函数中,通过
  4 shi=num/10;  ge =num%10;来进行分离参数,然后件分析后的参数在传递到显示函数中
  5 既可以显示
  6 */
  7 #include<reg52.h>
  8 #define uchar unsigned char
  9 #define uint   unsigned int  
 10 sbit LA =P2^2;
 11 sbit LB =P2^3;
 12 sbit LC =P2^4;
 13 sbit led=P2^0;
 14 //sbit k1 =P3^1;
 15 sbit key1 =P3^1;
 16 
 17 void delay(uint);
 18 uchar tt =0,num ,ge;
 19 void display(uchar);
 20 void scanf();
 21 uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
 22                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
 23 
 24 
 25 /*void keypros()
 26 {
 27     if(k1==0)          //检测按键K1是否按下
 28     {    
 29         delay(1);   //消除抖动 一般大约10ms
 30         if(k1==0)     //再次判断按键是否按下
 31         {
 32             led=~led;      //led状态取反
 33             TR0 =0;
 34 
 35             LA =1;
 36             LB =0;
 37             LC =0;
 38             P0 =0x3f;
 39         }
 40         while(!k1);//只有当按键释放之后,才会执行后面的TR0=1;这样才会使得定时器0继续使用
 41         TR0 =1;
 42     }        
 43 }
 44 */
 45 void scanf()
 46 {
 47     
 48     if(key1==0)
 49     {
 50         delay(1);
 51         if(key1 ==0)
 52         {
 53             TR0 =0;
 54             led =1;
 55             LA =1;
 56             LB =0;
 57             LC =0;
 58             P0 =0x3f;
 59             while(!key1);
 60             
 61                 TR0 =1;    //切记:这个TR0必须要放在while(!key);这个循环的外面,不然会造成延时        
 62              
 63 
 64         }
 65 
 66     }
 67 }
 68   
 69 
 70 void main()
 71 {
 72     
 73     EA =1;
 74     TMOD =0x01;
 75     TH0 =(65536-50000)/256;
 76     TL0 =(65536-50000)%256;
 77     ET0 =1;
 78     TR0 =1;
 79     while(1)
 80     {
 81         
 82          if(tt==20)   //此处必须==,不然会出错,相当于把2付给了tt,这个循环将退不出去
 83         {
 84           tt =0;
 85           num++;
 86           if(num==10)
 87           num =0;
 88           ge =num%10;
 89           led =0;
 90           scanf();
 91           display(ge);      
 92           
 93 //          display();
 94         }        
 95     }
 96 }
 97 
 98 
 99 void display(uchar ge )
100 {
101     LA =0;
102     LB =0;
103     LC =0;
104     P0 =table[ge];
105                          /*如果没有这个延时程序的,那么数码管就会出现一个8并且永远不会变,
106                          也就是现实太快了,肉眼看不清楚,当时间太长的,但是定时器的时间优先,
107                         故而每次还没有显示完时,就会有下一次中段到来    */          
108 } 
109 
110 void delay(uint x)
111 {
112     uint i,j;
113     for(i =x;i>0;i--)
114         for(j=110;j>0;j--);
115 }
116 
117 void  PaoMiaoT() interrupt 1
118 {
119     TH0 =(65536-50000)/256;
120     TL0 =(65536-50000)%256;
121     tt++;
122 }    
View Code
原文地址:https://www.cnblogs.com/wises/p/9539567.html