⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.c

📁 51实战工程级源码
💻 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 + -