不占用中斷 不使用延時 沒有死循環!!!不占用任何資源
這個按鍵檢測程序我在20年前網上看到過。當時沒有試用。今又看到這個單片機代碼。于是決定測試一下
unsigned char num,trg1=0, trg2=0,cont1=0,cont2=0;//一定是全局變量
unsigned char
sbit key1=P1^1;
sbit key2=P1^2;
unsigned key1scan()
{
unsigned char a=!key1;//網上是異或運算a=key1^0x01,對于一位按鍵可以直接寫成取反
trg1= a&(a^cont1);
cont1=a;
if(trg1&!key1) //網上是(trg1&key1)實際測試不能使用!!因為任何時候都不可能為真。只有改成(trg1&!key1)才可以完美執行。。
return 1;//返回等于1 表示按鍵按下。
//{
//此處可以是自己需要執行的程序。(去掉前面的返回)
//}
}
unsigned key2scan()
{
unsigned char a=!key2;//網上是異或運算a=key2^0x01,對于一位按鍵可以直接寫成取反
trg2= a&(a^cont2);
cont2=a;
if(trg2&!key2)
return 1;//返回等于1 表示按鍵按下。
//{
//此處可以是自己需要執行的程序。(去掉前面的返回)
//}
}
void main()
{
while(1)
{
if(key1scan()) //每次按下按鍵只會執行一次,按鍵不放開絕對不會重復執行。
{
//自己的程序。
}
if(key2scan()) //每次按下按鍵只會執行一次,按鍵不放開絕對不會重復執行。
{
num++;
if(num==20)//按一次按鍵 num加1.num可以作為switch程序的條件。
num=0;
}
}
}
我今天吧這個代碼移植到一個帶按鍵的程序中。原來的按鍵按下不放開的時候,顯示屏停止顯示。因為有一句(while(!key1).現在換成這個按鍵不放,單片機沒有任何影響!
此代碼也可以放到中斷程序 執行
|