📄 keyprocess.c
字号:
//*************************************************************************
//**<程序名>:按键处理程序 **
//**<运行环境>:飞思卡尔MC9SDG128单片机 **
//**<作者>:LastRitter **
//**<完成时间>:2007年12月9日 **
//**<联系方式>:E-mail:superyongzhe@163.com;QQ:314665354。 **
//*************************************************************************
#include "includes.h"
#define NO_KEY 0xFF
#define KEY_PORT PORTA
#define KEY_DDR DDRA
#define KEY_0 0x01 //K3
#define KEY_1 0x02 //K2
#define KEY_2 0x04 //K1
#define CLICK_COUNT 20000
//*************************************************************************
//<<<<<<<<<<<<<<<<<<<<<<<模型车当方向和前速度>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
extern unsigned int ui_Direction;
extern unsigned int ui_Speed;
#define SET_STATE 0x00
#define SET_DIRECTION 0x01
#define SET_SPEED 0x02
unsigned char uc_KeyState=SET_STATE;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<按键扫描程序>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char ucKeyScan(void);
void vKeyFunction(unsigned char ucKeyCode)
{
switch(uc_KeyState)
{
case SET_STATE:
if(ucKeyCode==KEY_0)
{
uc_CarState=STATE_READY;
}
else
{
uc_CarState=STATE_START;
}
break;
case SET_DIRECTION:
if(ucKeyCode==KEY_0)
ui_Direction-=50;
else
ui_Direction+=50;
if(ui_Direction>STEER_DTY_MAX)
ui_Direction=STEER_DTY_MAX;
if(ui_Direction<STEER_DTY_MIN)
ui_Direction=STEER_DTY_MIN;
printp("K2 %3d\n",ui_Direction);
STEER_DTY=ui_Direction;
break;
case SET_SPEED:
if(ucKeyCode==KEY_0)
{
ui_Speed-=50;
MOTOR_DTY1=ui_Speed;
//printp("\nSpeed:%3d ",ui_Speed);
}
else
{
ui_Speed+=50;
MOTOR_DTY1=ui_Speed;
//printp("\nSpeed:%3d ",ui_Speed);
}
//printp(" %D",pst_CurParam->uiSpeed);
break;
default:break;
}
}
//*************************************************************************
//* *
//* ***********************按键处理程序************************* *
//* *
//*************************************************************************
void vKeyProcess(void)
{
unsigned char ucKeyCode;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//获取按键扫描码
ucKeyCode=ucKeyScan();
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//若按键无效则返回
if(ucKeyCode==NO_KEY)
return;
if(ucKeyCode==KEY_2)
{
// printp("K3\n");
if(uc_KeyState<2)
uc_KeyState++;
else
uc_KeyState=0;
}
else
{
if(ucKeyCode==KEY_0||ucKeyCode==KEY_1)
{
vKeyFunction(ucKeyCode);
}
}
PORTB=~ucKeyCode;
}
//*************************************************************************
//* *
//* ***********************按键扫描程序************************* *
//* *
//*************************************************************************
unsigned char ucKeyScan(void)
{
static unsigned char sucKeyTemp=NO_KEY; //保存上一次按键的扫描码。
static unsigned int suiClickCount=0; //保存按键被重复次数。
static unsigned char ucKeyCode; //保存当前案件扫描码。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//初始化案件端口
KEY_DDR =0xFF; //把键盘扫描端口设为输出。
KEY_PORT =0xFF; //端口输出高电平。
KEY_DDR =0x00; //把键盘扫描端口设为输入。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ucKeyCode=(~KEY_PORT)&0x0F;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//计算按键重复次数,用于消抖。
if(ucKeyCode==sucKeyTemp)
suiClickCount++;
else
{
suiClickCount=0;
sucKeyTemp=ucKeyCode;
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(!ucKeyCode)
return NO_KEY;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//根据按键重复次数判断按键是否有效。
if(suiClickCount<CLICK_COUNT)
return NO_KEY; //次数小于CLICK_COUNT则认为按键无效
else
{
suiClickCount=0; //次数大于CLICK_COUNT则返回按键扫描码
return ucKeyCode;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -