📄 _keyboard.c
字号:
/****************************************************************
** *
** FILE : _KeyBoard.C *
** *
** By : Cyb 2007.01.10 *
****************************************************************/
#include "includes.h"
#include "bsp.h"
#include "timetask.h"
#include "systask.h"
#include "message.h"
#include "errcode.h"
#include "errtask.h"
#include "uart_drv.h"
#include "hardware.h"
#include "DisplayTask.h"
#include "_KeyBoard.h"
#include "ScanKeyBoard.h"
#define LONGKEY 1
/*
*******************************************************************************
* define config parameters
*******************************************************************************
*/
#define PERIOD_KBSCAN MILTICK, 1
/*
*******************************************************************************
* define module variants
*******************************************************************************
*/
static TMR_TSK *KBScanTmr;
static INT8U Step;
static INT32U Value;
static INT32U StorKey;
static INT8U KeepTimes;
static INT8U Key;
static INT8U KeyTable[]={
0x01, //数字键"1"(礼貌用语1)
0x02, //数字键"5"(增大音量)
0x03, //数字键"9"(下行)
0x04, //进站
0x05, //数字键"2"(礼貌用语2)
0x06, //数字键"6"(减小音量)
0x07, //数字键"0"(快退)
0x08, //出站
0x09, //数字键"3"(礼貌用语3)
0x0a, //数字键"7"(按键音启闭)
0x0b, //确认键(快进)
0x0c, //重拨键
0x0d, //数字键"4"(礼貌用语4)
0x0e, //数字键"8"(上行)
0x0f, //取消键
0x10 //功能切换键
};
/*
*******************************************************************************
* Procure of pushing key
*******************************************************************************
*/
static void PushKeyProc(void)
{
StartTmr(KBScanTmr,PERIOD_KBSCAN);
if(Step > 5)
{
Step = 0;
}
if(Step==0) // 步骤0
{
Pulldown_AllX();
Value = ReadPort_AllY(); // 读Y口的值
Value |= ~(PORT_Y0 | PORT_Y1 | PORT_Y2|PORT_Y3 ); //看Y0~3有没有0
KeepTimes = 0; //初始化击键次数
if(Value == 0xffffffff)
{
return; //表示没有按键
}
else
{
Step = 1;
return;
}
}
if(Step==1) //步骤1
{
Pulldown_AllX();
Value = ReadPort_AllY(); //再次读Y口
Value |= ~(PORT_Y0 | PORT_Y1 | PORT_Y2|PORT_Y3);
if(Value == 0xffffffff) //如果还是FFFFFFFF,则返回步骤0
{
Step=0;
}
else
{ //否则扫描键盘
Value = ScanKeyBoard();
StorKey = Value;
if(Value==0xEE) //如果得到的是EE,返回步骤0
{
Step=0;
}
else //否则,确定有按键
{
Step=2;
Key = KeyTable[Value];
#if DEBUG_UARTNo_KEYBOARD <= 1
OSQPost(SysTaskMsgQue,MSG_DEBUG_KEYBOARD,Key,0);
#endif
OSQPost(DisplayTaskQ,MSG_DISPLAYTASK_KEY,Key,0);
}
}
return;
}
if(Step == 2) //步骤2
{
Value = ScanKeyBoard(); //扫描键盘
if(Value==0xff) //如果是FF
{
Step=4; //进入步骤4
}
else if(Value==StorKey) //如果跟原来的一样
{
if(++KeepTimes>25) //如果超过25次一样 ,认为是长键
{
Key = KeyTable[Value]|0x80; //或上80表示长按键
#if DEBUG_UARTNo_KEYBOARD <= 1
OSQPost(SysTaskMsgQue,MSG_DEBUG_KEYBOARD,Key,0);
#endif
OSQPost(DisplayTaskQ,MSG_DISPLAYTASK_KEY,Key,0);
#if LONGKEY
Step=3; //进入步骤3
#else
Step=5;
#endif
}
}
else if(Value!=StorKey)
{
Step=4; //进入步骤4
}
return;
}
if(Step==3) //步骤3
{
Value = ScanKeyBoard(); //扫描键盘
if(Value==0xff) //如果是FF
{
Step=4; //进入步骤4
}
else if(Value==StorKey) //如果跟原来的一样
{
if(++KeepTimes>150) //如果超过150次一样 ,认为是更长键
{
KeepTimes = 0;
Key = KeyTable[Value]|0x80; //或上80表示长按键
#if DEBUG_UARTNo_KEYBOARD <= 1
OSQPost(SysTaskMsgQue,MSG_DEBUG_KEYBOARD,Key,0);
#endif
OSQPost(DisplayTaskQ,MSG_DISPLAYTASK_KEY,Key,0);
Step=3; //进入步骤5
}
}
else if(Value!=StorKey)
{
Step=4; //进入步骤4
}
return;
}
if(Step==4)
{
Value = ScanKeyBoard(); //扫描键盘
if(Value ==0xff)
{ //如果是FF,返回步骤 0
Step=0;
}
else if(Value ==StorKey) //如果跟原来一样,返回步骤2
{
Step=2;
}
else if(Value!=StorKey) //如果不一样,返回步骤0
{
Step=0;
}
return;
}
if(Step==5) //步骤5
{
Value = ScanKeyBoard();
if(Value==0xff){ //如果是FF。返回步骤0
Step=0;
}else return; //一直返回
}
}
/*
*******************************************************************************
* initialization of keyboard module
*******************************************************************************
*/
void InitKeyBoard(void)
{
Step = 0;
InitPort_AllY();
KBScanTmr = CreateTimer(PushKeyProc,0);
StartTmr(KBScanTmr,PERIOD_KBSCAN);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -