📄 keyboard.c
字号:
/*
*************************************************************************************************************
* Kingst-51
* Development board samples
*
* (c) Copyright 2009-2012, Kingst Studio
* All Rights Reserved
*
* http://www.kingst.org
* 文件名:KeyBoard.c
* 描 述:键盘功能模块
* 版本号:1.0.0
*************************************************************************************************************
*/
#define _KEY_BOARD_C
#include "config.h"
#include "main.h"
#include "UartCom.h"
#include "Lcd1602.h"
#include "KeyBoard.h"
/*
********************************************************************************
* ----------------------- Local defines ---------------------------------------
********************************************************************************
*/
const uint8 code KeyCodeMap[4][4] = { //矩阵按键编号到PC标准键盘键码的映射表
{ '1', '2', '3', 0x26 }, //数字键1、数字键2、数字键3、向上键
{ '4', '5', '6', 0x25 }, //数字键4、数字键5、数字键6、向左键
{ '7', '8', '9', 0x28 }, //数字键7、数字键8、数字键9、向下键
{ '0', 0x1B, 0xC, 0x27 }, //数字键0、ESC键、 回车键、 向右键
};
/*
********************************************************************************
* ----------------------- Local variables -------------------------------------
********************************************************************************
*/
volatile uint8 KeySta[4][4]; //当前的按键状态
/*
***************************************************************************************************
* ---------------------------------- Source codes ------------------------------------------------
***************************************************************************************************
*/
/*
* 函数名:KeyAction
* 描 述:按键动作的实现函数,根据键码执行相应动作
*/
void KeyAction(uint8 keycode)
{
uint8 buff[4];
/* 判断键码执行相应动作 */
switch (keycode) {
case 0x0C: //回车键启动/停止秒表计数
KickStopwatch();
break;
case 0x1B: //ESC键重置秒表
ResetStopwatch();
break;
default: //其它键均无动作
break;
}
/* 将键码值按十六进制形式转换为字符串 */
buff[0] = (keycode>>4) & 0xF;
if (buff[0] <= 9) {
buff[0] += '0';
}
else {
buff[0] += ('A'-10);
}
buff[1] = keycode & 0xF;
if (buff[1] <= 9) {
buff[1] += '0';
}
else {
buff[1] += ('A'-10);
}
/* 键码显示到液晶屏 */
buff[2] = '\0';
Lcd1602ShowStr(buff, 6, 1);
/* 键码由串口发送 */
buff[2] = '\r';
buff[3] = '\n';
UartWrite("key code 0x", sizeof("key code 0x")-1);
UartWrite(buff, 4);
}
/*
* 函数名:KeyHandle
* 描 述:按键动作检测,并提供按键动作函数的执行入口
* 备 注:通常本函数需在主循环中调用
*/
void KeyHandle(void)
{
uint8 i, j;
static uint8 bkKey[4][4];
/* 检索按键状态的变化 */
for (i=0; i<4; i++) {
for (j=0; j<4; j++) {
if (bkKey[i][j] != KeySta[i][j]) {
if (bkKey[i][j] == KEY_UP) {
/* 按键按下时的动作 */
KeyAction(KeyCodeMap[i][j]);
}
else {
/* 按键弹起时的动作 */
_nop_();
}
bkKey[i][j] = KeySta[i][j];
}
}
}
}
/*
* 函数名:KeyScan
* 描 述:4*4矩阵式按键扫描函数
* 备 注:本函数需在定时中断中调用,其定时时间、矩阵键盘列数及DEBOUNCE_MASK常数共同决定消抖时间;
* 如调用本函数的中断服务函数用using指定了寄存器组,则本函数也需用using指定相同的寄存器组。
*/
void KeyScan(void)
{
uint8 i;
static uint8 iKeyOut=0;
static uint8 KeyScanBuff[4][4];
/* 扫描按键输入 */
KeyScanBuff[iKeyOut][0] = ((KeyScanBuff[iKeyOut][0]<<1) | KEY_IN_1) & DEBOUNCE_MASK;
KeyScanBuff[iKeyOut][1] = ((KeyScanBuff[iKeyOut][1]<<1) | KEY_IN_2) & DEBOUNCE_MASK;
KeyScanBuff[iKeyOut][2] = ((KeyScanBuff[iKeyOut][2]<<1) | KEY_IN_3) & DEBOUNCE_MASK;
KeyScanBuff[iKeyOut][3] = ((KeyScanBuff[iKeyOut][3]<<1) | KEY_IN_4) & DEBOUNCE_MASK;
/* 消抖后更新按键状态 */
for (i=0; i<4; i++) {
if ((KeyScanBuff[iKeyOut][i]&DEBOUNCE_MASK) == DEBOUNCE_MASK) {
KeySta[iKeyOut][i] = KEY_UP;
}
else if ((KeyScanBuff[iKeyOut][i]&DEBOUNCE_MASK) == 0) {
KeySta[iKeyOut][i] = KEY_DOWN;
}
}
/* 执行下一列按键输出 */
iKeyOut = (iKeyOut+1) & 0x3;
switch (iKeyOut) {
case 0:
KEY_OUT_4 = 1;
KEY_OUT_1 = 0;
break;
case 1:
KEY_OUT_1 = 1;
KEY_OUT_2 = 0;
break;
case 2:
KEY_OUT_2 = 1;
KEY_OUT_3 = 0;
break;
case 3:
KEY_OUT_3 = 1;
KEY_OUT_4 = 0;
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -