📄 keyboard.c
字号:
#include<stdio.h>
#include<stdlib.h>
typedef unsigned char uchar;
#define SIZE_OF_KEYBD_MENU 20 //菜单长度
volatile uchar KeyFuncIndex=0;
volatile uchar Keyvalue=0; //键值
void (*KeyFuncPtr)(); //按键功能指针
typedef struct
{
uchar KeyStateIndex; //当前状态索引号
uchar KeyDnState; //按下"向下"键时转向的状态索引号
uchar KeyUpState; //按下"向上"键时转向的状态索引号
uchar KeyLState; //左
uchar KeyRState;
uchar KeyCrState; //按下"回车"键时转向的状态索引号
uchar KeyEscState; //按下"Esc"键时的转向状态
void (*DspOperate)(); //当前状态应该执行的菜单显示功能
} KbdTabStruct;
KbdTabStruct KeyTab[SIZE_OF_KEYBD_MENU]=
{
{ 0, 1, 1, 1, 1, 1, 1, (*GDDZ)}, //顶层 只显示一个屏保, 按任意键进入 第二层第一个菜单
{ 1, 2, 2, 2, 2, 3, 0, (*DspUserInfo)}, //第二层 函数实现显示第二层的第一个菜单 回车显示第三层DspUserInfo的第一个菜单(反白显示)
{ 2, 1, 1, 1, 1, 7, 0, (*DspServiceInfo)}, //第二层 函数实现显示第二层的第二个菜单 回车显示第三层DspServiceInfo的第一个菜单(反白显示)
{ 3, 4, 6, 6, 4, 11, 1, (*DspVoltInfo)}, //第三层>>DspUserInfo的展开, 向上就翻转,向下反白显示第二个菜单
{ 4, 5, 3, 3, 5, 4, 1, (*DspCurrInfo)}, //第三层>>DspUserInfo的展开
{ 5, 6, 4, 4, 6, 5, 1, (*DspFreqInfo)}, //第三层>>DspUserInfo的展开
{ 6, 3, 5, 5, 3, 6, 1, (*DspCableInfo)}, //第三层>>DspUserInfo的展开
{ 7, 8, 10, 10, 8, 7, 2, (*DspSetVoltLevel)}, //第三层>>DspServiceInfo的展开
{ 8, 9, 7, 7, 9, 8, 2, (*DspEightTwo)},
{ 9, 10, 8, 8, 10, 9, 2, (*DspNineThree)},
{10, 7, 9, 9, 7, 10, 2, (*DspTenFour)},
{11, 11, 11, 11, 11, 11, 3, (*OperateThrOne)} //进入第三层菜单进行设置
};
void GetKeyInput(void)
{
Keyvalue=P1&0x07; //去掉高5bit
delay(50000);
switch(Keyvalue)
{
case 1: //回车键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyCrState;
break;
}
case 2: //向上键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
break;
}
case 4: //向下键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDnState;
break;
}
default: //按键错误的处理
{
break;
}
}
KeyFuncPtr=KeyTab[KeyFuncIndex].DspOperate;
(*KeyFuncPtr)(); //执行当前按键的操作
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -