📄 keyscan.asm
字号:
;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 + -