📄 keypad.c
字号:
/*
****************************************************
键盘
****************************************************
*/
#include <reg52.H>
#include "Typedef.H"
#include "UserDef.H"
#include "Keypad.h"
/* 按键对照表 */
static INT32U code KeyMap[][2] = {
// 扫描码 虚键码
0xFFFF, VK_NULL,
0xFFEF, VK_0,
0xFFFD, VK_1,
0xFFDF, VK_2,
0xFDFF, VK_3,
0xFFFB, VK_4,
0xFFBF, VK_5,
0xFBFF, VK_6,
0xFFF7, VK_7,
0xFF7F, VK_8,
0xF7FF, VK_9,
0xEFFF, VK_ADD,
0xDFFF, VK_SUB,
0xBFFF, VK_MUL,
0x7FFF, VK_DIV,
0xFEFF, VK_EQU,
0xFFFE, VK_CLR,
};
/* 端口定义 */
sbit KP_Col0 = P1^0;
sbit KP_Col1 = P1^1;
sbit KP_Col2 = P1^2;
sbit KP_Col3 = P1^3;
sbit KP_Row0 = P1^4;
sbit KP_Row1 = P1^5;
sbit KP_Row2 = P1^6;
sbit KP_Row3 = P1^7;
/* 全局变量 */
/***************************************************
按键扫描程序
****************************************************/
INT8U Keypad_GetKey(void)
{
static INT8U cnt = 0; //按键消抖计数器
static INT16U PrevImg = 0x0FFF; //上次的扫描码
static INT8U PrevKey = VK_NULL; //上次有效按键的虚键码
INT16U img;
INT8U n;
BOOLEAN find;
img = 0;
find = FALSE;
//获取扫描码
P1 = 0xFF;
KP_Col0 = 0;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 1;
img |= (P1>>4); img <<= 4;
KP_Col0 = 1;KP_Col1 = 0;KP_Col2 = 1;KP_Col3 = 1;
img |= (P1>>4); img <<= 4;
KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 0;KP_Col3 = 1;
img |= (P1>>4); img <<= 4;
KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 0;
img |= (P1>>4);
//消抖
if (PrevImg != img)
{
cnt = 0;
PrevImg = img;
return VK_NULL;
}
PrevImg = img;
cnt ++;
if (cnt < 5)
{
return VK_NULL;
}
//本次消抖完毕,计数器清零,为下次消抖做准备
cnt = 0;
//获取按键的虚键码
for (n=0;n<(sizeof(KeyMap)/8);n++)
{
if (KeyMap[n][0] == img)
{
find = TRUE;
break;
}
}
if (find == TRUE)
{
if (KeyMap[n][1] != PrevKey) //只识别改变的按键动作
{
PrevKey = KeyMap[n][1];
return KeyMap[n][1];
}
else
return VK_NULL;
}
else
return VK_INVALID;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -