?? 8x8矩陣鍵盤識別技術.c
字號:
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// 8x8矩陣鍵盤
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <intrins.h>
#include "Reg54.h"
#define KEY_ROW_IO P1 // 行線使用的I/O口
#define KEY_COL_IO P2 // 列線使用的I/O口
typedef unsigned char uchar; // 取值范圍: 0-255(0xFF)
typedef unsigned int uint; // 取值范圍: 0-65535(0xFFFF)
typedef unsigned long ulong; // 取值范圍: 0-4294967295(0xFFFFFFFF)
#ifndef True
#define True 1 // 邏輯"真"
#endif
#ifndef False
#define False 0 // 邏輯"假"
#endif
//==================================================================================================
// 功能: 掃描8x8矩陣鍵盤識別用戶按下的按鍵.
// 返回: 用戶按下的按鍵代號.
// 參數: None.
//==================================================================================================
uchar ScanKeyBoard8x8(void)
{
uchar data vKeyID=0,vKeyCode;
uchar data i,j,k;
for(i=0; i<8; i++)
{
KEY_ROW_IO = 0xFF; // 將所有行線拉高
KEY_COL_IO = ~(0x01<<i); // 將相應列線拉低(第[i]列)
vKeyCode = KEY_ROW_IO; // 讀取行線IO狀態(Bit[0:7])
if(vKeyCode!=0xFF) // 判斷有無行線被拉低(有表示有按鍵按下)
{
//==============================================================//
// 檢測到有按鍵按下時,需要執行按鍵除顫抖(只須延時100ms即可實現)
//==============================================================//
for(j=50; j>0; j--)
{
for(k=200; k>0; k--);
}
vKeyCode = KEY_ROW_IO; // 讀取行線IO狀態(Bit[0:7])
if(vKeyCode!=0xFF) // 判斷有無行線被拉低(有表示有按鍵按下)
{
vKeyCode = KEY_ROW_IO; // 讀取行線IO狀態(Bit[0:7])
//============================================================//
// 找出被按下的按鍵(被拉低的行線與第[i]列線)
//============================================================//
switch(vKeyCode) // 檢測與第[i]列相連的8個按鍵中哪個被按下
{
case 0xFE: // Bit0被拉低
vKeyID = 1;
break;
case 0xFD: // Bit1被拉低
vKeyID = 2;
break;
case 0xFB: // Bit2被拉低
vKeyID = 3;
break;
case 0xF7: // Bit3被拉低
vKeyID = 4;
break;
case 0xEF: // Bit4被拉低
vKeyID = 5;
break;
case 0xDF: // Bit5被拉低
vKeyID = 6;
break;
case 0xBF: // Bit6被拉低
vKeyID = 7;
break;
case 0x7F: // Bit7被拉低
vKeyID = 8;
break;
default: // 按下超過1個按鍵
vKeyID = 0; // 不支持多個按鍵同時按下
break;
}
vKeyCode = KEY_ROW_IO; // 讀取行線IO狀態(Bit[0:7])
while(vKeyCode!=0xFF) vKeyCode = KEY_ROW_IO; // 等待用戶松開按鍵
if(vKeyID!=0)
{
vKeyID += (i<<3);
break;
}
}
}
}
return(vKeyID);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -