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

📄 keyscan51.msa

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