📄 key.c
字号:
/**************************************************************************
Key Check
File Name: key.c
Author: Lin Qian
Created: 2007/07/27
Modified: NO
Revision: 1.0
***************************************************************************/
#define __KEY
#include "INC\\main.h"
#undef __KEY
// 矩阵式键盘扫描 ******************************
#if MatrixKeyScan_en
uchar MatrixKeyScan (void)
// 返回: 被按下的按键的行列码; 无按键按下则返回0x00.
{
uchar scancode,tmpcode;
PORT = 0xf8; // 发全0行扫描码
if( (PORT & 0xf8) != 0xf8 && (PORT & 0xf8) != 0xf0 ) // 若有键按下
{
DelayXms(10); // 延时去抖动
if( (PORT & 0xf8) != 0xf8 && (PORT & 0xf8) != 0xf0)
// 延时后再判断一次,去除抖动影响
{
scancode = 0xfe; // 逐行扫描码初值
while( (scancode & 0x08) != 0 ) // 逐行扫描
{
PORT = scancode; // 输出行扫描码
if( (PORT & 0xf8) != 0xf8 && (PORT & 0xf8) != 0xf0 )
// 本行有键按下
{
tmpcode = (PORT & 0xf8) | 0x07;
/* 返回特征字节码,为1的位即对应于行和列 */
return( (~scancode+~tmpcode) & 0xf7 );
}
else
scancode = (scancode<<1)|0x01; // 行扫描码左移一位
}
}
}
return 0; // 无键按下,返回值为0
}
#endif
// 矩阵式键盘解码 ******************************
#if MatrixKeyDecode_en
uchar MatrixKeyDecode (uchar key)
// 功能: 根据行列码翻译为按键信息
// key: 行列码.
// 返回: 解码值
{
// uchar keychar;
switch( key )
{
case 0x11: // 1行1列,数字3: "复位"
// keychar = '3';
Reset();
break;
case 0x21: // 1行2列,数字6: "读取"
// keychar = '6';
LoadDistCost(); // 读取里程数和总价
LoadMenu_Succeed(" LOAD "); // 显示读取成功
break;
case 0x41: // 1行3列,数字9: "存储"
// keychar = '9';
SaveDistCost(); // 存储里程数和总价
LoadMenu_Succeed(" SAVE "); // 显示存储成功
break;
case 0x81: // 1行4列,字符"#": "确定"
// keychar = '#';
Confirm();
break;
case 0x12: // 2行1列,数字2: "停止"
// keychar = '2';
Stop(); // 停止计费
break;
case 0x22: // 2行2列,数字5: "MIN"
// keychar = '5';
AdjustClockMin();
break;
case 0x42: // 2行3列,数字8: "夜价"
// keychar = '8';
AdjustNightPrice();
break;
case 0x82: // 2行4列,数字0: "-:
// keychar = '0';
Minus();
break;
case 0x14: // 3行1列,数字1: "启动"
// keychar = '1';
Start(); // 启动计费
break;
case 0x24: // 3行2列,数字4: "HOUR"
// keychar = '4';
AdjustClockHour();
break;
case 0x44: // 3行3列,数字7: "日价"
// keychar = '7';
AdjustDayPrice();
break;
case 0x84: // 3行4列,字符"*": "+"
// keychar = '*';
Plus();
break;
default:
// keychar = 0;
break;
}
return 1;
}
#endif
// 检测直接型按键状态 ******************************
#if CheckKey_en
bit CheckKey (bit key, bit press)
// key: 需要检测的按键位 press:按键被按下时的状态值
// 返回值:1->按键被按下 0->按键未被按下
{
if( key == press) // 判断按键是否被按下
{ DelayXms(10); // 去抖延时
if (key == press)
return 1;
else
return 0;
}
else
return 0;
}
#endif
// 按键处理 *******************************
#if KeyDisposal_en
void KeyDisposal (void)
// 功能: 对直接式按键和矩阵式按键进行检测和处理.
{
// --- 变量定义 ---
static bit anti_reinput;
uchar matrixkey;
// --- 直接式按键处理 ---
// 检测按键,是否对里程数和总价清零
if( CheckKey(keyLoadDefault, 0) )
{
LoadDefault(); // 装载默认值
while( keyLoadDefault == 0 ); // 等待按键弹起
}
// --- 矩阵式按键处理 ---
matrixkey = MatrixKeyScan(); // 调用键盘扫描函数
if( matrixkey && !anti_reinput )
{
MatrixKeyDecode(matrixkey); // 按键解码
anti_reinput = 1; // 防止因按键未松开引起的重复输入
}
else if( !matrixkey ) // 按键松开, 防重输入标记位清零
anti_reinput = 0;
}
#endif
//************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -