📄 keyscan51.msa
字号:
ld (RTCHold_Counter),a //HOLD pin检测定时器设定20ms*3=60ms
ret
RTC_ModeKey:
// ld a,(TheLastHold)
// cp 0
// jr z,lsModeKeyCheck //高电平设为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 //两次检测结果一样就不发消息
ld (hl),a
and a
jr nz,lsSaveHighModeKey //高电平设为Hold
lsSaveLowModeKey:
ld a,Msg_Key_DVR //发dvr消息
lsSaveLowMsg:
ld e,a
mMSG_PutSysMsg
jr lsModeKeyOut
lsSaveHighModeKey:
ld a,Msg_Key_MP3 //发mp3消息
lsSaveHighMsg:
ld e,a
mMSG_PutSysMsg
lsModeKeyOut:
ld a,06h
ld (RTCHold_Counter),a //HOLD/mode pin检测定时器设定20ms*3=60ms
ret
/*
********************************************************************************
* the end of module
********************************************************************************
*/
#endif
#ifdef Hard_2085_key
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,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中断,到再次进入key中断服务,收到的IO值可能已为0xff
xor a
ld (RTCTimer_Counter),a
ret
//********************************************************
//开始对扫描到的键盘进行处理
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 //调用系统函数实现键值保存
xor a //有新键down,清标志
ld (TheLastKeyUpFlag),a
ret
//-----------------------------------------
KEY_isr_newkeydown: //update TheLastKey and DebouncingTimes
ld (hl),a //新键值保存
ld a,(TheLastKeyUpFlag) //最后一个按键是否抬起。用于解决复合键
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 :系统会根据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
//120ms时间到,按键的硬件中断还没有来,就发抬键消息
ld a,Msg_KeyShortUp
ld (TheLastKey),a
ld (TheLastKeyUpFlag),a //置非0
ld e,a
mMSG_PutSysMsg
lsRTCTimer_KeyboardRet:
//线控扫描的做法是没20ms扫描一次,4次的结果取平均。
ret
//------------------------------------------------------
RTC_HoldKey:
in a,(0f4h) //gpio_c2用作检测HOLD
and 0x04
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
ld (RTCHold_Counter),a //HOLD pin检测定时器设定20ms*3=60ms
ret
RTC_ModeKey:
// ld a,(TheLastHold)
// cp 0
// jr z,lsModeKeyCheck //高电平设为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 //两次检测结果一样就不发消息
ld (hl),a
and a
jr nz,lsSaveHighModeKey //高电平设为Hold
lsSaveLowModeKey:
ld a,Msg_Key_DVR //发dvr消息
lsSaveLowMsg:
ld e,a
mMSG_PutSysMsg
jr lsModeKeyOut
lsSaveHighModeKey:
ld a,Msg_Key_MP3 //发mp3消息
lsSaveHighMsg:
ld e,a
mMSG_PutSysMsg
lsModeKeyOut:
ld a,06h
ld (RTCHold_Counter),a //HOLD/mode pin检测定时器设定20ms*3=60ms
ret
#endif
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -