📄 keyboard.c
字号:
#include "typedef.h"
#include "keyBoard.h"
//扫描输入
Byte code keyInput[4] = {0x07, 0x0b, 0x0d, 0x0e};
/**********************以下定义16个按键****************/
#define KEY1_1 0xfff7
#define KEY1_2 0xfffb
#define KEY1_3 0xfffd
#define KEY1_4 0xfffe
#define KEY2_1 0xff7f
#define KEY2_2 0xffbf
#define KEY2_3 0xffdf
#define KEY2_4 0xffef
#define KEY3_1 0xf7ff
#define KEY3_2 0xfbff
#define KEY3_3 0xfdff
#define KEY3_4 0xfeff
#define KEY4_1 0x7fff
#define KEY4_2 0xbfff
#define KEY4_3 0xdfff
#define KEY4_4 0xefff
#define KEY1_12 0xfff3
#define KEY_NULL 0xffff
#define KEY_FIRST_ACC 2 /*第一次按键计次*/
#define KEY_CONTINUE_ACC 10 /*连续按键间隔计次*/
#define KEY_RELEASE_ACC 2 /*按键释放间隔次数*/
static char keyCode; /*保存按键码*/
extern Uchar volatile xdata D12_Y0;//键盘扫描时的输入地址,用到0-3
extern Uint8 xdata D12_Y2;//键盘扫描后的输出地址,用到4-7
extern idata Uchar D17CS;//赋值D12_Y0的寄存器
extern unsigned char volatile xdata D12_Y1;//原来的xCONTROLBYTE81K
extern idata unsigned char D16CS;//D12_Y1的寄存器,原来的xConByte81KValue
extern unsigned int backlightcount;
/*返回代码见key.h文件定义*/
char get_key(void)
{
char tmp;
key_process();
tmp = (Uchar)keyCode;
keyCode = 0;
return tmp;
}
/************************************
*
按键处理流程:
1)通过比较上一次的按键值来消除抖动。不相同就清除计次,相同就累加计次。
2)累加到一定次数认为是按键稳定,发送蜂鸣声,判断按键类型。
3)当按键持续一定时间后定时发送蜂鸣声和按键类型。
4)按键释放要有一定的时间。即两次连续按键要有一定时间间隔。
5)考虑本产品的实际情况,向上和向上按键允许连续,取消和确认只能是单次按键。
当有效按键后要发送蜂鸣声。
通过简单的状态机处理按键的抖动、单次按键、连续按键。
keyState有以下几个状态:
0:第一次按键状态,消除抖动状态。不相同就清除计次,相同就累加计次,到一定的次数认为是有效按键。
1:连续按键状态。
2:释放按键状态。
*
*************************************/
//extern void debug_msgNeeded(unsigned int value);
void key_process(void)
{
static bit initFlag = 0;
static Byte keyState;
static Byte keyAcc;
static Uint16 keyKeep;
Byte i;
Uint16 tmp[4],test;//四行扫描的结果保存的地方
Uint16 tmpValue;//最终保存结果
if( initFlag == 0 )
{
initFlag = 1;
keyState = 0;
keyAcc = 0;
keyKeep = KEY_NULL;
}
for (i=0; i<4; i++)
{
tmp[i] = 0;
D17CS &= 0xf0;//低4位清零
D17CS |= keyInput[i];
D12_Y0 = D17CS;
test = D12_Y2;//xCONTROLBYTE82;
tmp[i] = D12_Y2 &0xf0;//xCONTROLBYTE82 & 0xF0;
if (0 ==i)
tmp[i] = tmp[i]>>4;
else if (i > 1)
tmp[i] = tmp[i] << (4*(i-1));
}
//确定最终输出值
tmpValue = 0;
for (i=0; i<4; i++)
{
tmpValue += tmp[i];
}
/*通过计次来达到消除抖动的目的*/
if( tmpValue == keyKeep )
{
keyAcc ++;
}
else
{
keyAcc = 0;
keyKeep = tmpValue;
}
switch(keyState)
{
case 0: /*第一次按键状态*/
if( keyKeep == KEY_NULL )
{
keyAcc = 0;
break;
}
if( keyAcc == KEY_FIRST_ACC )
{
keyState = 1;
switch( keyKeep )
{
case KEY1_1:
keyCode = KEY_CODE_ENTER;//KEY_CODE_ALT;
break;
case KEY1_2:
keyCode = KEY_CODE_ESC;//KEY_CODE_NUM9;
break;
case KEY1_3:
keyCode = KEY_CODE_MENU;//KEY_CODE_NUM5;
break;
case KEY1_4:
keyCode = KEY_CODE_ALT;//KEY_CODE_NUM1;
break;
case KEY2_1:
keyCode = KEY_CODE_NUM4;//KEY_CODE_ENTER;
break;
case KEY2_2:
keyCode = KEY_CODE_NUM3;//KEY_CODE_NUM0;
break;
case KEY2_3:
keyCode = KEY_CODE_NUM2;//KEY_CODE_NUM6;
break;
case KEY2_4:
keyCode = KEY_CODE_NUM1;//KEY_CODE_NUM2;
break;
case KEY3_1:
keyCode = KEY_CODE_NUM8;//KEY_CODE_ESC;
break;
case KEY3_2:
keyCode = KEY_CODE_NUM7;//KEY_CODE_START;
break;
case KEY3_3:
keyCode = KEY_CODE_NUM6;//KEY_CODE_NUM7;
break;
case KEY3_4:
keyCode = KEY_CODE_NUM5;//KEY_CODE_NUM3;
break;
case KEY4_1:
keyCode = KEY_CODE_START;//KEY_CODE_MENU;
break;
case KEY4_2:
keyCode = KEY_CODE_FUNC;//KEY_CODE_FUNC;
break;
case KEY4_3:
keyCode = KEY_CODE_NUM0;//KEY_CODE_NUM8;
break;
case KEY4_4:
keyCode = KEY_CODE_NUM9;//KEY_CODE_NUM4;
break;
case KEY1_12:
keyCode = KEY_LIGHT_CON;
break;
default:
keyState = 0;
keyAcc = 0;
break;
}
}
break;
case 1: /*连续按键状态*/
if( keyAcc == KEY_CONTINUE_ACC )
{
keyAcc = KEY_FIRST_ACC; /*防止计数溢出*/
}
else if( keyAcc == 0 )
{ /*按键有变化*/
keyState = 2;
}
break;
case 2: /*释放按键状态*/
if( (keyAcc== KEY_RELEASE_ACC) && (keyKeep==KEY_NULL) )
keyState = 0;
break;
default:
keyState = 0;
break;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -