單片機源程序如下:
- #include"reg52.h"
- sbitkey=P3^7;
- unsignedchar led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//字模
- unsignedint count=0,num1=0,num2=0;
- unsignedchar work=0,block=0,record=0,situation=1;
- voidT0_srv (void) interrupt 1 //定時器0,定時1秒,刷新秒表顯示
- {
- TH0 =(65536-50000)/256;
- TL0 =(65536-50000)%256;
- count++;
- if(count==20)
- {count=0;
- if(num1==9&&num2==9) num1=num2=0;
- else{
- if(num1==9) num2++,num1=0;
- else num1++;
- }}
- }
- voidT1_srv (void) interrupt 3 //定時器1,定時200ms,用來判斷短按和長按
- {
- TH1 =(65536-20000)/256;
- TL1 =(65536-20000)%256;
- record++;
- if(record==10)
- { record=0;
- if(key==0) situation=0;
- elsesituation=1,work=!work;
- block=1;
- }
- }
- voiddelay()
- {
- unsigned int i=2000;
- while(i--);
- }
- voidcheck()//按鍵檢索函數
- {
- if(key==0){ //判斷按鍵長短
- delay();
- if(key==0) {TR0=0,TR1=1;
- while(!block);
- TR1=0;TH1=(65536-50000)/256;TL1=(65536-50000)%256;block=0;//開啟定時器1,計時200ms,以此判斷長按和短按
- if(situation==0){while(!key);work=0;TR0=0,TH0=(65536-50000)/256;TL0=(65536-50000)%256;num1=num2=0;}//長按清零
- else{ //短按開始或者暫停秒表
- if(work==0) TR0=0;
- else TR0=1;}}}
- }
- voidmain(){
- TMOD=0x11; //定時器工作組1
- TH0=(65536-50000)/256; //定時器初值設定
- TL0=(65536-50000)%256;
- TH1=(65536-50000)/256;
- TL1 =(65536-50000)%256;
- EA=1;
- ET0=1;
- ET1=1;
- TR0=0;
- TR1=0;
- P0=led_mod[num1];
- P2=led_mod[num2];
- while(1)
- {
- check();//按鍵檢索
- P0=led_mod[num1];delay();//死循環顯示秒表計數
- P2=led_mod[num2];delay();
- }}
復制代碼
|