?? keyscan51.msa
字號:
/*****************************************************************
** key board interrupt **
** write by jfwoo & Gongee **
** 2002-6-12 **
** (c) Copyright Actions Co,Ld. **
** **
** revision history 1.0 2002-6-12 **
** revision history 2.0 2002-7-15 **
** revision history 3.0 2002-8-12 **
*****************************************************************/
/* 說明:
**A。 此鍵盤具有與PC 鍵盤相同的特性
** 1。重復的延時時間---- 按住某個鍵時,該鍵響應的重復速率
** 2。重復速度--------- 按住某個鍵時,該鍵響應重復前的延遲時間
** 一般,要保證重復的延時時間要比重復的速度要長,這樣既可以保證按一下鍵不會被重復響應,
** 也不至于降低重復按鍵的響應速度
**B。 此代碼是針對標準DEMO板的
**C。 用戶進程要區分長短按消息,必須對重復次數進行計數。
**
** -+----------------------------------+------------+------------+-----……-------+------#
** |___________重復的延時時間__________| |__重復速度___|
**
** 其中 + 表示驅動產生的消息, #表示鍵盤抬起消息
**
*/
#include "KY_Hard.h"
#define FIRST_STICK_TIMES 8
#define STICK_TIMES 8
#ifdef Hard_2051_key
#define HoldIO 0xf4
#define SetHoldIOBit 0x04 //bit2
#define ModeSwitchIO 0xf2
#define SetModeSwitchIOBit 0x80 //bit7
#endif
module ISR_Keyboard
public sISR_Keyboard
public RTCTimer_Counter
public RTCHold_Counter
public TheLastHold
public TheLastMode
public StickTimes
public sISR_RTCTimer
public TimeNo
public OldKeyIsr
rseg KY_RDATA
//************************************************************
RTCTimer_Counter defb 0x00 //按鍵抬起的定時器
RTCHold_Counter defb 0x00 //hold pin 檢測定時器
TheLastHold defb 0x00 //0h:HOLD 01h:Unhold
TheLastMode defb 0x00 //0 mp3 非0 dvr
DebouncingTimes defb 0x00 //按鍵次數記數
StickTimes defb 0x08 //按鍵多少次保存的設置
TheLastKey defb 0xff //按鍵去抖動的標志
TheLastKeyUpFlag defb 0x01 //最后一個按鍵是否抬起。用于應付復合鍵
test defb 0
TimeNo defb 0
OldKeyIsr defb 0,0
//************************************************************
/*
** FUNCTION: KeyInt
** PURPOSE: Keyboard interrupt
** PARAMETERS: none
** DESCRIPTION:
*/
//************************************************************
rseg KY_RCODE
#ifdef Hard_2051_key
//**********************************************************************//
//*******************keyi0(b0) keyi1(b1) keyi2(b2) keyi4(f0) keyi5(f1)**//
//*********keyo0(b4) reg0.0 reg0.1 reg0.2 reg0.4 reg0.5 **//
//****************** (Next) (Last) (Play) (vol+) (vol-) **//
//*********keyo1(b5) reg1.4 reg1.5 reg1.6 reg2.0 reg2.1 **//
//****************** (eq) (rec) (Mode) (Power) (Repeat) **//
//**********************************************************************//
sISR_Keyboard:
ld a,40h //清中斷標志
out (REG26_MASTER_IRQ_STATUS),a
ld a,06h //重新啟動判斷鍵盤抬起的定時器
ld (RTCTimer_Counter),a //即120毫秒沒有來鍵盤中斷,認為鍵盤抬起,不能設成80ms,因為Keyscan Debouncing time是40ms
//當中斷竟爭時,有可能先響應RTCISR再響應KEYISR,會導致提早發KeyUp消息
ld a,(TheLastHold)
cp 0
jr z,Key_UnHold //高電平設為Hold
ld a,Msg_KeyHold //hold有效時的處理
ld (TheLastKey),a
jp KEY_isr_storekey
Key_UnHold:
out (REGC0_KEY_SCAN_DATA),a //先將鍵盤指針指向0
//******************************************************
CheckREG0:
in a,(REGC0_KEY_SCAN_DATA) //Save Function keys
//******************************************************
REG0Bit0:
rra
jr c,REG0Bit1 //k1,B4B0
ld a,Msg_KeyNext
jr StartComareKEY
REG0Bit1:
rra
jr c,REG0Bit2
ld a,Msg_KeyLast //k2,B4B1
jr StartComareKEY
REG0Bit2:
rra
jr c,REG0Bit4
ld a,Msg_KeyPlayPause //k3,B4B2
jr StartComareKEY
REG0Bit4:
rra
rra
jr c,REG0Bit5
ld a,Msg_KeyVolAdd //k4,B4f0
jr StartComareKEY
REG0Bit5:
rra
jr c,CheckREG1
ld a,Msg_KeyVolSub //k5,B4f1
jr StartComareKEY
//******************************************************
CheckREG1:
in a,(REGC0_KEY_SCAN_DATA)
REG1Bit6:
rla
rla
jr c,REG1Bit5
ld a,Msg_KeyMenu //k6,B5B2
jr StartComareKEY
REG1Bit5:
rla
jr c,REG1Bit4
ld a,Msg_KeyREC //k7,B5B1
jr StartComareKEY
REG1Bit4:
rla
jr c,CheckREG2
ld a,Msg_KeyEQ //k8,B5B0
jr StartComareKEY
//******************************************************
CheckREG2:
in a,(REGC0_KEY_SCAN_DATA)
rra
REG2Bit0:
jr c,REG2Bit1
ld a,Msg_KeyPower //k9,B5f0
jr StartComareKEY
REG2Bit1:
rra
ret c
ld a,Msg_KeyRepeat //k10,B5f1
//********************************************************
//開始對掃描到的鍵盤進行處理
StartComareKEY:
ld hl,TheLastKey
cp (hl)
jr nz,KEY_isr_newkeydown //如果是新按鍵,跳轉,實現去抖動
ld hl,DebouncingTimes
inc (hl)
ld a,(hl)
cp 1 //值到1就保存一次
jr z,KEY_isr_storekey
ld hl,StickTimes //第一次保存之后,設置使按鍵中斷沒來8次再保存一次鍵值
cp (hl)
ret nz
xor a //8次到來之后,在把變量初始化
ld (DebouncingTimes),a
ld a,STICK_TIMES
ld (hl),a
ret
KEY_isr_storekey: //鍵值保存
ld a,(TheLastKey)
ld e,a
mMSG_PutSysMsg //調用系統函數實現鍵值保存
ret
//-----------------------------------------
KEY_isr_newkeydown: //update TheLastKey and DebouncingTimes
ld b,(hl)
ld (hl),a //新鍵值保存
ld a,Msg_KeyShortUp
cp b
jr z,NeedNotStoreKeyUp //保證抬鍵消息只發一次
ld e,Msg_KeyShortUp
mMSG_PutSysMsg
NeedNotStoreKeyUp: //變量初始化
xor a
ld (DebouncingTimes),a
ld a,FIRST_STICK_TIMES
ld (StickTimes),a
ret
/*
********************************************************************************
* RTCTimer_Keyboard
*
* Description :enable keyboard interrupt again
*
* Arguments :none
*
* Returns :
*
* Notes :系統會根據RTC設置來調用此程序
*
********************************************************************************
*/
sISR_RTCTimer: //計數時間單位為20ms
ld a,(RTCHold_Counter) //計數為20ms*6=120ms
or a
jr z,lsBckLightCheckBegin
dec a
ld (RTCHold_Counter),a
jr nz,lsBckLightCheckBegin
call RTC_HoldKey //做HOLD鍵查詢任務
call RTC_ModeKey
lsBckLightCheckBegin:
ld a,(RTCTimer_Counter)
or a
jr z,lsRTCTimer_KeyboardRet
dec a
ld (RTCTimer_Counter),a
jr nz,lsRTCTimer_KeyboardRet
ld (DebouncingTimes),a //120ms時間到,按鍵的硬件中斷還沒有來,就發抬鍵消息
ld a,FIRST_STICK_TIMES //相關變量初始化
ld (StickTimes),a
ld a,Msg_KeyShortUp
ld (TheLastKey),a
ld e,a
mMSG_PutSysMsg
lsRTCTimer_KeyboardRet:
ret
//------------------------------------------------------
RTC_HoldKey:
in a,(HoldIO) //gpio_c2用作檢測HOLD
and SetHoldIOBit //0x04 bit 2
ld hl,TheLastHold
cp (hl)
jr z,HoldKeyOut //兩次檢測結果一樣就不發消息
ld (hl),a
and a
jr nz,SaveHoldKey //高電平設為Hold
SaveUnHoldKey:
ld a,Msg_KeyUnHold //發UNHOLD消息
ld e,a
mMSG_PutSysMsg
jr HoldKeyOut
SaveHoldKey:
ld a,Msg_KeyHold //發HOLD消息
ld e,a
mMSG_PutSysMsg
HoldKeyOut:
ld a,06h
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -