📄 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 + -