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

📄 _int_0.asm

📁 lcd drive asm program
💻 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 + -