觸摸按鍵處理

;**********************************************
;觸摸按鍵掃描範例程序
;**********************************************
;程序出口:
;KEYF對應8個觸摸按鍵
;KEYF,0-KEY1,KEYF~KEY2.......KEYF,7~KEY8
;KEYF,0=1表示KEY1按下。
;KEYF,1=1表示KEY2按下。
;KEYF,2=1表示KEY3按下。
;KEYF,3=1表示KEY4按下。
;KEYF,4=1表示KEY5按下。
;KEYF,5=1表示KEY6按下。
;KEYF,6=1表示KEY7按下。
;KEYF,7=1表示KEY8按下。

;B_KEY_EN=1     按鍵單次按下標誌
;B_KEY_LONG=1    按鍵長按標誌
;B_KEY_UP=0     按鍵放開標誌
;**********************************************
;#INCLUDE        CMS69F6162.H
;**********************************************
KEYF        EQU         08H            ;按鍵標誌位,按鍵輸出接口必須用BANK1,BANK0公用寄存器,該地址不能更改
KFLAG        EQU            0EH            ;按鍵標誌位,按鍵輸出接口必須用BANK1,BANK0公用寄存器,該地址不能更改
B_KEY_EN    EQU            KFLAG,0
B_KEY_LONG    EQU            KFLAG,1
B_KEY_UP    EQU            KFLAG,2
BANK1   DATA0L        EQU         ?            
BANK1   DATA0H        EQU         ?                
BANK1        DATA1L        EQU         ?            ;觸摸按鍵K1求和保存低位
BANK1        DATA1H        EQU         ?            ;觸摸按鍵K1求和保存高位
BANK1        DATA2L        EQU         ?            ;觸摸按鍵K2求和保存低位
BANK1        DATA2H        EQU         ?            ;觸摸按鍵K2求和保存高位
BANK1        DATA3L        EQU         ?            ;觸摸按鍵K3求和保存低位
BANK1        DATA3H        EQU         ?            ;觸摸按鍵K3求和保存高位
BANK1        DATA4L        EQU         ?            ;觸摸按鍵K4求和保存低位
BANK1        DATA4H        EQU         ?            ;觸摸按鍵K4求和保存高位
BANK1        DATA5L        EQU         ?            ;觸摸按鍵K5求和保存低位
BANK1        DATA5H        EQU         ?            ;觸摸按鍵K5求和保存高位
BANK1        DATA6L        EQU         ?            ;觸摸按鍵K6求和保存低位
BANK1        DATA6H        EQU         ?            ;觸摸按鍵K6求和保存高位
BANK1        DATA7L        EQU         ?            ;觸摸按鍵K7求和保存低位
BANK1        DATA7H        EQU         ?            ;觸摸按鍵K7求和保存高位                                                     

BANK1       KEYC        EQU         ?            ;按鍵有效次數
BANK1       KOLD        EQU         ?            ;舊的鍵值
BANK1       KDATA        EQU         ?            ;有按鍵後保存的按鍵值
BANK1       KSUB        EQU         ?

BANK1       K0DAT0L        EQU         ?            ;按鍵舊值(必須順序排列)
BANK1       K0DAT1L        EQU         ?        
BANK1       K0DAT01H    EQU         ?
BANK1       K0DAT2L        EQU         ?
BANK1       K0DAT3L        EQU         ?
BANK1       K0DAT23H    EQU         ?

BANK1       K1DAT0L        EQU         ?            ;按鍵舊值(必須順序排列)
BANK1       K1DAT1L        EQU         ?        
BANK1       K1DAT01H    EQU         ?
BANK1       K1DAT2L        EQU         ?
BANK1       K1DAT3L        EQU         ?
BANK1       K1DAT23H    EQU         ?

BANK1       K2DAT0L        EQU         ?            ;按鍵舊值(必須順序排列)
BANK1       K2DAT1L        EQU         ?        
BANK1       K2DAT01H    EQU         ?
BANK1       K2DAT2L        EQU         ?
BANK1       K2DAT3L        EQU         ?
BANK1       K2DAT23H    EQU         ?

BANK1       K3DAT0L        EQU         ?            ;按鍵舊值(必須順序排列)
BANK1       K3DAT1L        EQU         ?    
BANK1       K3DAT01H    EQU         ?
BANK1       K3DAT2L        EQU         ?
BANK1       K3DAT3L        EQU         ?
BANK1       K3DAT23H    EQU         ?

BANK1       K4DAT0L        EQU         ?            ;按鍵舊值(必須順序排列)
BANK1       K4DAT1L        EQU         ?        
BANK1       K4DAT01H    EQU         ?
BANK1       K4DAT2L        EQU         ?
BANK1       K4DAT3L        EQU         ?
BANK1       K4DAT23H    EQU         ?

BANK1       K5DAT0L        EQU         ?            ;按鍵舊值(必須順序排列)
BANK1       K5DAT1L        EQU         ?    
BANK1       K5DAT01H    EQU         ?
BANK1       K5DAT2L        EQU         ?
BANK1       K5DAT3L        EQU         ?
BANK1       K5DAT23H    EQU         ?

BANK1       K6DAT0L        EQU         ?            ;按鍵舊值(必須順序排列)
BANK1       K6DAT1L        EQU         ?        
BANK1       K6DAT01H    EQU         ?
BANK1       K6DAT2L        EQU         ?
BANK1       K6DAT3L        EQU         ?
BANK1       K6DAT23H    EQU         ?

BANK1       K7DAT0L        EQU         ?            ;按鍵舊值(必須順序排列)
BANK1       K7DAT1L        EQU         ?        
BANK1       K7DAT01H    EQU         ?
BANK1       K7DAT2L        EQU         ?
BANK1       K7DAT3L        EQU         ?
BANK1       K7DAT23H    EQU         ?

BANK1       ADTIME        EQU            ?   
BANK1       KSTOPL        EQU         ?    

BANK1       KCOUNT        EQU         ?
BANK1       K_TEMPL        EQU            ?
BANK1       K_TEMPH     EQU         ?
BANK1       K_TEMP        EQU         ?
BANK1       CD_COUNT    EQU         ?
BANK1       KLONGC      EQU         ?  
DATAL        EQU         DATA0L        ;計算時將DATA0L、DATA0H放入DATAL跟DATAH中,避免經常操作MP
DATAH        EQU         DATA0H        ;Key0第一個處理,可以當做臨時存放其它用    

;*******************************************************
BANKSEL_BANK1    MACRO       ;設置BANK1
        SETB     FLAGS,4
ENDM

BANKSEL_BANK0    MACRO       ;設置BANK0
        CLRB     FLAGS,4
ENDM

C_KCOUNT     EQU         .8            ;按鍵個數
C_KSAVE         EQU         .2            ;保存幾個按鍵舊值(按鍵舊值必須順序排列)
C_KEYC         EQU         .4            ;連續檢測到多少次認爲有按鍵
C_FRIST_TIME EQU        .80            ;按鍵初次長按確認時間
C_LONG_TIME     EQU        .5            ;
;********************************************************
;按鍵通道定義表
C_P00_CH     EQU         0028H         ;P0,0 
C_P01_CH     EQU         0029H         ;P0,1       
C_P02_CH     EQU         002AH         ;P0,2 
C_P03_CH     EQU         002BH         ;P0,3 
C_P04_CH     EQU         002CH         ;P0,4 
C_P05_CH     EQU         002DH         ;P0,5 
C_P06_CH     EQU         002EH         ;P0,6 
C_P07_CH     EQU         002FH         ;P0,7 
C_P10_CH     EQU         0128H         ;P1,0 
C_P11_CH     EQU         0129H         ;P1,1 
C_P12_CH     EQU         012AH         ;P1,2 
C_P13_CH     EQU         012BH         ;P1,3 
C_P14_CH     EQU         012CH         ;P1,4 
C_P16_CH     EQU         012DH         ;P1,6 
C_P20_CH     EQU         012EH         ;P2,0
C_P21_CH     EQU         012FH         ;P2,1 
;----------------------------------------------------------
;選擇觸摸通道;只需要將上面定義的對應IO通道定義在下面8個按鍵裏
C_KEY1_CH    EQU         C_P00_CH      
C_KEY2_CH    EQU         C_P01_CH      
C_KEY3_CH    EQU         C_P02_CH      
C_KEY4_CH    EQU         C_P03_CH      
C_KEY5_CH    EQU         C_P04_CH      
C_KEY6_CH    EQU         C_P05_CH      
C_KEY7_CH    EQU         C_P06_CH      
C_KEY8_CH    EQU         C_P07_CH      
;*********************************************************
; 觸摸通道口電容選擇
C_KCAP_0     EQU       B'00000010' ;按鍵口不接電容
C_KCAP_1     EQU       B'00001010' ;按鍵口接電容c*1
C_KCAP_2     EQU       B'00010010' ;按鍵口接電容c*2
C_KCAP_3     EQU       B'00011010' ;按鍵口接電容c*3
C_KCAP_4     EQU       B'00100010' ;按鍵口接電容c*4
C_KCAP_5     EQU       B'00101010' ;按鍵口接電容c*5
C_KCAP_6     EQU       B'00110010' ;按鍵口接電容c*6
C_KCAP_7     EQU       B'00111010' ;按鍵口接電容c*7

C_KEY1_ADJ   EQU       C_KCAP_0
C_KEY2_ADJ   EQU       C_KCAP_0
C_KEY3_ADJ   EQU       C_KCAP_0
C_KEY4_ADJ   EQU       C_KCAP_0
C_KEY5_ADJ   EQU       C_KCAP_0
C_KEY6_ADJ   EQU       C_KCAP_0
C_KEY7_ADJ   EQU       C_KCAP_0
C_KEY8_ADJ   EQU       C_KCAP_0
;*********************************************************
;按鍵靈敏度設置常量
C_KEY1_LMD   EQU        .6      ;K1靈敏度
C_KEY2_LMD   EQU        .6      ;K2靈敏度
C_KEY3_LMD   EQU        .6      ;K3靈敏度
C_KEY4_LMD   EQU        .6      ;K4靈敏度
C_KEY5_LMD   EQU        .6      ;K5靈敏度
C_KEY6_LMD   EQU        .6      ;K6靈敏度
C_KEY7_LMD   EQU        .6      ;K7靈敏度
C_KEY8_LMD   EQU        .6      ;K8靈敏度

;******************************************

;------------------------------------------
;按鍵檢測子程序,重鍵模式
;1.25ms進一次
;每進一次檢測一遍所有按鍵
;按鍵出口:KEYF

;------------------------------------------
_KSCAN:
        BANKSEL_BANK1          
        CLR         KCOUNT
        CLR            KDATA
__KSCAN_LOOP:
        CLR         KEY_C
        CLR         KEY_C1
        CLR         KSTOPL  
        LDIA        B'10010010'        ;放電
        LD          P1CH,A
        CLRB        P1,5
        NOP
        LDIA        B'10001010'        ;設置P1.5爲觸摸用電容口
        LD          P1CH,A
        LDIA        TABLE_KEY_ADJ$H            ;將"TABLE_SEG"所表示地址的高位賦給"TABLE_SPH"
        LD          TABLE_SPH,A
        LDIA        TABLE_KEY_ADJ$L            ;將"TABLE_SEG"所表示地址的低位賦給"TABLE_SPL"    
        ADDA        KCOUNT    
        LD          TABLE_SPL,A
        SZB         FLAGS,C
        INCR        TABLE_SPH
        TABLEA
        ORIA        002H
        LD          KEY_C1,A


        LDIA        TABLE_KEY_CH$H            ;將"TABLE_SEG"所表示地址的高位賦給"TABLE_SPH"
        LD          TABLE_SPH,A
        LDIA        TABLE_KEY_CH$L            ;將"TABLE_SEG"所表示地址的低位賦給"TABLE_SPL"    
        ADDA        KCOUNT    
        LD          TABLE_SPL,A
        SZB         FLAGS,C
        INCR        TABLE_SPH
        TABLEA
        LD          KEY_C,A            ;開啓觸摸檢測
        SZB         TABLE_DATAH,0
        SETB        KEY_C1,6
        NOP
        CLR            ADTIME
        SETB        KEY_C,7        
__KSCAN_WAIT:
        SZB            KEY_C1,7        ;判斷觸摸完成標誌
        JP          ___KSCAN_WAIT_OK
        SZDECR        ADTIME
        JP            __KSCAN_WAIT
        JP          ___KSCAN_WAIT_ERR
___KSCAN_WAIT_OK:
        CALL        GET_SUM_ADD

        
        LD          A,KEY_DATAL
        ADDR        IAR    
        INCR        MP                    ;MP=DATA0H
        SZB         FLAGS,C
        INCR        IAR        
        LD          A,KEY_DATAH
        ADDR        IAR
        
        INCR        KCOUNT                ;每個按鍵加1次
        LDIA        C_KCOUNT            ;按鍵個數
        SUBA        KCOUNT
        SNZB         FLAGS,C
        JP          __KSCAN_LOOP
        CLR         KCOUNT
        
        
        INCR        CD_COUNT                ;是否已經16次求和
        LDIA        .8
        SUBA        CD_COUNT
        SNZB        FLAGS,C
        JP          _KEY_BACK
        CLR         CD_COUNT
        JP          __KSCAN_JUGE
;********************************************
;*********************************************
___KSCAN_WAIT_ERR:  ;一次檢測不到觸摸完成直接清初值
        CALL        _CLR_KEY_SUM_RAM
        CLR         KEYF
        CALL        _CLR_NO_KEY_DAT
        JP          _KEY_BACK               
;--------------------------------------------
;上面部分按鍵檢測完成
;下面進行按鍵鍵值判斷
;將16位減法轉換成16位加法
;--------------------------------------------
__KSCAN_JUGE:
        CLR         KCOUNT
        CLR         KDATA                ;表示本次檢測有沒有按鍵
        CLR         KSUB
_KEY_LOOP:    
        CALL        GET_SUM_ADD  
        LD          A,IAR                ;將DATA0H、DATA0L賦給DATAH、DATAL
        LD          DATAL,A
        INCR        MP                
        LD          A,IAR
        LD          DATAH,A
        
        RRCR        DATAH                ;除以16
        RRCR        DATAL
        RRCR        DATAH
        RRCR        DATAL
        RRCR        DATAH
        RRCR        DATAL
        ;RRCR        DATAH
        ;RRCR        DATAL
        
        LDIA        0FH
        ANDR        DATAH

        COMR        DATAL                ;取反以做16位加法
        COMR        DATAH
;---------------------------------------
_GET_KEYF:                            ;獲得當前檢測按鍵的位,放入KEYF_BAK。
        INCA        KCOUNT
        CALL        GET_KEY_DAT
        SUBA        KEYF
        SZB         FLAGS,Z
        JP          __KEY_HAVE_CHECK        ;檢測的按鍵原來有按鍵
;---------------------------------------
_KEY_NO_CHK:                                ;檢測的按鍵原來沒有按鍵,判斷按鍵按下            
        CLR         CD_COUNT                ;表示取幾次舊值減去當前值        
_KEY_SUB_LOOP:    
        CALL        GET_CMDAT_ADD
         LD          A,CD_COUNT
        CALL        _GET_KEY_OLD            ;根據COUNT獲得舊值保存值K_TEMPL和K_TEMPH
_KEY_SUB:                                ;16位減法程序,用新值加上舊值的補碼
        SETB        FLAGS,C                ;補碼加1
        LD          A,DATAL
        ADDCR        K_TEMPL
        LD          A,DATAH
        ADDCR        K_TEMPH
        SNZB         FLAGS,C
        JP          __KEY_NO_CHK_LONG
        ;JP          _KEY_MOVE            ;C爲0,舊值小於新值
_KEY_DOWN:                                ;C爲1,舊值大於等於新值
        TESTZ        K_TEMPH
        LDIA        0FFH
        SNZB         FLAGS,Z
        LD          K_TEMPL,A                ;如果高位不爲0則賦低位FFH,以方便只用低位判斷
    
        CALL        GET_KEY_DOWN_DAT
        SUBA        K_TEMPL
        SNZB        FLAGS,C                ;差值大於靈敏度表格表示有按鍵
        JP          __KEY_NO_CHK_LONG
        ;JP          _KEY_MOVE
        
        INCR        CD_COUNT            ;判斷幾次舊值,1表示新值只比K0DAT1L跟K0DAT1H小
        LDIA        2;C_KSAVE            ;2表示比K0DAT1L、K0DAT1H,及K0DAT2L,K0DAT2H小
        SUBA        CD_COUNT
        SNZB        FLAGS,C
        JP          _KEY_SUB_LOOP
        

        CALL        GET_CMDAT_ADD
        INCR        MP                    ;MP=K0DAT01H
        INCR        MP                    ;MP=K0DAT2L
        LD          A,IAR
        INCR        MP                    ;MP=K0DAT3L
        LD          IAR,A
        INCR        MP                    ;MP=K0DAT23H
        LDIA        0FH
        ANDR        IAR
        SWAPA        IAR
        ORR         IAR
_KEY_HAVE:                                ;確認有按鍵
__KEY_HAVE_WATER:
        INCA        KCOUNT
        CALL        GET_KEY_DAT
        SUBA        KEYF
        SZB         FLAGS,Z
        JP          _KEY_NEXT
        LD          A,K_TEMPL
        SUBA        KSUB
        SZB         FLAGS,C
        JP          _KEY_NEXT
        INCA        KCOUNT
        LD           KDATA,A                ;KDATA表示相應的臨時按鍵標誌位
        LD          A,K_TEMPL
        LD          KSUB,A
        JP          _KEY_NEXT
;********************************************
__KEY_NO_CHK_LONG:                        ;判斷保存的舊值(慢按鍵)
        CALL        GET_CMDAT_ADD
        LDIA        .3
        ADDR        MP                    ;MP=K0DAT3L
        LD          A,IAR
        LD          K_TEMPL,A
        
        LDIA        .1
        ADDR        MP                    ;MP=K0DAT23H
        SWAPA        IAR
        ANDIA        0FH
        LD          K_TEMPH,A
        
        SETB        FLAGS,C                ;補碼加1
        LD          A,DATAL
        ADDCR        K_TEMPL
        LD          A,DATAH
        ADDCR        K_TEMPH
        SNZB         FLAGS,C
        JP          _KEY_OLD_CHK            ;C爲0,舊值小於新值

        TESTZ        K_TEMPH
        LDIA        0FFH
        SNZB         FLAGS,Z
        LD          K_TEMPL,A                ;如果高位不爲0則賦低位FFH,以方便只用低位判斷
        
        CALL        GET_KEY_DOWN_DAT
        SUBA        K_TEMPL
        SNZB        FLAGS,C                ;差值大於靈敏度表格表示有按鍵
        JP          _KEY_OLD_CHK
        JP          _KEY_HAVE
;---------------------------------------
__KEY_HAVE_CHECK:                            ;檢測的按鍵已經按下,判斷按鍵放開
        CALL        GET_CMDAT_ADD
        LDIA        .3
        ADDR        MP                    ;MP=K0DAT3L
        LD          A,IAR
        LD          K_TEMPL,A
        INCR        MP                    ;MP=K0DAT23H
        SWAPA        IAR
        ANDIA        0FH
        LD          K_TEMPH,A
;K0DAT3L,K0DAT3H還保存舊值,判斷是否比舊值小於靈敏度值
_HAVE__KEY_SUB:                            ;16位減法程序,用新值加上舊值的補碼
        SETB        FLAGS,C                ;補碼加1
        LD          A,DATAL
        ADDCR        K_TEMPL
        LD          A,DATAH
        ADDCR        K_TEMPH
        SNZB         FLAGS,C
        JP          _HAVE_KEY_OPEN        ;C爲0,舊值小於新值,按鍵放開
_HAVE__KEY_DOWN:                            ;C爲1,舊值大於等於新值
        TESTZ        K_TEMPH
        LDIA        0FFH
        SNZB         FLAGS,Z
        LD          K_TEMPL,A                ;如果高位不爲0則賦低位FFH,以方便只用低位判斷
        
        CALL        GET_KEY_DOWN_DAT

        HSUBIA      02H
        SUBA        K_TEMPL
        SZB         FLAGS,C                ;差值大於靈敏度表格表示有按鍵
        JP          _HAVE_KEY_RISE        ;差值大於靈敏度時,按鍵繼續有效,判斷上升沿
_HAVE_KEY_OPEN:                            ;按鍵比舊值小的值小於靈敏度,按鍵放開
        CLR         KEYF
        CALL        GET_CMDAT_ADD
        DECR        MP                    ;MP=K0DAT0L
        LDIA        .6
        LD          CD_COUNT,A
_CLR_KOLD_LOOP:
        CLR         IAR
        INCR        MP
        SZDECR        CD_COUNT
        JP          _CLR_KOLD_LOOP
        JP          _KEY_NEXT
        
_HAVE_KEY_RISE:                            ;確檢測上升沿

        CALL        GET_CMDAT_ADD

        LD          A,IAR
        LD          K_TEMPL,A
        INCR        MP
        SWAPA        IAR
        ANDIA        0FH
        LD          K_TEMPH,A
        
        SETB        FLAGS,C                ;補碼加1
        LD          A,DATAL
        ADDCR        K_TEMPL
        LD          A,DATAH
        ADDCR        K_TEMPH
        SZB         FLAGS,C
        JP          _HAVE_KEY_CONTINUE    ;C爲0,舊值小於新值,判斷按鍵放開
__HAVE_KEY_RISE_CHK:                        ;C爲1,舊值大於等於新值,按鍵繼續有效
        COMR        K_TEMPH
        COMR        K_TEMPL
        
        TESTZ        K_TEMPH
        LDIA        0FFH
        SNZB         FLAGS,Z
        LD          K_TEMPL,A
        
        CALL        GET_KEY_DOWN_DAT
        HSUBIA      02H    
        SUBA        K_TEMPL
        SZB         FLAGS,C
        JP          _HAVE_KEY_OPEN
_HAVE_KEY_CONTINUE:                        ;按鍵繼續有效

_HAVE_KEY_CONT_1:
        LDIA        .2                    ;K0DAT3L、K0DAT3H不做處理,其它依次移位
        LD          CD_COUNT,A
        CALL        GET_CMDAT_ADD
        JP          __KEY_MOVE_KHAVE
;---------------------------------------
;連續4次值相差不超過1,則保存至K0DAT3L和K0DAT3H
_KEY_OLD_CHK:
        CLR         CD_COUNT                ;表示取幾次舊值減去當前值        
__KEY_NO_CHK_LOOP:                
        CALL        GET_CMDAT_ADD
        LD          A,IAR
        LD          K_TEMPL,A
        INCR        MP                ;MP=K0DAT01H
        SWAPA        IAR
        ANDIA        0FH
        LD          K_TEMPH,A
        CALL        _CHK_DATA_SAME
        LD          K_TEMP,A
        SNZB         K_TEMP,0
        JP          _KEY_MOVE
        INCR        MP                ;MP=K0DAT2L
        LD          A,IAR
        LD          K_TEMPL,A
        INCR        MP                ;MP=K0DAT3L
        INCR        MP                ;MP=K0DAT23L
        
        LDIA        0FH
        ANDA        IAR
        LD          K_TEMPH,A
        CALL        _CHK_DATA_SAME
        LD          K_TEMP,A
        SNZB         K_TEMP,0
        JP          _KEY_MOVE
        
        LDIA        .3
        SUBR        MP                ;MP=K0DAT01H
        LDIA        0FH
        ANDA        IAR
        LD          K_TEMPH,A
        LDIA        .2
        SUBR        MP                ;MP=K0DAT0L
        LD          A,IAR
        LD          K_TEMPL,A
        
        CALL        _CHK_DATA_SAME
        LD          K_TEMP,A
        SNZB         K_TEMP,0
        JP          _KEY_MOVE
        
        LDIA        .4
        ADDR        MP                ;MP=K0DAT3L
        COMA        DATAL
        
        LD          IAR,A

        INCR        MP                ;MP=K0DAT23H
        COMA        DATAH

        LD          IAR,A
        SWAPR        IAR

        CALL        GET_CMDAT_ADD
        JP          __KEY_MOVE_KHAVE
        
_CHK_DATA_SAME:
        SETB        FLAGS,C                ;補碼加1
        LD          A,DATAL
        ADDCR        K_TEMPL
        LD          A,DATAH
        ADDCR        K_TEMPH
        SNZB         FLAGS,C
        JP          __CHK_DATA_SAME_1            ;C爲0,舊值小於新值    
        TESTZ        K_TEMPH
        SNZB         FLAGS,Z
        RET         .0            ;如果高位不爲0則賦低位FFH,以方便只用低位判斷    
        LDIA         .2
        SUBA        K_TEMPL
        SZB         FLAGS,C                ;差值大於靈敏度表格表示有按鍵
        RET         .0
        RET         .1
__CHK_DATA_SAME_1:
        LDIA        .1
        ADDR        K_TEMPL
        SNZB         FLAGS,C
        RET         .0    
        LDIA        .1
        ADDR        K_TEMPH
        SNZB        FLAGS,C
        RET         .0
        RET         .1
;---------------------------------------------------
_KEY_MOVE:                                ;沒有按鍵,按鍵舊值依次保存
        CALL        GET_CMDAT_ADD
        JP          __KEY_MOVE_KHAVE
__KEY_MOVE_KHAVE:                        ;一直有按鍵的時候移位,最舊的值不變,其它移位
        LD          A,IAR
        INCR        MP                    ;MP=K0DAT01H
        INCR        MP                    ;MP=K0DAT2L
        LD          IAR,A
        
        DECR        MP                    ;MP=K0DAT01H
        SWAPA        IAR
        ANDIA        0FH
        LD          K_TEMP,A
        
        LDIA        .3
        ADDR        MP                    ;MP=K0DAT23H
        LDIA        0F0H
        ANDR        IAR
        LD          A,K_TEMP
        ORR         IAR
        
        LDIA        .5
        SUBR        MP                    ;MP=K0DAT0L
        LD          A,IAR
        INCR        MP                    ;MP=K0DAT1L
        LD          IAR,A                
        
        INCR        MP                    ;MP=K0DAT01H
        SWAPR        IAR                    ;K0DAT0H放入K0DAT1H
        LDIA        0F0H
        ANDR        IAR
        
        COMA        DATAH
        ANDIA        0FH
        ORR         IAR
        
        LDIA        .2
        SUBR        MP                    ;MP=K0DAT0L
        COMA        DATAL
        LD          IAR,A
_KEY_NEXT:
        INCR        KCOUNT
        LDIA        C_KCOUNT        ;按鍵個數
        SUBA        KCOUNT
        SNZB        FLAGS,C
        JP          _KEY_LOOP
        CALL        _CLR_KEY_SUM_RAM
        JP          _K_MAINK
;--------------------------------------------——
;**********************************************        
_CLR_NO_KEY_DAT:
        CLR         KCOUNT
__CLR_NO_KEY_DAT_LOOP:
        
        INCA        KCOUNT
        CALL        GET_KEY_DAT
        SUBA        KEYF
        SZB         FLAGS,Z
        JP          __CLR_NO_KEY_DAT_NEXT
        CALL        GET_CMDAT_ADD
        CLR         IAR
        DECR        MP                ;MP=K0DAT0L
        CLR         IAR
        INCR        MP                ;MP=K0DAT1L
        INCR        MP                ;MP=K0DAT01H
        CLR         IAR
        INCR        MP                ;MP=K0DAT2L
        CLR         IAR
        INCR        MP                ;MP=K0DAT3L
        CLR         IAR
        INCR        MP                ;MP=K0DAT23H
        CLR         IAR
__CLR_NO_KEY_DAT_NEXT:
        INCR        KCOUNT
        LDIA        C_KCOUNT        ;按鍵個數
        SUBA        KCOUNT
        SNZB        FLAGS,C
        JP          __CLR_NO_KEY_DAT_LOOP
        CLR         KCOUNT
        RET
;**************************************************        
TABLE_KEY_ADJ:
        DW         C_KEY1_ADJ
        DW         C_KEY2_ADJ
        DW         C_KEY3_ADJ
        DW         C_KEY4_ADJ
        DW         C_KEY5_ADJ
        DW         C_KEY6_ADJ
        DW         C_KEY7_ADJ
        DW         C_KEY8_ADJ
;-------------------------------------    
;*************************************    
TABLE_DOWN:
        DW            C_KEY1_LMD
        DW            C_KEY2_LMD 
        DW            C_KEY3_LMD
        DW            C_KEY4_LMD
        DW            C_KEY5_LMD
        DW            C_KEY6_LMD
        DW            C_KEY7_LMD
        DW            C_KEY8_LMD             
;***************************************
TABLE_KEY_CH:                
        DW           C_KEY1_CH  
        DW           C_KEY2_CH  
        DW           C_KEY3_CH  
        DW           C_KEY4_CH  
        DW           C_KEY5_CH  
        DW           C_KEY6_CH  
        DW           C_KEY7_CH  
        DW           C_KEY8_CH  
;------------------------------------------
TABLE_KEY_DAT:                ;按鍵舊值表格
        DW           K0DAT1L
        DW           K1DAT1L
        DW           K2DAT1L
        DW           K3DAT1L
        DW           K4DAT1L
        DW           K5DAT1L
        DW           K6DAT1L
        DW           K7DAT1L
;------------------------------------------
TABLE_KEY_SUM_ADD:            ;按鍵求和保存值表格
        DW           DATA0L
        DW           DATA1L
        DW           DATA2L
        DW           DATA3L
        DW           DATA4L
        DW           DATA5L
        DW           DATA6L
        DW           DATA7L
;------------------------------------------        
;------------------------------------------
TABLE_KEY_YX_DATA:
        DW            000H
        DW            001H
        DW             002H
        DW             004H
        DW             008H
        DW             010H
        DW             020H
        DW             040H
        DW             080H
;**********************************************
_CLR_KEY_SUM_RAM:
        BANKSEL_BANK1
        CLR         DATA0L
        CLR         DATA0H
        CLR         DATA1L
        CLR         DATA1H
        CLR         DATA2L
        CLR         DATA2H
        CLR         DATA3L
        CLR         DATA3H
        CLR         DATA4L
        CLR         DATA4H
        CLR         DATA5L
        CLR         DATA5H
        CLR         DATA6L
        CLR         DATA6H
        CLR         DATA7L
        CLR         DATA7H
        CLR            CD_COUNT
        RET
;------------------------------------------
;根據ACC,獲得舊值,入口MP=K0DAT1L
;出口K_TEMPL、K_TEMPH存放舊值低位、高4位
;ACC=0,MP=K0DAT1L,+0
;ACC=1,MP=K0DAT2L,+2
;ACC=2,MP=K0DAT3L,+3
_GET_KEY_OLD:
        LD          K_TEMP,A
        TESTZ        K_TEMP
        SNZB         FLAGS,Z
        INCA        K_TEMP
        ADDR        MP
        
        LD          A,IAR
        LD          K_TEMPL,A                ;低位放入K_TEMPL
        
        LDIA        .1
        SZB         K_TEMP,0
        LDIA        .2
        ADDR        MP                    ;MP=K0DAT1H
        
        LD          A,IAR
        SNZB         K_TEMP,0                ;=1表示K0DAT2H,不用高低交換
        SWAPA        IAR                    ;K0DAT1H保存在高4位
        ANDIA        0FH
        LD          K_TEMPH,A                ;高位放入K_TEMPH
        RET
;********************************************
;------------------------------------------
GET_SUM_ADD:
        LDIA        TABLE_KEY_SUM_ADD$H            ;將"TABLE_SEG"所表示地址的高位賦給"TABLE_SPH"
        LD          TABLE_SPH,A
        LDIA        TABLE_KEY_SUM_ADD$L            ;將"TABLE_SEG"所表示地址的低位賦給"TABLE_SPL"    
        ADDA        KCOUNT    
        LD          TABLE_SPL,A
        SZB         FLAGS,C
        INCR        TABLE_SPH
        TABLEA        
        LD          MP,A                ;MP=DATA0L
        RET
;------------------------------------------
GET_CMDAT_ADD:
        LDIA        TABLE_KEY_DAT$H            
        LD          TABLE_SPH,A
        LDIA        TABLE_KEY_DAT$L            
         ADDA        KCOUNT    
        LD          TABLE_SPL,A
        SZB         FLAGS,C
        INCR        TABLE_SPH
        TABLEA        
        LD          MP,A                ;MP=K0DAT1L
        RET
;-------------------------------------------        
GET_KEY_DOWN_DAT:
        LDIA        TABLE_DOWN$H            
        LD          TABLE_SPH,A
        LDIA        TABLE_DOWN$L            
         ADDA        KCOUNT    
        LD          TABLE_SPL,A
        SZB         FLAGS,C
        INCR        TABLE_SPH
        TABLEA    
        RET
;-------------------------------------------
GET_KEY_DAT:
        ADDIA       TABLE_KEY_YX_DATA$L
        LD          TABLE_SPL,A
        LDIA        00H
        SZB         FLAGS,C
        LDIA        01H
        ADDIA       TABLE_KEY_YX_DATA$H
        LD          TABLE_SPH,A
        TABLEA        
        RET
;------------------------------------------        
_K_MAINK:
        TESTZ        KDATA
        SZB         FLAGS,Z
        JP          _KNO
        
        LD          A,KDATA            ;不爲0則判斷是否同一按鍵
        SUBA        KOLD
        SNZB        FLAGS,Z
        JP          _KFLASH
        
        INCR        KEYC
        LDIA        C_KEYC            ;跟上次相同則再檢測2次
        SUBA        KEYC
        SNZB        FLAGS,C
        JP          __K_MAINK_BACK
        CLR         KEYC
        
        LD          A,KDATA
        CALL        GET_KEY_DAT
        LD          KEYF,A
        SETB        B_KEY_EN
        CLR         KOLD
        CALL        _CLR_NO_KEY_DAT    ;檢測到按鍵清除沒有按鍵的按鍵保存值
        JP          __K_MAINK_BACK
_KFLASH:
        LD          A,KDATA            ;跟上次不同,保存這次的KCOUNT值到KOLD
        LD          KOLD,A
        CLR         KEYC
        JP          __K_MAINK_BACK
_KNO:
        SZR            KEYF
        JP            _KSCAN_LONG
        CLR         KEYC
        CLR         KOLD
        CLR            KLONGC
        CLRB        B_KEY_UP
        CLRB    B_KEY_LONG
        JP          __K_MAINK_BACK
_KSCAN_LONG:
        INCR        KLONGC
        LDIA        C_FRIST_TIME
        SZB            B_KEY_LONG
        LDIA        C_LONG_TIME
        SUBA        KLONGC
        SNZB        FLAGS,C
        JP            __K_MAINK_BACK
        CLR            KLONGC
        SETB        B_KEY_LONG
        SETB        B_KEY_EN
        JP            __K_MAINK_BACK
__K_MAINK_BACK:
_KEY_BACK:
        BANKSEL_BANK0
        RET
;**********************************

;***********************************************

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章