📄 drv_key_rcode.msa
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
* CORE FUNCTIONS
*
(c) Copyright 1992-2001, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* File :
* By :
*********************************************************************************************************
*/
#include "irqmanager.h"
#include "driver.h"
#include "key.h"
public KeyISR
public KeyTimerISR
public CmpKey
extern SetTimer
extern KillTimer
extern PutSysMsg
extern ?BANK_CALL_DIRECT_L08
#define STICK_TIMES 8
rseg KY_RDATA
/************************************************************/
RTCTimer_Counter defb 00H
StickTimes defb 00h
SysKeyDownValue defb 00h
TheLastKey defb 0ffh
DebouncingTimes defb 00h
KeyTimer defb 00h
rseg KEYFunc
/*
*********************************************************************************************************
* KeyISR
*
* Description:通过按键的时间判断是down/hold/long hold状态,如果按键抬起后120ms没有按键则发出upMsg
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
KeyISR:
call lwrd ClearKeyIntFlag
ld a,06h
ld (lwrd RTCTimer_Counter),a
KeyScan:
out (0C0H),a
I0O0:
in a,(0c0h)
rra
jr c,I1O0
ld a,lwrd KeyNext
jr CmpKey
I1O0:
rra
jr c,I2O0
ld a,lwrd KeyPrev
jr CmpKey
I2O0:
rra
jr c,CheckReg2
ld a,lwrd KeyMode
jr CmpKey
CheckReg2:
in a,(0C0H)
I2O1:
rla
rla
jr c,I1O1
ld a,lwrd KeyPlay
jr CmpKey
I1O1:
rla
jr c,I0O1
ld a,lwrd KeyVolSub
jr CmpKey
I0O1:
rla
jr c,CheckReg4
ld a,lwrd KeyVolAdd
jr CmpKey
CheckReg4:
in a,(0C0H)
in a,(0C0H)
rra
I0O2:
jr c,I1O2
ld a,lwrd KeyRec
jr CmpKey
I1O2:
rra
jr c,I2O2
ld a,KeyLoop
jr CmpKey
I2O2:
rra
jr c,KeyISREnd
ld a,lwrd KeyEQ
jr CmpKey
KeyISREnd:
// xor a
// ld (lwrd RTCTimer_Counter),a
ret
/*
*********************************************************************************************************
* CmpKey
*
* Description:
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
CmpKey:
ld hl, lwrd TheLastKey
cp (hl)
jr nz,KeyNew
ld hl,lwrd DebouncingTimes
inc (hl)
ld a,(hl)
cp 1
jr z,KeyDown
ld hl, lwrd StickTimes
cp (hl)
jp nz,lwrd KeyISREnd
xor a
ld (lwrd DebouncingTimes),a
ld a,STICK_TIMES
ld (hl),a
jp lwrd KeyISREnd
KeyDown:
ld a,(lwrd TheLastKey)
ld (lwrd SysKeyDownValue),a
ld e,a
call lwrd PutSysMsg
ld hl,lwrd KeyTimer
cp (hl)
jr z,notuninstall
call lwrd uninstallKeyTimer
notuninstall:
call lwrd installKeyTimer //不能每次down都installkeyTimer
ret
//jp lwrd KeyISREnd
KeyNew:
ld (hl),a
xor a
ld (lwrd DebouncingTimes),a
// ld (lwrd RTCTimer_Counter),a
ld a,STICK_TIMES
ld (lwrd StickTimes),a
jp lwrd KeyISREnd
ClearKeyIntFlag:
//in a,(26h) //bug
//and 40h
ld a,40h
out (26h),a
ret
installKeyTimer:
ld de, lwrd KeyTimerISR
ld c, 2
ld a, byte3 SetTimer
ld hl, lwrd SetTimer
call ?BANK_CALL_DIRECT_L08
ld a,l
ld (lwrd KeyTimer),a
ld a,06h
ld (lwrd RTCTimer_Counter),a
ret
uninstallKeyTimer:
ld a,(lwrd KeyTimer)
ld e,a
ld a, byte3 KillTimer
ld hl, lwrd KillTimer
call ?BANK_CALL_DIRECT_L08
ld a,0h
ld (lwrd KeyTimer),a
ld (lwrd RTCTimer_Counter),a
ret
/*
*********************************************************************************************************
* KeyTimerISR
*
* Description:
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
KeyTimerISR:
ld a,(lwrd RTCTimer_Counter)
dec a
ld (lwrd RTCTimer_Counter),a
jr nz,KeyTimerISRExit
ld a,(lwrd SysKeyDownValue)
or 40h
ld e,a
call lwrd PutSysMsg
call lwrd uninstallKeyTimer
KeyTimerISRExit:
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -