|
#include<reg52.h> #define uchar unsigned char #define uint unsigned int #define Kport P3 #define Ledport P1 uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED從低位往高位移 unsigned char kscancnt; //記錄進入中斷的次數(shù),滿一個周期清零 void timer0_init(); //定時器0初始化 void delayMS(uint x); //延時函數(shù) void KeyProcess(uchar Key); //按鍵處理函數(shù) bit flag; uchar knum; uint F3cnt,F2cnt,Pwmcnt,T0cnt; uchar temp=0xff,temp1; uchar sh_cnt; //延時函數(shù) void delayMS(uint x) { uchar i; while (x--) for(i=0;i<120; i++) ; } /*************************************************** * 定時器0初始化子函數(shù) * 工作方式2,每1000us中斷一次 ****************************************************/ void timer0_init(void) { TMOD = 0x01; //采用定時器0,工作方式2, TH0 = (65536-1000)/256; //定時器設(shè)置,每隔20us發(fā)起一次中斷。 TL0 = (65536-1000)%256; ET0 = 1; //開定時器0中斷 EA = 1; //開總中斷 TR0 = 1; //打開定時器 } //檢測按鍵 uchar GetKey(uchar kscancnt) { uchar ktmp; if(kscancnt==0) { temp=(Kport&0xf0)>>4; ktmp=~temp &(temp1); if(ktmp)knum=ktmp; temp1=temp; } return knum; } //鍵盤按鍵處理 void KeyProcess(uchar Key) { switch (Key) { case 1:Ledport=0x00; break; case 2:if(F2cnt==200){sh_cnt=++sh_cnt%8;F2cnt=0;} Ledport=table0[sh_cnt]; break; case 4:if(T0cnt==300) {F3cnt=F3cnt+10;T0cnt=0;} if(F3cnt==130){F3cnt=0;flag=!flag;} Pwmcnt=++Pwmcnt%100; if(flag) {if(Pwmcnt>F3cnt)Ledport=0x00;else Ledport=0xff;} else {if(Pwmcnt>F3cnt)Ledport=0xff;else Ledport=0x00;} break; case 8:Ledport=0xff; //全部關(guān)閉 break; } } /*************************************************** * 中斷服務(wù)子函數(shù) *****************************************************/ void time0(void) interrupt 1 { TH0 = (65536-1000)/256; //定時器設(shè)置,每隔20us發(fā)起一次中斷。 TL0 = (65536-1000)%256; kscancnt=++ kscancnt%10; if(knum==2) {F2cnt++; } if(knum==4) {T0cnt++; } } //-------------------------------------------------------------------- void main(void) { uchar Key; P0=P1=0xFF; timer0_init(); while(1) { Key=GetKey(kscancnt); KeyProcess(Key); } } |
|