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

📄 drv_key_rcode.msa

📁 Actions ucOS-II mp3方案源码,可以做参考
💻 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 + -