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

📄 keyscan.asm

📁 给香港公司做的出口欧洲的电子称项目全部源代码 CPU:KS57C2308 RANGE:(0 -150KG)/d = 0.1kg
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;PRJ: FAT_SCALE
;MODULE:   KEYSCAN                     ;
;FUNCTION: SCAN KEY                    ;
;**************************************;
KEY_DLY_CON:     EQU   (256-15)        ; DEBOUNCE CONSTANT
KEY_DLY_CON1:    EQU   (256-50)        ; KEY SPEED UP INTERVAL
KEY_DLY_CON2:    EQU   (256-70)        ; KEY SPEED UP INTERVAL
CAL_KEY_CON:     EQU   00011110B       ; CAL  KEY VALUE
UP_KEY_CON:      EQU   00011101B       ; UP   KEY VALUE
DN_KEY_CON:      EQU   00010111B       ; DN   KEY VALUE
SET_KEY_CON:     EQU   00011011B       ; SET  KEY VALUE
USER_KEY_CON:    EQU   00100111B       ; USER KEY VALUE
KEY_RELEASE_CON: EQU   00001111B       ;
KB_STATE_CON:    EQU   7               ;
;**************************************;
;INPUT: [KB_STATE]                     ;
;OUTPUT:[KEY_PRESSED]                  ;
;       [KEY_VALUE]                    ;
;***************************************************************************;
;                                  KEY SCAN                                 ;
;***************************************************************************;
          ORG    150H                  ;
        JPS      KB_CASE0              ;---\
        JPS      KB_CASE1              ;   |
        JPS      KB_CASE2              ;   |
        JPS      KB_CASE3              ;   | USE FOR NORMAL KEYSCAN
        JPS      KB_CASE4              ;---/
        JPS      KB_CASE5              ;---\
        JPS      KB_CASE6              ;---/ USE FOR UP/DN SPEEDY UP!
KEYSCAN:BTST     KEYSCAN_EN            ;
        RET                            ;
;---------------------                 ;
        LD       L,#KB_STATE_CON       ;
        LD       A,KB_STATE            ;
        CALL     CHK_STATE             ; CHECK KB STATE
;---------------------                 ;
        LD       WX,#50H               ;
        LD       A,KB_STATE            ;
        LD       E,#0                  ;
        ADS      EA,EA                 ;
        ADS      EA,WX                 ;
        JR       @EA                   ;
;**************************************;

;**************************************;
;KB_CASE0: READ KEYBOARD               ;
KB_CASE0:                              ;
        BITR     KEY_PRESSED           ; KEY_PRESSED = 0
        CALL     READ_ROW_LINE         ; OUTPUT [A] IS ROW VALUE
        CPSE     A,#1111B              ; A = #1111B ?
        JPS      KB_CASE0_1            ; NO.
        RET                            ; YES.
KB_CASE0_1:                            ;
        CPSE     A,#0111B              ;
        JPS      KB_CASE0_2            ;
        JPS      KB_CASE0_5            ; MAY BE KEY PRESSED.
KB_CASE0_2:                            ;
        CPSE     A,#1011B              ;
        JPS      KB_CASE0_3            ;
        JPS      KB_CASE0_5            ; MAY BE KEY PRESSED.
KB_CASE0_3:                            ;
        CPSE     A,#1101B              ;
        JPS      KB_CASE0_4            ;
        JPS      KB_CASE0_5            ; MAY BE KEY PRESSED.
KB_CASE0_4:                            ;
        CPSE     A, #1110B             ;
        RET                            ; NO. TWO KEY PRSSED TOGETHER ...
KB_CASE0_5:                            ;
        CALL     READ_KB               ; OUTPUT IS EA,IF NO KEY PRESSED, E = 0 .
        LD       KB_BUF,EA             ; SAVE KEY VALUE TO KB_BUF.
        CPSE     E,#00                 ; E = 0 ?
        JPS      KB_CASE0_6            ; NO.
        RET                            ; YES. NO KEY PRESSED.
KB_CASE0_6:                            ;
        INCS     KB_STATE              ; MAY BE A KEY PRESSED
        LD       EA,#KEY_DLY_CON       ; SET DELAY TIME FOR DEBUNCE
        LD       KB_DLY,EA             ;
        RET                            ;
;**************************************;

;**************************************;
;KB_CASE1: DELAY 30MS FOR DEBOUNCE     ;
;KB_DLY - = 1                          ;
KB_CASE1:                              ;
        INCS     KB_DLY+0              ;
        RET                            ;
        INCS     KB_DLY+1              ;
        RET                            ;
        INCS     KB_STATE              ;
        RET                            ;
;**************************************;

;**************************************;
;KB_CASE2: READ KEYS,THE SAME KEY IS STILL DOWN ?
KB_CASE2:                              ;
        CALL     READ_KB               ; READ KEYBOARD, GET KEY VALUE (EA)
        LD       WX,EA                 ; SAVE TO WX
        LD       EA,KB_BUF             ; KEY VALUE IS SAME WITH KB_BUF ?
        CPSE     EA,WX                 ;
        JPS      KB_CASE2_1            ; NO.
        BITS     KEY_PRESSED           ; YES. PRESSED KEY IS EFFECT !
        LD       KEY_VALUE,EA          ;      SAVE THE KB_VALUE
        INCS     KB_STATE              ;      KB_STATE + +
        LD       EA,#(256-128)         ;
        LD       KEY_HOLD_CNT,EA       ;
        RET                            ;
KB_CASE2_1:                            ;
        LD       A,#0H                 ; NO KEY PRESSED, RETURN TO CASE0.
        LD       KB_STATE,A            ;
        RET                            ;
;**************************************;

;**************************************;
;KB_CASE3: READ KEYS AGAIN, KEY IS UP ?;
KB_CASE3:                              ;
        CALL     READ_ROW_LINE         ; OUTPUT IS ROW_VALUE (Hang VALUE)
        CPSE     A,#KEY_RELEASE_CON    ; KEY IS RELEASE ?
        JPS      KB_CASE3_1            ; NO.  KEY IS STILL PRESSED.
        LD       EA,#KEY_DLY_CON       ; YES. DELAY FOR DEBOUNCE
        LD       KB_DLY,EA             ;
        INCS     KB_STATE              ;
        RET                            ;
KB_CASE3_1:                            ;
        CALL     READ_KB               ; READ KEYBOARD,GET KEY VALUE (EA)
        LD       WX,#UP_KEY_CON        ; KEY IS "UP" KEY ?
        CPSE     EA,WX                 ;
        JPS      KB_CASE3_2            ; NO.
        JPS      KB_CASE3_5            ; YES.
KB_CASE3_2:                            ;
        LD       WX,#DN_KEY_CON        ; KEY IS "DOWN" KEY ?
        CPSE     EA,WX                 ;
        JPS      KB_CASE3_3            ;
        JPS      KB_CASE3_5            ; YES.
KB_CASE3_3:                            ;
        LD       WX,#USER_KEY_CON      ; KEY IS "USER" KEY ?
        CPSE     EA,WX                 ;
        RET                            ;
KB_CASE3_5:                            ;
        INCS     KEY_HOLD_CNT+0        ; UP/DN KEY STILL PRESSED
        RET                            ;
        INCS     KEY_HOLD_CNT+1        ; FULL ?
        RET                            ; NO.
        LD       A,#05H                ; YES. KEY BEGIN TO SPEED UP.
        LD       KB_STATE,A            ;
        RET                            ;
;**************************************;

;**************************************;
;KB_CASE4: KEY UP DEBOUNCE DELAY 40MS  ;
KB_CASE4:                              ;
        INCS     KB_DLY+0              ;
        RET                            ;
        INCS     KB_DLY+1              ; KB_DLY -- , DELAY 40MS FOR DELAY
        RET                            ;
KB_CASE4_1                             ;
        LD       A,#0H                 ;
        LD       KB_STATE,A            ; KB_STATE RESTORE TO 0
        RET                            ;
;**************************************;

;**************************************;
;KB_CASE5: UP/DN KEY BEGIN TO SPEED UP ;
KB_CASE5:                              ;
        CALL     READ_ROW_LINE         ; OUTPUT IS ROW_VALUE
        CPSE     A,#KEY_RELEASE_CON    ; KEY IS RELEASE ?
        JPS      KB_CASE5_1            ; NO.
KB_CASE5_0:                            ;
        LD       EA,#KEY_DLY_CON       ; YES. SET DELAY TIME FOR DEBUNCE
        LD       KB_DLY,EA             ;
        LD       A,#04H                ;
        LD       KB_STATE,A            ;
        RET                            ;
KB_CASE5_1:                            ;
        CALL     READ_KB               ; READ KEYBOARD,GET KEY VALUE (EA)
        LD       WX,#USER_KEY_CON      ; KEY IS "USER" KEY ?
        CPSE     EA,WX                 ;
        JPS      KB_CASE5_2            ; NO.
        LD       EA,#KEY_DLY_CON2      ; YES.
        LD       KB_DLY,EA             ;
        JPS      KB_CASE5_21           ;
KB_CASE5_2:                            ;
        LD       WX,EA                 ; SAVE EA TO WX
        LD       EA,KB_BUF             ; KEY IS SAME KEY WITH LAST KEY ?
        CPSE     EA,WX                 ;
        JPS      KB_CASE5_0            ; NO.
        LD       EA,#KEY_DLY_CON1      ;
        LD       KB_DLY,EA             ;
KB_CASE5_21
        INCS     KB_STATE              ; YES. KB_STATE++
        BITS     KEY_PRESSED           ;
        LD       EA,KB_BUF             ;
        LD       KEY_VALUE,EA          ;
        RET                            ;
;**************************************;

;**************************************;
;KB_CASE6: DELAY 30MS FOR DEBOUNCE     ;
;KB_DLY - = 1                          ;
KB_CASE6:                              ;
        INCS     KB_DLY+0              ;
        RET                            ;
        INCS     KB_DLY+1              ;
        RET                            ;
        LD       A,#05H                ;
        LD       KB_STATE,A            ; GO BACK LAST STATE !
        RET                            ;
;**************************************;

;**************************************;
INIT_KB:                               ;
        BITS     KEYSCAN_EN            ;
        BITR     KEY_PRESSED           ;
        LD       A,#0                  ;
        LD       KB_STATE,A            ;
        CALL     SET_KEYCOL            ; MAKE Lie LINE " LOW ".
        RET                            ;
;**************************************;

;**************************************;
;READ HANG LINE                        ;
;OUTPUT IS ROW VALUE (A)               ;
READ_ROW_LINE:                         ;
        BITR     EMB                   ;
        LD       A,P7                  ;
        RET                            ;
;**************************************;

;**************************************;
; 1, NO KEY PRESSED STATE: COL0 =0, COL1= 0.
; 2, IF FOUND ROW ELECTROLIC LEVEL CHANGED (SOME KEY PRESSED),THEN GO ON NEXT STEP.
; 3, CPU OUTPUT COL0 = 1, COL1 = 0 TO FIND THE LOCATION OF PRESSED KEY.
; 4, IF FOUND ROW ELETROLIC LEVEL CHANGED, PRESSED KEY MUST BE IN COL0.
; 5, CPU OUTPUT COL0 = 0, COL1 = 1 TO FIND THE LOCATION OF PRESSED KEY.
; 6, IF FOUND ROW  ELETROLIC LEVEL CHANGE, PRESSED KEY MUST BE IN COL1.
;--------------------------------------;
; OUTPUT: EA ( KEY_VALUE )             ;
READ_KB:                               ;
        BITR     EMB                   ;
        LD       A,P7                  ; READ ROW LINE
        LD       L,A                   ;
;------------------------              ;
        LD       A,#0001B              ; CPU OUTPUT "01" TO COL (Lie) LINE
        CALL     SET_KEYCOL            ;
        CALL     READ_ROW_LINE         ;
        CPSE     A,#1111B              ;     A = 1111B ?
        JPS      RD_KB_1               ;     NO.
        LD       A,#0001B              ;     YES. PRESSED_KEY IN FIRST COL
        JPS      RD_KB_3               ;
;-----------------------               ;
RD_KB_1:LD       A,#0010B              ; CPU OUTPUT "10" TO COL (Lie) LIE
        CALL     SET_KEYCOL            ;
        CALL     READ_ROW_LINE         ;
        CPSE     A,#1111B              ;     A = 1111 ?
        JPS      RD_KB_2               ;     NO.
        LD       A,#0010B              ;     YES. PRESSED_KEY IN SECOND COL
        JPS      RD_KB_3               ;
;------------------------              ;
RD_KB_2:LD       A,#0000B              ; IF NO KEY PRESSED,E <= 0 .
RD_KB_3:LD       E,A                   ;
        LD       A,L                   ;
        BITR     KEY_COL0              ; MAKE COL (lie) LINE "LOW"
        BITR     KEY_COL1              ;      ROW (hang)
        RET                            ;
;**************************************;

;**************************************;
;CPU OUTPUT SIGNAL TO COL(Lie) LINE    ;
;INPUT: ACC                            ;
SET_KEYCOL:                            ;
        BITR     EMB                   ;
        RRC      A                     ;
        LDB      KEY_COL0,C            ;
        RRC      A                     ;
        LDB      KEY_COL1,C            ;
        RET                            ;
;**************************************;

;***************************************************************************;
;                              KEY_PROCESS                                  ;
;***************************************************************************;
; FUNCTION: KEY PRESSED,PROCESSED IT   ;
; INPUT: KEY PRESSED,KEY               ;
KEY_PROCESS:                           ;
        BTST     KEY_PRESSED           ; KEY_PRESSED ?
        RET                            ;
        BITR     KEY_PRESSED           ; YES.
        LD       EA,KEY_VALUE          ;
        LD       WX,#CAL_KEY_CON       ;
        CPSE     EA,WX                 ;
        JPS      KP_1                  ;
        JPS      PROCESS_CAL           ; CAL
KP_1:   LD       WX,#UP_KEY_CON        ;
        CPSE     EA,WX                 ;
        JPS      KP_2                  ;
        JPS      PROCESS_UP            ; UP
;---------------------                 ;
KP_2:   LD       WX,#DN_KEY_CON        ;
        CPSE     EA,WX                 ;
        JPS      KP_3                  ;
        JPS      PROCESS_DN            ; DN
;----------------------                ;
KP_3:   LD       WX,#SET_KEY_CON       ;
        CPSE     EA,WX                 ;
        JPS      KP_4                  ;
        JPS      PROCESS_SET           ; SET
;-----------------------               ;
KP_4:   LD       WX,#USER_KEY_CON      ;
        CPSE     EA,WX                 ;
        RET                            ;
        JPS      PRO_USER_SELECT       ; USER
;**************************************;

;***************************************************************************;
;                              PROCESS_CAL                                  ;
;***************************************************************************;
; FUNCTION: WHEN "CAL" KEY PRESSED,PROCESS IT.
; OUTPUT: CAL_EN,CAL_PRESSED           ;
PROCESS_CAL:                           ;
        LD       A,RUN_MODE_REG        ;
        CPSE     A,#SCALE_MODE_CON     ; SYS IN SCALE MODE ?
        JPS      PRO_CAL_1             ; NO.
        BTSF     PWR_ON_NOW            ; PWR_ON_NOW ?
        RET                            ; YES. EXIT
        BITS     CAL_EN                ;
        BITR     DP2_EN                ;
        BITS     DISP_CHAR             ;
;---------------------                 ;
        CALL     INIT_USER_INFO        ;
;---------------------                 ;
        LD       A,#CAL_MODE_CON       ;
        LD       RUN_MODE_REG,A        ;
        LD       A,#0H                 ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -