|
不占用中斷 不使用延時(shí) 沒有死循環(huán)。。〔徽加萌魏钨Y源
這個(gè)按鍵檢測(cè)程序我在20年前網(wǎng)上看到過。當(dāng)時(shí)沒有試用。今又看到這個(gè)單片機(jī)代碼。于是決定測(cè)試一下
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;//網(wǎng)上是異或運(yùn)算a=key1^0x01,對(duì)于一位按鍵可以直接寫成取反
trg1= a&(a^cont1);
cont1=a;
if(trg1&!key1) //網(wǎng)上是(trg1&key1)實(shí)際測(cè)試不能使用!因?yàn)槿魏螘r(shí)候都不可能為真。只有改成(trg1&!key1)才可以完美執(zhí)行。!
return 1;//返回等于1 表示按鍵按下。
//{
//此處可以是自己需要執(zhí)行的程序。(去掉前面的返回)
//}
}
unsigned key2scan()
{
unsigned char a=!key2;//網(wǎng)上是異或運(yùn)算a=key2^0x01,對(duì)于一位按鍵可以直接寫成取反
trg2= a&(a^cont2);
cont2=a;
if(trg2&!key2)
return 1;//返回等于1 表示按鍵按下。
//{
//此處可以是自己需要執(zhí)行的程序。(去掉前面的返回)
//}
}
void main()
{
while(1)
{
if(key1scan()) //每次按下按鍵只會(huì)執(zhí)行一次,按鍵不放開絕對(duì)不會(huì)重復(fù)執(zhí)行。
{
//自己的程序。
}
if(key2scan()) //每次按下按鍵只會(huì)執(zhí)行一次,按鍵不放開絕對(duì)不會(huì)重復(fù)執(zhí)行。
{
num++;
if(num==20)//按一次按鍵 num加1.num可以作為switch程序的條件。
num=0;
}
}
}
我今天吧這個(gè)代碼移植到一個(gè)帶按鍵的程序中。原來的按鍵按下不放開的時(shí)候,顯示屏停止顯示。因?yàn)橛幸痪洌╳hile(!key1).現(xiàn)在換成這個(gè)按鍵不放,單片機(jī)沒有任何影響!!
此代碼也可以放到中斷程序 執(zhí)行
|
評(píng)分
-
查看全部評(píng)分
|