?? keyprocess.c
字號(hào):
//*************************************************************************
//**<程序名>:按鍵處理程序 **
//**<運(yùn)行環(huán)境>:飛思卡爾MC9SDG128單片機(jī) **
//**<作者>:LastRitter **
//**<完成時(shí)間>:2007年12月9日 **
//**<聯(lián)系方式>: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
//*************************************************************************
//<<<<<<<<<<<<<<<<<<<<<<<模型車當(dāng)方向和前速度>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
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; //保存按鍵被重復(fù)次數(shù)。
static unsigned char ucKeyCode; //保存當(dāng)前案件掃描碼。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//初始化案件端口
KEY_DDR =0xFF; //把鍵盤掃描端口設(shè)為輸出。
KEY_PORT =0xFF; //端口輸出高電平。
KEY_DDR =0x00; //把鍵盤掃描端口設(shè)為輸入。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ucKeyCode=(~KEY_PORT)&0x0F;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//計(jì)算按鍵重復(fù)次數(shù),用于消抖。
if(ucKeyCode==sucKeyTemp)
suiClickCount++;
else
{
suiClickCount=0;
sucKeyTemp=ucKeyCode;
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(!ucKeyCode)
return NO_KEY;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//根據(jù)按鍵重復(fù)次數(shù)判斷按鍵是否有效。
if(suiClickCount<CLICK_COUNT)
return NO_KEY; //次數(shù)小于CLICK_COUNT則認(rèn)為按鍵無效
else
{
suiClickCount=0; //次數(shù)大于CLICK_COUNT則返回按鍵掃描碼
return ucKeyCode;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -