分享單片機按鍵的三種方法
方法一:
#include <reg52.h>typedef unsigned int uInt16;sbit LED1 = P2^0;
sbit KEY1 = P3^4;
sbit KEY2 = P3^5;void DelayMS(uInt16 ValMS)
{
uInt16 uiVal,ujVal;
for(uiVal = 0; uiVal < ValMS; uiVal++)
for(ujVal = 0; ujVal < 113; ujVal++);
}// 函數功能:毫秒延時// 函數功能:掃描按鍵并做出相應LED燈亮滅動作void main(void)
{
while(1)
{
if(0 == KEY1) // 檢測按鍵是否按下
{
DelayMS(5); // 延時去抖
if(0 == KEY1) // 再次檢測
{
LED1 = 0; // 點亮LED燈
while(!KEY1); // 等待按鍵彈起
}
}
if(!KEY2)
{
DelayMS(5);
if(!KEY2)
{
LED1 = 1;
while(!KEY2);
}
} }
}
方法二:行列掃描法
#include <reg52.h>#define uInt16 unsigned int
#define uChar8 unsigned char
#define DATA P0 //數據口
#define KEYPORT P3 //鍵盤接入端口sbit SEG_SELECT = P1^7; //段選控制端
sbit BIT_SELECT = P1^6; //位選控制端uChar8 code SEG_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//段選顯示表格uChar8 g_ucKeyNum = 16; //鍵值// 函數功能:毫秒延時void DelayMS(uInt16 ValMS)
{
uInt16 uiVal,ujVal;
for(uiVal = 0; uiVal < ValMS; uiVal++)
for(ujVal = 0; ujVal < 121; ujVal++);
}// 函數功能:矩陣按鍵掃描void ScanKey(void)
{
uChar8 ucTemp;
KEYPORT = 0xfe; //檢測第一行
ucTemp = KEYPORT; //讀取鍵盤端口數值
if(ucTemp != 0xfe) //若是不等于0xF0表示有按鍵按下
{
DelayMS(5); //去抖
ucTemp = KEYPORT; //讀端口值
if(ucTemp != 0xfe) //再次判斷
{
ucTemp = KEYPORT; //取鍵值
switch(ucTemp) //判斷鍵值對應鍵碼
{
case 0xee:g_ucKeyNum = 0;break;
case 0xde:g_ucKeyNum = 1;break;
case 0xbe:g_ucKeyNum = 2;break;
case 0x7e:g_ucKeyNum = 3;break;
}
while(KEYPORT != 0xfe); //按鍵釋放檢測
}
}
KEYPORT = 0xfd;
ucTemp = KEYPORT;
if(ucTemp != 0xfd)
{
DelayMS(5);
ucTemp = KEYPORT;
if(ucTemp != 0xfd)
{
ucTemp = KEYPORT;
switch(ucTemp)
{
case 0xed:g_ucKeyNum = 4;break;
case 0xdd:g_ucKeyNum = 5;break;
case 0xbd:g_ucKeyNum = 6;break;
case 0x7d:g_ucKeyNum = 7;break;
}
while(KEYPORT != 0xfd);
}
}
KEYPORT = 0xfb;
ucTemp = KEYPORT;
if(ucTemp != 0xfb)
{
DelayMS(5);
ucTemp = KEYPORT;
if(ucTemp != 0xfb)
{
ucTemp = KEYPORT;
switch(ucTemp)
{
case 0xeb:g_ucKeyNum = 8;break;
case 0xdb:g_ucKeyNum = 9;break;
case 0xbb:g_ucKeyNum = 10;break;
case 0x7b:g_ucKeyNum = 11;break;
}
while(KEYPORT != 0xfb);
}
}
KEYPORT = 0xf7;
ucTemp = KEYPORT;
if(ucTemp != 0xf7)
{
DelayMS(5);
ucTemp = KEYPORT;
if(ucTemp != 0xf7)
{
ucTemp = KEYPORT;
switch(ucTemp)
{
case 0xe7:g_ucKeyNum = 12;break;
case 0xd7:g_ucKeyNum = 13;break;
case 0xb7:g_ucKeyNum = 14;break;
case 0x77:g_ucKeyNum = 15;break;
}
while(KEYPORT != 0xf7);
}
}
}
/* ***************************************************** */
// 函數名稱:Display()
// 函數功能:數碼管刷新
// 入口參數:需顯示的數值(ucVal)
// 出口參數:無
/* ***************************************************** */
void Display(uChar8 ucVal)
{
if(ucVal == 16) //若鍵值是16即沒有按鍵按下,則不顯示
{
BIT_SELECT = 1;
DATA = 0xff;
BIT_SELECT = 0;
}
else //若有按下,顯示對應鍵值
{
BIT_SELECT = 1;
DATA = 0x00;
BIT_SELECT = 0;
SEG_SELECT = 1;
DATA = SEG_Tab[ucVal];
SEG_SELECT = 0;
DelayMS(10);
DATA = 0xff;
}
}
/* ***************************************************** */
// 函數名稱:main()
// 函數功能:矩陣按鍵掃描并用數碼管顯示鍵值
// 入口參數:無
// 出口參數:無
/* ***************************************************** */
void main(void)
{
while(1)
{
ScanKey();
Display(g_ucKeyNum);
}
}
方法三:
- void key4(void)
- {
- static uchar i = 0;
- static uchar keybuff[4] = {0xff,0xff,0xff,0xff};
- static uchar keybackup = 1;
- keybuff[0] = (keybuff[0] << 1)|KEY1;
- keybuff[1] = (keybuff[1] << 1)|KEY2;
- keybuff[2] = (keybuff[2] << 1)|KEY3;
- keybuff[3] = (keybuff[3] << 1)|KEY4;
- if(keybuff[i] == 0xf0 && keybackup)
- {
- key = 1 + i;
- keybackup = 0;
- }
- else if(keybuff[i] == 0xff)
- {
- i++;
- if(i == 4)
- {
- i = 0;
- }
- keybackup = 1;
- }
- }
復制代碼
|