?? 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 + -