51單片機(jī)按鍵掃描C程序
unsignedcharkey,key_h,kpush;
unsignedintkey_l;
//按鍵連接到p1.0、p1.1、p1.2
voidint_t0(void)interrupt1{
unsignedchardd,i;
TL0=TL0+30;TH0=0xfb;//800
/*按鍵判別*/
if((P1&0x7)==0x7){
if((key_l>30)&&(key_l<800)&&(key_h>30)){//釋放按鍵,如果之前按鍵時(shí)間少于1秒,讀入鍵值
key=kpush;
}
if((++key_h)>200)key_h=200;
key_l=0;
if(key>=0x80)key=0;//如果之前的按鍵為1秒,清除鍵值
}else{
kpush=P1&0x7;
key_l++;
if((key_l>800)&&(key_h>30)){//如果按鍵超過1秒,鍵值加0x80標(biāo)志鍵
key=kpush|0x80;
key_h=0;
key_l=0;
}
}
}
voidmain(void){
TMOD=0x1;TR0=1;ET0=1;EA=1;
while(1){
while(!key){}
switch(key){
case1:break;
case2:break;
}
}
}
unsignedintkey_l;
//按鍵連接到p1.0、p1.1、p1.2
voidint_t0(void)interrupt1{
unsignedchardd,i;
TL0=TL0+30;TH0=0xfb;//800
/*按鍵判別*/
if((P1&0x7)==0x7){
if((key_l>30)&&(key_l<800)&&(key_h>30)){//釋放按鍵,如果之前按鍵時(shí)間少于1秒,讀入鍵值
key=kpush;
}
if((++key_h)>200)key_h=200;
key_l=0;
if(key>=0x80)key=0;//如果之前的按鍵為1秒,清除鍵值
}else{
kpush=P1&0x7;
key_l++;
if((key_l>800)&&(key_h>30)){//如果按鍵超過1秒,鍵值加0x80標(biāo)志鍵
key=kpush|0x80;
key_h=0;
key_l=0;
}
}
}
voidmain(void){
TMOD=0x1;TR0=1;ET0=1;EA=1;
while(1){
while(!key){}
switch(key){
case1:break;
case2:break;
}
}
}
評論