|
你這是按鍵掃描程序的簡短寫法,多個(gè)按鍵不必一個(gè)一個(gè)的寫。
1.unsigned char key=0;key=0xff&P1; 定義一個(gè)無符號字符型數(shù)據(jù)變量key,它的值由P1口狀態(tài)賦予。
你改成有符號字符型數(shù)據(jù)不符合應(yīng)用規(guī)則,當(dāng)然出錯(cuò)。
2.按鍵按下就需要消抖,這是用軟件消除按鍵的機(jī)械特性帶來的電氣干擾,方法有多種,delay是最初級的方法。
這是在P1的低4位接4個(gè)獨(dú)立按鍵的掃描程序示例,供參考
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define key (P1 & 0x0f) //按鍵端口宏定義(P1的低4位)
//sbit key1=P1^0; //按鍵1定義
//sbit key2=P1^1; //按鍵2定義
//sbit key3=P1^2; //按鍵3定義
//sbit key4=P1^3; //按鍵4定義
sbit led1=P3^6; //led1端口
sbit led2=P3^5; //led2端口
sbit led3=P3^4; //led3端口
sbit led4=P3^3; //led4端口
void keyscan() //按鍵掃描程序
{
static bit sign=0; //按鍵有效標(biāo)志
static uint count=0; //消抖計(jì)數(shù)變量
uchar num=0; //臨時(shí)變量
if(key!=0x0f) //檢測有鍵按下
{
count++; //消抖計(jì)數(shù)
if(count>=1000) //100~1000,根據(jù)主循環(huán)周期調(diào)整約10~20ms
{
count=1000; //防止溢出
if(sign==0) //測試按鍵有效標(biāo)志0
{
sign=1; //按鍵有效標(biāo)志置1
num=key; //保存P1低4位值0000 xxxx ,x為0或1
switch(num)
{
case 0x0e: led1=~led1; break;
case 0x0d: led2=~led2; break;
case 0x0b: led3=~led3; break;
case 0x07: led4=~led4; break;
default: break;
}
}
}
}
else //鍵抬起
{
sign=0; //按鍵有效標(biāo)志清0
count=0; //消抖計(jì)數(shù)清0
}
}
void main()
{
while(1) //程序循環(huán)執(zhí)行
{
keyscan(); //按鍵掃描,子函數(shù)
}
} |
|