📄 keypad.c
字号:
/*
****************************************************
键盘
****************************************************
*/
#include <reg52.H>
#include <rtx51tny.h>
#include "Typedef.H"
#include "UserDef.H"
#include "disp.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;
/* 公共全局变量 */
/* 私有全局变量 */
static INT8U sig_targ; // 接收键盘信号的任务
/***************************************************
按键任务
****************************************************/
static void TaskKey(void) _task_ TASK_KEY
{
INT8U n;
INT8U cnt = 0; //按键消抖计数器
INT16U PrevImg = 0x0FFF; //上次的扫描码
INT8U PrevKey = VK_NULL;
INT16U img;
float df;
INT8U d8;
INT16U d16;
INT32U d32;
INT32S d32S;
while (1)
{
os_wait(K_TMO,10,0);
img = 0;
//获取扫描码
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);
//按键消抖:连续5次不变的按键扫描值可确认为一个稳定的按键动作
if (PrevImg != img)
{
cnt = 0;
PrevImg = img;
continue;
}
PrevImg = img;
cnt ++;
if (cnt < 5)
{
continue;
}
cnt = 0;
//按键扫描码转换为虚键码
for (n=0;n<(sizeof(KeyMap)/8);n++)
{
if (KeyMap[n][0] == img)
{
break;
}
}
if ( n < (sizeof(KeyMap)/8) ) //检索到匹配值,有合法按键按下,发送按键消息
{
if (PrevKey != KeyMap[n][1]) //只在按键值变化时发送消息
{
PrevKey = KeyMap[n][1];
switch (KeyMap[n][1])
{
case VK_0: //演示:清屏
DISP_REQ;
dm.type = DTYPE_CLS;
os_send_signal(sig_targ);
break;
case VK_1: //演示:显示单个字符
DISP_REQ;
dm.type = DTYPE_CHAR;
dm.font = 1;
dm.x = 4;
dm.y = 20;
d8 = '*';
dm.DData = &d8;
os_send_signal(sig_targ);
break;
case VK_2: //演示:显示字符串
DISP_REQ;
dm.type = DTYPE_STR;
dm.font = 1;
dm.x = 4;
dm.y = 20;
dm.DData = "Hello";
os_send_signal(sig_targ);
break;
case VK_3: //演示:显示汉字
DISP_REQ;
dm.type = DTYPE_HZ;
dm.x = 4;
dm.y = 20;
d8 = 0;
dm.DData = &d8;
os_send_signal(sig_targ);
break;
case VK_4: //演示:显示浮点数
DISP_REQ;
dm.type = DTYPE_FLOAT;
dm.font = 1;
dm.x = 4;
dm.y = 20;
dm.len = 6;
df = 1.2345;
dm.DData = &df;
os_send_signal(sig_targ);
break;
case VK_5: //演示:显示8位无符号整数
DISP_REQ;
dm.type = DTYPE_INT8U;
dm.font = 1;
dm.x = 4;
dm.y = 20;
dm.len = 3;
d8 = 147;
dm.DData = &d8;
os_send_signal(sig_targ);
break;
case VK_6: //演示:显示16位无符号整数
DISP_REQ;
dm.type = DTYPE_INT16U;
dm.font = 1;
dm.x = 4;
dm.y = 20;
dm.len = 4;
d16 = 6789;
dm.DData = &d16;
os_send_signal(sig_targ);
break;
case VK_7: //演示:显示32位无符号整数
DISP_REQ;
dm.type = DTYPE_INT32U;
dm.font = 1;
dm.x = 4;
dm.y = 20;
dm.len = 8;
d32 = 258369;
dm.DData = &d32;
os_send_signal(sig_targ);
break;
case VK_8: //演示:显示32位有符号整数
DISP_REQ;
dm.type = DTYPE_INT32S;
dm.font = 1;
dm.x = 4;
dm.y = 20;
dm.len = 8;
d32S = -69258;
dm.DData = &d32S;
os_send_signal(sig_targ);
break;
}
}
}
}
}
/***************************************************
任务创建函数
signal_target_task 接收键盘信号的任务编号
****************************************************/
void TaskCreate_Key(INT8U signal_target_task)
{
sig_targ = signal_target_task;
os_create_task(TASK_KEY);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -