⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyscan51.msa

📁 矩力MP4 GPIO及线控键盘应用源代码
💻 MSA
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************
 ** 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 + -