📄 _int_0.asm
字号:
;---------------------------------------------------------------------
;
; THIS FUNCTION PROC THE KEYBOARD INTERUPT
;
INT_0: ;HOLD ON THE ENVIRAMENT
PUSH PSW
PUSH A
PUSH B
PUSH DPH
PUSH DPL
SETB RS1
LCALL GET_KEY
LCALL KEYPROC
CLR RS1
POP DPL
POP DPH
POP B
POP A
POP PSW
RETI
;---------------------------------------------------------------------
;
; THIS FUCTION GET THE VALUE OF KEY PRESSED,AND PLACE THE FINAL
; RIGHT CODE INTO THE KEYBUF,IT NEVER RETURNS UNTIL THE KEY CODE
; IS STABLE.THIS FUCTION MUST GET A KEY CODE,AND THE CODE MUST
; ~~~~ ~~~
; BE A CORECT CODE,ELSE IT DOESN'T RETURN.
; ~~~~~~
; TO GET THE CORECT KEY ,YOU MUST DELAY FOR THE KEY CODE TO BE STABLE
; BUT YOU SHOULD DELAY NOT TOO LONG ,ELSE,YOU MAY ALWAYS GET KEY "OK"
; FOR EXAMPLE,YOU DELAY 65 MS,AND THEN TO READ THE KEY ,BUT THIS TIME
; YOU MAYBE HAVE FREE THE KEY,AND THE PROGRAM STILL READ A KEY VALUE,SO
; IT IS A WRONG VALUE ,SO YOU SEE,YOU MUST CHOOSE THE CORECT DELAY TIME
;
PROC GET_KEY
GET_KEY:LCALL DELAY_20MS ;延时20毫秒
MOV A,P1
CPL A
ANL A,#07H
MOV KEYBUF,A
NOT_RELEASE:
LCALL DELAY_20MS ;延时20毫秒
MOV A,P1
CPL A
ANL A,#07H
CLR C
SUBB A,KEYBUF
JZ NOT_RELEASE
RET
END
;---------------------------------------------------------------------
PROC DELAY_20MS
DELAY_20MS:
MOV R3,#80D
BB: MOV R2,#250D
AA: DJNZ R2,AA
DJNZ R3,BB
RET
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROC KEYPROC
KEYPROC:MOV R2,KEYBUF
;===========按下上翻页键================
CJNE R2,#KEY_PG_UP,MN_PDN
MOV A,NMM_FLGB
JNZ NO_PGUP
LCALL FN_PG_UP
LCALL LCDCLR
LCALL LCDCLRR
LCALL DRAWMENU
NO_PGUP:RET
;=========按下下翻页键=================
MN_PDN: CJNE R2,#KEY_PG_DN,MN_IUP
MOV A,NMM_FLGB
JNZ NO_PGDN
LCALL FN_PG_DN
LCALL LCDCLR
LCALL LCDCLRR
LCALL DRAWMENU
NO_PGDN:RET
;=========按下上一项键===================
MN_IUP: CJNE R2,#KEY_ITEM_UP,MN_IDN
MOV A,NMM_FLGB
JZ ITEM_UP ;是置数状态么
MOV R0,#NUMBUF
INC @R0
CJNE @R0,#0AH,FRESH11
SJMP FRESH12
FRESH11:JC FRESH13 ;LESS THAN 0AH
FRESH12:MOV @R0,#00H ;EQUAL OR MORE THAN 0AH
FRESH13:LCALL UPDATE_NUM
RET
ITEM_UP:LCALL FN_ITEM_UP
LCALL LCDCLR
LCALL LCDCLRR
LCALL DRAWMENU
RET
;========按下下一项键===========
MN_IDN: CJNE R2,#KEY_ITEM_DN,MN_OK;
MOV A,NMM_FLGB
JZ ITEM_DN ;是置数状态么
MOV R0,#NUMBUF
DEC @R0
CJNE @R0,#08H,FRESH21
SJMP FRESH23
FRESH21:JC FRESH23
MOV @R0,#09H
FRESH23:LCALL UPDATE_NUM
RET
ITEM_DN:LCALL FN_ITEM_DN
LCALL LCDCLR
LCALL LCDCLRR
LCALL DRAWMENU
RET
;=========按下OK键==================
MN_OK: CJNE R2,#KEY_OK,MN_ERR
MOV A,NMM_FLGB ;置数模式BYTE
_NMM10: JNB ACC.0,_NMM11 ;置数模式0
LCALL NUM_IN_TEST
RET
_NMM11: JNB ACC.1,_NMM12 ;置数模式1
LCALL NUM_IN_TEST
RET
_NMM12: JNB ACC.2,_NMM13 ;置数模式2
LCALL NUM_IN_TEST
RET
_NMM13: JNB ACC.3,_NMM14 ;置数模式3
LCALL NUM_IN_TEST
RET
_NMM14: JNB ACC.4,_NMM15 ;置数模式4
LCALL NUM_IN_TEST
RET
_NMM15: JNB ACC.5,_NMM16 ;置数模式5
LCALL NUM_IN_TEST
RET
_NMM16: JNB ACC.6,_NMM17 ;置数模式6
LCALL NUM_IN_TEST
RET
_NMM17: JNB ACC.7,UN_NMM ;置数模式7
LCALL NUM_IN_TEST
RET
UN_NMM: LCALL MENU_PROC
RET
;=========按键值错误======================
MN_ERR: RET
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROC UPDATE_NUM
UPDATE_NUM:
TO_DRAW:CLR C
MOV A,NUMBUF
ADD A,#10H ;ASCII
;RELATIVE ADDRESS IS ASCII*6
MOV B,#06D
MUL AB
MOV DPTR,#NM_CHAR_SML
CLR C ;DPTR ADD RELATIVE
ADD A,DPL
MOV DPL,A
MOV A,DPH
ADDC A,B
MOV DPH,A
;NOW DPTR KEEP THE CORECT ADDRESS
;OF POINT MATRICS FOR DISPLAY
MOV R6,#NUM_LINE
MOV R7,#NUM_TAIL_COL
; DPTR CHANGED,BUT NO PROBLEM
LCALL DIS_8_6
RET
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; 在置数状态时,按下OK键,则进入相应的置数处理函数,处理函数中必须判断出是哪种置数,
; 如置入日期等并据此取出公共的计数器NUM_NUMBER与ROM中存放的每种置数应该置入的数的位数比较,
; 确定置数已满否,以便决定是否本次置数完成。若未完成,本置数状态标志不改变,把本次的输入
; 存入临时缓冲区并刷新显示新的数置(注意:每次置完数都需要让NUM_NUMBER加上1);否则把本次的
; 输入与临时缓冲区的数据合并成为正确的数据,
; 并存入真正的被置数单元。最后置数状态标志清零,NUM_NUMBER清零,退出置数状态和界面,画出
; 原菜单。
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NUM_LINE EQU 03
NUM_TAIL_COL EQU 54
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROC NUM_IN_TEST
NUM_IN_TEST:
;现在在置数模式0里面并且OK键已被按下
;表示有一个数据输入了,那么就要让
;本次的置数存入临时缓冲区末尾
;输入数据的位数计数器加1
MOV DPTR,#NUMSTRBUF_L
MOV A,NUMBUF
MOVX @DPTR,A
MOV R0,#NUM_NUMBER
INC @R0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;与本置数模式应该输入的数据的位数比较
CJNE @R0,#NMM10_NUM,TMP_STO
STORE: ;置数完成
;把临时缓冲区的数据合并成为正确的数据
;存入真正的被置数单元
CLR NMM_FLGB.0 ;退出置数状态和界面
LCALL LCDCLR ;画出原菜单。
LCALL LCDCLRR
LCALL DRAWMENU
RET
TMP_STO:;数串缓冲区全部左移一位
MOV DPTR,#NUMSTRBUF_H
MOV R2,#08H
LCALL RAMSTR_RL
;在末尾置零初始值
MOV DPTR,#NUMSTRBUF_L
CLR A
MOVX @DPTR,A
MOV NUMBUF,A
;显示出此数字串
MOV DPTR,#NUMSTRBUF_L
MOV R6,#NUM_LINE
MOV R7,#NUM_TAIL_COL
MOV R2,NUM_NUMBER
INC R2
LCALL DRAW_NUMSTR
RET
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROC RAMSTR_RL
RAMSTR_RL:
INC DPTR
MOVX A,@DPTR
ACALL DEC_DPTR
MOVX @DPTR,A
INC DPTR
DJNZ R2,RAMSTR_RL
RET
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROC DRAW_NUMSTR
DRAW_NUMSTR:
PUSH DPH
PUSH DPL
MOVX A,@DPTR
ADD A,#10H ;ASCII
MOV B,#06D ;RELATIVE ADDRESS IS ASCII*6
MUL AB
MOV DPTR,#IT_CHAR_SML
CLR C ;DPTR ADD RELATIVE
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
;NOW DPTR KEEP THE CORECT ADDRESS
;OF POINT MATRICS FOR DISPLAY
LCALL DIS_8_6; DPTR CHANGED
POP DPL
POP DPH
LCALL DEC_DPTR
NOP
MOV A,R7
NOP
CLR C
SUBB A,#06H
MOV R7,A
DJNZ R2,DRAW_NUMSTR
RET
END
;---------------------------------------------------------------------
PROC DEC_DPTR
DEC_DPTR:
PUSH A
CLR C
MOV A,DPL
SUBB A,#01H
MOV DPL,A
MOV A,DPH
SUBB A,#00H
MOV DPH,A
POP A
RET
END
;---------------------------------------------------------------------
;
; TISH FILE INCLUDE FOUR FUNCTION DECLARATIONS AND ITS CODES
; FN_PG_UP FN_PG_DN FN_ITEM_UP FN_ITEM_DN
INCLUDE "_MENUSEL.ASM"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -