📄 lcd89527.asm
字号:
MOV X_ADD,#6
MOV Y_ADD,#16
MOV DPH,DPH_BAK
MOV DPL,DPL_BAK
LCALL OUTSHUZI
;***************************************************************
INC R0
DJNZ R3,DIS_NEXT_4
LJMP DIS_REFRESH_END
;********************************************************************
DIS_NEXT_4:
MOV X_ADD,#6 ;6
MOV Y_ADD,#77
MOV DPTR,#SHUZI_6
LCALL OUTSHUZI
MOV X_ADD,#6 ;、
MOV Y_ADD,#85
MOV DPTR,#ZIMU_DUNHAO
LCALL OUTSHUZI
MOV X_ADD,#6 ;台
MOV Y_ADD,#112
MOV DPTR,#HZ_TAI_2
LCALL OUTHZ16
MOV SHUZI,@R0
LCALL SHUZI_PRO ;计算出低位的DPTR,高位的放在DPH_BAK,和DPL_BAK中
MOV X_ADD,#6
MOV Y_ADD,#104
LCALL OUTSHUZI
MOV X_ADD,#6
MOV Y_ADD,#96
MOV DPH,DPH_BAK
MOV DPL,DPL_BAK
LCALL OUTSHUZI
AJMP DIS_REFRESH_END
DIS_REFRESH_OTHER: ;没有要显示的就显示其他的画面
LCALL DISPLAY_ALL
NOP
DIS_REFRESH_END:
RET
;*********************************************************
;计算出低位的DPTR,高位的放在DPH_BAK,和DPL_BAK中
;输入的数字已经是10进制了
;*********************************************************
SHUZI_PRO:
MOV A,SHUZI
ANL A,#0F0H
SWAP A
SHUZI_PRO_A:
CJNE A,#0,SHUZI_PRO_0
MOV DPTR,#SHUZI_0
LJMP SHUZI_PRO_NEXT
SHUZI_PRO_0:
CJNE A,#1,SHUZI_PRO_1
MOV DPTR,#SHUZI_1
LJMP SHUZI_PRO_NEXT
SHUZI_PRO_1:
CJNE A,#2,SHUZI_PRO_2
MOV DPTR,#SHUZI_2
LJMP SHUZI_PRO_NEXT
SHUZI_PRO_2:
CJNE A,#3,SHUZI_PRO_3
MOV DPTR,#SHUZI_3
LJMP SHUZI_PRO_NEXT
SHUZI_PRO_3:
CJNE A,#4,SHUZI_PRO_4
MOV DPTR,#SHUZI_4
LJMP SHUZI_PRO_NEXT
SHUZI_PRO_4:
CJNE A,#5,SHUZI_PRO_5
MOV DPTR,#SHUZI_5
LJMP SHUZI_PRO_NEXT
SHUZI_PRO_5:
CJNE A,#6,SHUZI_PRO_6
MOV DPTR,#SHUZI_6
LJMP SHUZI_PRO_NEXT
SHUZI_PRO_6:
CJNE A,#7,SHUZI_PRO_7
MOV DPTR,#SHUZI_7
LJMP SHUZI_PRO_NEXT
SHUZI_PRO_7:
CJNE A,#8,SHUZI_PRO_8
MOV DPTR,#SHUZI_8
LJMP SHUZI_PRO_NEXT
SHUZI_PRO_8:
CJNE A,#9,SHUZI_PRO_NEXT
MOV DPTR,#SHUZI_9
LJMP SHUZI_PRO_NEXT
SHUZI_PRO_NEXT:
JB F_HIGH,SHUZI_PRO_RET
SETB F_HIGH
MOV DPL_BAK,DPL
MOV DPH_BAK,DPH
MOV A,SHUZI
ANL A,#0FH
LJMP SHUZI_PRO_A
SHUZI_PRO_RET:
CLR F_HIGH
RET
;************************************************************
R_MOV:
MOV R3,PAIDUI
DEC R3
MOV A,R3
CJNE A,#0,R_MOV_2
MOV PAIDUI,#0
MOV GET_BUFF,#0
LJMP R_MOV_END
R_MOV_2:
MOV R0,#GET_BUFF
MOV R1,#GET_BUFF+1
R_MOV_0:
MOV A,@R1
MOV @R0,A
MOV @R1,#0
INC R0
INC R1
DJNZ R3,R_MOV_0
MOV R0,#TIMER_BUFF
MOV R1,#TIMER_BUFF+1
MOV R3,PAIDUI
DEC R3
R_MOV_1:
MOV A,@R1
MOV @R0,A
MOV @R1,#0
INC R0
INC R1
DJNZ R3,R_MOV_1
DEC PAIDUI ;排队的个数少了一个
R_MOV_END:
SETB F_MOVED
RET
;******************40MS中断一次监测按键***********************
; 使用了第一区
;************************************************************
TIMER0_INT:
PUSH A
PUSH PSW
CLR RS1 ; 使用了第一区
SETB RS0
NOP
MOV A,PAIDUI
CJNE A,#00,TIMER0_INT_1
NOP
NOP
AJMP TIMER0_INT_0
TIMER0_INT_1:
NOP
NOP
LCALL MOV_PRO
TIMER0_INT_0: ;2秒钟刷新一次的记时
JB F_REFRESH,TIMER0_INT_NEXT ;在刷新完之后,CLR F_REFRESH,重新开始记时
NOP
NOP
DJNZ TIMER_2S_0,TIMER0_INT_NEXT
SETB F_REFRESH
MOV TIMER_2S_0,#30 ;
TIMER0_INT_NEXT:
CLR RS1
CLR RS0
;***************中断中检测按键************************
KEY_TEST:
CLR P1.4 ;REM ON 02.07.20
; CLR P1.7 ;ADDED ON 02.7.20
MOV A,P1
ANL A,#0FH
CJNE A,#0FH,KEY_IN
MOV A,KEY_NO
ADD A,#04H
MOV KEY_NO,A
CLR P1.5 ;REM ON 02.07.20
; CLR P1.6 ;ADDED ON 02.7.20
MOV A,P1
ANL A,#0FH
CJNE A,#0FH,KEY_IN
MOV A,KEY_NO
ADD A,#04H
MOV KEY_NO,A
CLR P1.6 ;REM ON 02.07.20
; CLR P1.5 ;ADDED ON 02.7.20
MOV A,P1
ANL A,#0FH
CJNE A,#0FH,KEY_IN
MOV A,KEY_NO
ADD A,#04H
MOV KEY_NO,A
CLR P1.7 ;REM ON 02.07.20
; CLR P1.4 ;ADDED ON 02.7.20
MOV A,P1
ANL A,#0FH
CJNE A,#0FH,KEY_IN
NOP
NOP
JNB F_KEY_FOUND,NO_KEY
NOP
NOP
MOV A,KEY_LAST_TIME
CJNE A,#02H,COMPARE_TIME ;长度是否够长
COMPARE_TIME:
JC NOT_LONG_ENOUGH
SETB F_KEY_VALUE
MOV A,OLD_KEY_NO ;取出备份
LCALL LOAD_KEY ;重新分配按键的值
MOV KEY_NO,A
AJMP KEY_OUT
NO_KEY:
NOT_LONG_ENOUGH:
MOV KEY_NO,#00H ;NO KEY!
KEY_OUT:
CLR F_KEY_FOUND
MOV KEY_LAST_TIME,#00H
MOV OLD_KEY_NO,#00H
NOP
NOP
LJMP KEY_TEST_RETI
KEY_IN:
MOV R3,#00H
SWAP A ;REM ON 02.7.20
KEY_IN_0:
RLC A ;REM ON 02.7.20
; RRC A ;ADDED ON 02.7.20
JNC KEY_FOUND ;找到按键
INC R3
INC KEY_NO
CJNE R3,#04H,KEY_IN_0
NOP
NOP
LJMP KEY_TEST_RETI
KEY_FOUND:
MOV A,OLD_KEY_NO
CJNE A,KEY_NO,NEW_KEY_IN
INC KEY_LAST_TIME
MOV KEY_NO,#00H
NOP
NOP
AJMP KEY_IN_1
NEW_KEY_IN:
MOV OLD_KEY_NO,KEY_NO ;备份
MOV KEY_NO,#00H
MOV KEY_LAST_TIME,#00H ;按键计时
KEY_IN_1:
SETB F_KEY_FOUND
KEY_TEST_RETI:
MOV P1,#0FFH
MOV TH0,#01H
MOV TL0,#01H ;40MS中断一次
POP PSW
POP A
RETI
;*******************************************************
MOV_PRO:
MOV R0,#TIMER_BUFF
MOV R3,PAIDUI ;PAIDUI 中是现在排队的个数
TIMER_PRO_0: ;排队的所有的时间减1
MOV A,@R0
DEC A
MOV @R0,A
INC R0
DJNZ R3,TIMER_PRO_0
MOV R0,#TIMER_BUFF
MOV A,@R0
CJNE A,#0,TIMER_PRO_END
;********;如果第一的时间已经到了,就启动移动***************
SETB F_MOV
TIMER_PRO_END:
RET
;*********************************************************************
LOAD_KEY: ;重新分配按键的值
MOV DPTR,#RIGHT_TABLE
MOVC A,@A+DPTR
RET
RIGHT_TABLE:
DB 3,2,1,0,7,6,5,4,0AH,0BH,9,8,0FH,0CH,0EH,0DH
RET
;*********************************************************************
DISPLAY_ALL:
MOV X_ADD,#01
MOV Y_ADD,#016
MOV DPTR,#HZ_GUANG
LCALL OUTHZ16
MOV X_ADD,#01
MOV Y_ADD,#32
MOV DPTR,#HZ_ZHOU
LCALL OUTHZ16
MOV X_ADD,#01
MOV Y_ADD,#48
MOV DPTR,#HZ_SHI
LCALL OUTHZ16
MOV X_ADD,#01
MOV Y_ADD,#064
MOV DPTR,#HZ_LI
LCALL OUTHZ16
MOV X_ADD,#01
MOV Y_ADD,#080
MOV DPTR,#HZ_DE
LCALL OUTHZ16
MOV X_ADD,#01
MOV Y_ADD,#096
MOV DPTR,#HZ_TAI
LCALL OUTHZ16
MOV X_ADD,#04
MOV Y_ADD,#0
MOV DPTR,#HZ_DIAN
LCALL OUTHZ16
MOV X_ADD,#04
MOV Y_ADD,#016
MOV DPTR,#HZ_ZI
LCALL OUTHZ16
MOV X_ADD,#04
MOV Y_ADD,#032
MOV DPTR,#HZ_JI
LCALL OUTHZ16
MOV X_ADD,#04
MOV Y_ADD,#048
MOV DPTR,#HZ_SHU
LCALL OUTHZ16
MOV X_ADD,#04
MOV Y_ADD,#064
MOV DPTR,#HZ_YOU
LCALL OUTHZ16
MOV X_ADD,#04
MOV Y_ADD,#080
MOV DPTR,#HZ_XIAN
LCALL OUTHZ16
MOV X_ADD,#04
MOV Y_ADD,#096
MOV DPTR,#HZ_GONG
LCALL OUTHZ16
MOV X_ADD,#04
MOV Y_ADD,#0112
MOV DPTR,#HZ_SI
LCALL OUTHZ16
RET
;***************LCD_C_D********************************************************
LCD_COMMAND:
JNB F_COMMAND,LCD_COMMAND_0
CLR DI ;=0,是指令; =1,数据
AJMP LCD_COMMAND_1
LCD_COMMAND_0:
SETB DI
LCD_COMMAND_1:
CLR E
CLR RW
MOV P0,COMMAND
NOP
NOP
SETB E
NOP
NOP
NOP
NOP
CLR E
SETB RW
SETB DI
LCALL DELAY_10US
LCALL DELAY_10US
LCALL DELAY_10US
LCALL DELAY_10US
RET
;***********************************************************************
; 使用了R2\R5
CLRLCD:
SETB CS1
SETB CS2
SETB F_COMMAND
MOV COMMAND,#0C0H ;显示从0开始
LCALL LCD_COMMAND
MOV R2,#0B8H
CLRLCD_0:
MOV COMMAND,R2
SETB F_COMMAND
LCALL LCD_COMMAND
SETB F_COMMAND
MOV COMMAND,#040H
LCALL LCD_COMMAND
MOV R5,#64
CLRLCD_2:
CLR F_COMMAND
MOV COMMAND,#0H ;0清屏,F是黑屏
LCALL LCD_COMMAND
DJNZ R5,CLRLCD_2
INC R2
MOV A,R2
CJNE A,#0C0H,CLRLCD_0
CLR CS1
CLR CS2
RET
;************************************************************
; 显示16*16汉字子程序。
;输入X:0--7,每增加1,就向下移动爸爸内半个字的位置(8个点)
;Y:0--63, <32,左半边,>32:右半边
;************************************************************
OUTHZ16:
MOV A,Y_ADD
CJNE A,#064,CHOOSE_HALF ;左右两半屏的
CHOOSE_HALF:
JC CHOOSE_LEFT
CLR CS1
SETB CS2
SUBB A,#64
MOV Y_ADD,A
LJMP CHOOSE_END
CHOOSE_LEFT:
SETB CS1
CLR CS2
CHOOSE_END:
SETB F_COMMAND ;30H=X (0-6) 31H=Y(0-63-16)
MOV COMMAND,#0C0H ;START = 0
LCALL LCD_COMMAND
MOV R7,#2
MOV A,#40H ; Y
ADD A,Y_ADD
MOV Y_ADD,A
;40+Y
MOV A,#0B8H
ADD A,X_ADD ;B8+X
MOV X_ADD,A ;A>>30H
HZ2:
SETB F_COMMAND
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -