?? keyscan51.msa
字號:
ld (RTCHold_Counter),a //HOLD pin檢測定時器設(shè)定20ms*3=60ms
ret
RTC_ModeKey:
// ld a,(TheLastHold)
// cp 0
// jr z,lsModeKeyCheck //高電平設(shè)為Hold
// ld a,Msg_KeyHold //hold有效時的處理
// ld (TheLastKey),a
// jp KEY_isr_storekey
lsModeKeyCheck:
in a,(ModeSwitchIO) //gpio_b7用作檢測mode
and SetModeSwitchIOBit //0x80 bit7
ld hl,TheLastMode
cp (hl)
jr z,lsModeKeyOut //兩次檢測結(jié)果一樣就不發(fā)消息
ld (hl),a
and a
jr nz,lsSaveHighModeKey //高電平設(shè)為Hold
lsSaveLowModeKey:
ld a,Msg_Key_DVR //發(fā)dvr消息
lsSaveLowMsg:
ld e,a
mMSG_PutSysMsg
jr lsModeKeyOut
lsSaveHighModeKey:
ld a,Msg_Key_MP3 //發(fā)mp3消息
lsSaveHighMsg:
ld e,a
mMSG_PutSysMsg
lsModeKeyOut:
ld a,06h
ld (RTCHold_Counter),a //HOLD/mode pin檢測定時器設(shè)定20ms*3=60ms
ret
/*
********************************************************************************
* the end of module
********************************************************************************
*/
#endif
#ifdef Hard_2085_key
sISR_Keyboard:
ld a,40h //清中斷標(biāo)志
out (REG26_MASTER_IRQ_STATUS),a
ld a,06h //重新啟動判斷鍵盤抬起的定時器
ld (RTCTimer_Counter),a //即120毫秒沒有來鍵盤中斷,認(rèn)為鍵盤抬起,不能設(shè)成80ms,因為Keyscan Debouncing time是40ms
//當(dāng)中斷竟?fàn)帟r,有可能先響應(yīng)RTCISR再響應(yīng)KEYISR,會導(dǎo)致提早發(fā)KeyUp消息
ld a,(TheLastHold)
cp 0
jr z,Key_UnHold //高電平設(shè)為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,B3B0
ld a,Msg_KeyNext
jr StartComareKEY
REG0Bit1:
rra
jr c,REG0Bit2
ld a,Msg_KeyLast //k4,B3B1
jr StartComareKEY
REG0Bit2:
rra
jr c,CheckREG1
ld a,Msg_KeyMenu //k7,B3B2
jr StartComareKEY
//******************************************************
CheckREG1:
in a,(REGC0_KEY_SCAN_DATA)
REG1Bit6:
rla
rla
jr c,REG1Bit5
ld a,Msg_KeyPlayPause //k8,B4B2
jr StartComareKEY
REG1Bit5:
rla
jr c,REG1Bit4
ld a,Msg_KeyVolSub //k5,B4B1
jr StartComareKEY
REG1Bit4:
rla
jr c,CheckREG3
ld a,Msg_KeyVolAdd //k2,B5B0
jr StartComareKEY
//******************************************************
CheckREG3:
in a,(REGC0_KEY_SCAN_DATA)
in a,(REGC0_KEY_SCAN_DATA)
rra
REG3Bit0:
jr c,REG3Bit1
ld a,Msg_KeyREC //k3,B5B0
jr StartComareKEY
REG3Bit1:
rra
jr c,REG3Bit2
ld a,Msg_KeyLoop //k6,B5B1
jr StartComareKEY
REG3Bit2:
rra
jr c,MissKey //誤鍵
ld a,Msg_KeyEQ //k9,B5B2
jr StartComareKEY
MissKey: //因為其他中斷延遲key中斷,到再次進(jìn)入key中斷服務(wù),收到的IO值可能已為0xff
xor a
ld (RTCTimer_Counter),a
ret
//********************************************************
//開始對掃描到的鍵盤進(jìn)行處理
StartComareKEY:
ld hl,TheLastKey
cp (hl)
jr nz,KEY_isr_newkeydown //如果是新按鍵,跳轉(zhuǎn),實現(xiàn)去抖動
ld hl,DebouncingTimes
inc (hl)
ld a,(hl)
cp 1 //值到1就保存一次
jr z,KEY_isr_storekey
ld hl,StickTimes //第一次保存之后,設(shè)置使按鍵中斷沒來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 //調(diào)用系統(tǒng)函數(shù)實現(xiàn)鍵值保存
xor a //有新鍵down,清標(biāo)志
ld (TheLastKeyUpFlag),a
ret
//-----------------------------------------
KEY_isr_newkeydown: //update TheLastKey and DebouncingTimes
ld (hl),a //新鍵值保存
ld a,(TheLastKeyUpFlag) //最后一個按鍵是否抬起。用于解決復(fù)合鍵
or a
jr nz,NeedNotStoreKeyUp
ld e,Msg_KeyShortUp
mMSG_PutSysMsg
NeedNotStoreKeyUp: //變量初始化
xor a
ld (DebouncingTimes),a
ld (RTCTimer_Counter),a //保證先有keydown才有keyup
ld a,FIRST_STICK_TIMES
ld (StickTimes),a
ret
/*
********************************************************************************
* RTCTimer_Keyboard
*
* Description :enable keyboard interrupt again
*
* Arguments :none
*
* Returns :
*
* Notes :系統(tǒng)會根據(jù)RTC設(shè)置來調(diào)用此程序
*
********************************************************************************
*/
sISR_RTCTimer: //計數(shù)時間單位為20ms
ld a,(RTCHold_Counter) //計數(shù)為20ms*6=120ms
or a
jr z,lsBckLightCheckBegin
dec a
ld (RTCHold_Counter),a
jr nz,lsBckLightCheckBegin
call RTC_HoldKey //做HOLD鍵查詢?nèi)蝿?wù)
call RTC_ModeKey
lsBckLightCheckBegin:
ld a,(RTCTimer_Counter)
or a
jr z,lsRTCTimer_KeyboardRet
dec a
ld (RTCTimer_Counter),a
jr nz,lsRTCTimer_KeyboardRet
//120ms時間到,按鍵的硬件中斷還沒有來,就發(fā)抬鍵消息
ld a,Msg_KeyShortUp
ld (TheLastKey),a
ld (TheLastKeyUpFlag),a //置非0
ld e,a
mMSG_PutSysMsg
lsRTCTimer_KeyboardRet:
//線控掃描的做法是沒20ms掃描一次,4次的結(jié)果取平均。
ret
//------------------------------------------------------
RTC_HoldKey:
in a,(0f4h) //gpio_c2用作檢測HOLD
and 0x04
ld hl,TheLastHold
cp (hl)
jr z,HoldKeyOut //兩次檢測結(jié)果一樣就不發(fā)消息
ld (hl),a
and a
jr nz,SaveHoldKey //高電平設(shè)為Hold
SaveUnHoldKey:
ld a,Msg_KeyUnHold //發(fā)UNHOLD消息
ld e,a
mMSG_PutSysMsg
jr HoldKeyOut
SaveHoldKey:
ld a,Msg_KeyHold //發(fā)HOLD消息
ld e,a
mMSG_PutSysMsg
HoldKeyOut:
ld a,06h
ld (RTCHold_Counter),a //HOLD pin檢測定時器設(shè)定20ms*3=60ms
ret
RTC_ModeKey:
// ld a,(TheLastHold)
// cp 0
// jr z,lsModeKeyCheck //高電平設(shè)為Hold
// ld a,Msg_KeyHold //hold有效時的處理
// ld (TheLastKey),a
// jp KEY_isr_storekey
lsModeKeyCheck:
in a,(0xff) //gpio_g0用作檢測mode
and 0x01 //0x01 bit0
ld hl,TheLastMode
cp (hl)
jr z,lsModeKeyOut //兩次檢測結(jié)果一樣就不發(fā)消息
ld (hl),a
and a
jr nz,lsSaveHighModeKey //高電平設(shè)為Hold
lsSaveLowModeKey:
ld a,Msg_Key_DVR //發(fā)dvr消息
lsSaveLowMsg:
ld e,a
mMSG_PutSysMsg
jr lsModeKeyOut
lsSaveHighModeKey:
ld a,Msg_Key_MP3 //發(fā)mp3消息
lsSaveHighMsg:
ld e,a
mMSG_PutSysMsg
lsModeKeyOut:
ld a,06h
ld (RTCHold_Counter),a //HOLD/mode pin檢測定時器設(shè)定20ms*3=60ms
ret
#endif
end
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -