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 }