你這是按鍵掃描程序的簡短寫法,多個按鍵不必一個一個的寫。
1.unsigned char key=0;key=0xff&P1; 定義一個無符號字符型數據變量key,它的值由P1口狀態賦予。
你改成有符號字符型數據不符合應用規則,當然出錯。
2.按鍵按下就需要消抖,這是用軟件消除按鍵的機械特性帶來的電氣干擾,方法有多種,delay是最初級的方法。
這是在P1的低4位接4個獨立按鍵的掃描程序示例,供參考
#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; //按鍵有效標志
static uint count=0; //消抖計數變量
uchar num=0; //臨時變量
if(key!=0x0f) //檢測有鍵按下
{
count++; //消抖計數
if(count>=1000) //100~1000,根據主循環周期調整約10~20ms
{
count=1000; //防止溢出
if(sign==0) //測試按鍵有效標志0
{
sign=1; //按鍵有效標志置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; //按鍵有效標志清0
count=0; //消抖計數清0
}
}
void main()
{
while(1) //程序循環執行
{
keyscan(); //按鍵掃描,子函數
}
} |