?? pronew.asm
字號:
ORG 0000H
LJMP RETUN
ORG 0013H
LJMP PINT1 ;中斷1,AD
ORG 0050H
RETUN: MOV R0,#00H
MOV R1,#00H
ZJ: DJNZ R1,ZJ
DJNZ R0,ZJ
ACALL MAIN ;執行本子程序
AJMP $
;------------------------------------------
MAIN: LCALL SCR ;LCD初始化
LCALL CDCLR
LCALL SCRSET ;屏幕濕度顯示
LCALL KEYSET ;8279初始化
HA7S1: MOV DPTR,#0B001H ;命令口
MOVX A,@DPTR ;讀狀態字
JB ACC.7,HA7S1 ;顯示無效則等待
MOV DPTR,#0B000H ;數據口
HA7S2:
HA7S3: MOV DPTR,#0B001H
MOVX A,@DPTR
ANL A,#07H
CJNE A,#00H,HA7S4 ;等到FIFORAM中有數據時繼續
AJMP HA7S3
HA7S4: MOV IE,#00H ;關中斷
MOV DPTR,#0B000H
MOVX A,@DPTR ;讀入數據
MOV B,A
CJNE A,#0C3H,GOON
AJMP MAIN
GOON: CJNE A,#0E1H,GOONSCAN ;如果按下的鍵不是EXEC鍵
JB 22H,CLEARSTA ;判斷是否第一次按EXEC,如不是,則清標志位
ERRGOON:
;MOV IE,#00H ;關中斷
LCALL CDCLR
LCALL SETPARA ;設置參數顯示
SETB 22H
AJMP GOONSCAN
CLEARSTA: ;第二次按下EXEC鍵,清標志柆
CLR 21H
MOV 30H,#00H
MOV 40H,#00H
CLR C
MOV A,51H
SUBB A,53H ;比較輸入的參數大小51h-53h
JC ERR ;如果上限十位小于下限十位,則錯誤
MOV A,51H
CJNE A,53H,CLE
CLR C
MOV A,50H
SUBB A,52H ;比較輸入的參數大小50h-52h
JC ERR
MOV A,50H
CJNE A,52H,CLE
ERR: LCALL SHOWERR ;上限小于下限,錯誤
AJMP ERRGOON ;重新輸入
CLE: LCALL CDCLR
CLR 22H
LCALL SCRSET ;屏幕濕度顯示
;MOV IE,#84H ;開中斷
AJMP SETEND
GOONSCAN:
;JNB 22H,ENDSCAN ;沒按下EXEC,不響應
JNB 22H,SETEND ;沒按下EXEC,不響應
CJNE A,#0E2H,GO1 ;是否NEXT鍵
SETB 21H ;NEXT標志位
MOV 40H,#00H
GO1: MOV R1,#00H
MOV DPTR,#KEYTAB
HA7S5: MOV A,#00H
MOVC A,@A+DPTR
CJNE A,B,HA7S6
AJMP HA7SA
HA7S6: INC DPTR
INC R1
MOV A,R1
JB ACC.4,ENDSCAN
AJMP HA7S5
HA7SA: MOV A,R1
CLR C
SUBB A,#0AH ;如果r1為a-f則不顯示
JNC ENDSCAN
MOV 30H,R1
INC 40H ;30H為需顯示數據暫存,40H為數據個數
CLR C
MOV A,40H
SUBB A,#03H ;鍵入超過兩個數則無響應
JNC ENDSCAN
LCALL SHOWKEY ;顯示按鍵
AJMP ENDSCAN
SETEND: MOV IE,#84H
ENDSCAN:AJMP HA7S2
RET
;------------------------------------------LCD初始化
CDSET:
MOV R2,#00H
MOV R3,#00H
MOV R4,#42H
ACALL CDCM1 ;圖形區首址[0000H]
MOV R2,#10H
MOV R3,#00H
MOV R4,#43H
ACALL CDCM1 ;圖形區寬度[16字節/行]
MOV R2,#00H
MOV R3,#10H
MOV R4,#40H
ACALL CDCM1 ;文本區首址[1000H]
MOV R2,#10H
MOV R3,#00H
MOV R4,#41H
ACALL CDCM1 ;文本區寬度[16字節/行]
MOV R4,#0A7H
ACALL CDCM3 ;光標形狀[8列*7行]
MOV R2,#00H
MOV R3,#00H
MOV R4,#24H
ACALL CDCM1 ;置地址指針位置[顯示緩沖區RAM 0000H]
MOV R4,#80H
ACALL CDCM3 ;字符發生器為CGRAM,顯示方式為邏輯“或”
MOV R4,#9BH
ACALL CDCM3 ;啟用圖形顯示,光標閃爍
MOV R2,#00H
MOV R3,#00H
MOV R4,#21H
ACALL CDCM1 ;光標指針[00,00]
RET
;---------------------------------------------------------
CDCLR: PUSH ACC ;清屏子程序
MOV R2,#00H
MOV R3,#00H
MOV R4,#24H
ACALL CDCM1 ;置地址指針位置[顯示緩沖區RAM 0000H]
MOV R4,#0B0H
ACALL CDCM3 ;設置LCD為自動寫入狀態
MOV R2,#04H
CDCR1: MOV R3,#00H
CDCR2: ACALL LCDS3 ;連續寫過程每次寫都要確認STA3=1
CLR A
ACALL CDWDT ;將[A]寫入LCD狀態字=清屏
DJNZ R3,CDCR2
DJNZ R2,CDCR1
MOV R4,#0B2H
ACALL CDCM3 ;結束自動寫狀態
POP ACC
RET
;---------------------------------------------------------
CDCM1: MOV A,R2 ;將R2/R3/R4依此寫入LCD狀態字
ACALL CDWDT ;將[A]寫入LCD狀態字
MOV A,R3
ACALL CDWDT ;將[A]寫入LCD狀態字
ACALL CDCM3 ;將[R4]寫入LCD狀態字
RET
;---------------------------------------------------------
CDCM3: PUSH DPH ;將[R4]寫入LCD狀態字
PUSH DPL
ACALL CDTTS ;判STA0/STA1
MOV A,R4
MOV DPTR,#8001H
MOVX @DPTR,A
POP DPL
POP DPH
RET
;---------------------------------------------------------
CDWDT: PUSH DPH ;將[A]寫入LCD數據口
PUSH DPL
PUSH ACC
ACALL CDTTS ;判STA0/STA1
MOV DPTR,#8000H
POP ACC
MOVX @DPTR,A
POP DPL
POP DPH
RET
;---------------------------------------------------------
CDTTS: MOV B,#40H ;判別STA0\STA1狀態位子程序
CDDEP: MOV DPTR,#8001H ;讀標志字
MOVX A,@DPTR
JNB ACC.0,CDDDP ;判別STA0
JB ACC.1,WCDTU ;判別STA1
CDDDP: DJNZ B,CDDEP ;在寫指令的讀寫數據前,這兩個標志位必須同時為1
WCDTU: RET
;---------------------------------------------------------
LCDS3: PUSH DPH ;連續寫過程每次寫都要確認STA3=1
PUSH DPL
PUSH ACC
PUSH B
MOV B,#20H
CDFWP: MOV DPTR,#8001H
MOVX A,@DPTR ;讀出狀態字
JB ACC.3,LCDTT ;判斷自動寫標志位STA3
DJNZ B,CDFWP
LCDTT: POP B
POP ACC
POP DPL
POP DPH
RET
;---------------------------------------------------------
HZXSR: CLR A ;依此取字碼輸出LCD,0FFH結束
MOVC A,@A+DPTR
CPL A
JNZ HZXSG ;將有效字碼送顯
RET ;0FFH則結束
;---------------------------------------------------------
HZXSG: CPL A ;分析字碼表取出的數據是命令/ASC/漢字?轉相應處理
MOV R0,A
CLR C
SUBB A,#20H ;命令?字符?
JC DDCOM ;轉命令碼處理
MOV A,R0
CLR C
SUBB A,#80H ;ASC?漢字?
JNC HZDXS ;轉漢字處理
MOV A,R0
PUSH DPH
PUSH DPL
LCALL XSASC ;轉ASC處理
POP DPL
POP DPH
INC DPTR
AJMP HZXSR ;處理下一個字碼顯示
;---------------------------------------------------------
DDCOM: MOV A,R0 ;命令碼分析&發送
XRL A,#1BH
JZ XSADD ;1BH命令處理
NXXSD: INC DPTR
AJMP HZXSR ;處理下一個字碼顯示
;---------------------------------------------------------
HZDXS: MOV A,R0 ;漢字碼顯示
PUSH DPH
PUSH DPL
LCALL XSHZF ;取相應字模送顯
POP DPL
POP DPH
INC DPTR
AJMP HZXSR
;---------------------------------------------------------
XSASC: CLR C ;ASC字符顯示
SUBB A,#20H
MOV B,#10H
MOV DPTR,#ASCDD
LCALL HADNX ;計算當前字碼的字模表首址→DPTR
MOV A,R2
PUSH ACC
MOV A,R3
PUSH ACC
MOV R6,#10H
XSDLP: LCALL XSDCN ;送出一個數據顯示
MOV B,#10H
LCALL HADRX ;計算顯示坐標[R2,R3]
DJNZ R6,XSDLP ;發送完一組[16行*8列一個字符]
POP ACC
MOV R3,A
POP ACC
MOV R2,A
MOV B,#01H
LCALL HADRX ;計算顯示首址坐標[R2,R3]
RET
;--------------------------------------------------------
XSADD: INC DPTR ;1BH命令處理 //地址指針設置
CLR A
MOVC A,@A+DPTR
MOV B,#10H
MUL AB
MOV R2,A
MOV R3,B ;R3高位R2低位
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV B,#08H
DIV AB
MOV B,A
LCALL HADRX ;計算顯示首址坐標[R2,R3]
MOV R4,#24H
LCALL CDCM1 ;將計算好的顯示位置寫LCD
INC DPTR
AJMP HZXSR ;下一數據處理
;---------------------------------------------------------
HADRX: MOV A,R2 ;計算顯示首址坐標[R2列,R3行]
ADD A,B
MOV R2,A
MOV A,R3
ADDC A,#00H
MOV R3,A
RET
;---------------------------------------------------------
HADNX: PUSH ACC ;計算當前字碼的字模表首址→DPTR
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
POP ACC
RET
;---------------------------------------------------------
XSDCN: MOV R4,#24H ;送出一個數據顯示
LCALL CDCM1 ;設置當前送顯地址
MOV A,R3
PUSH ACC
CLR A
MOVC A,@A+DPTR
MOV R3,A
MOV R4,#0C4H
LCALL CDCM2 ;將R3寫LCD,地址不變
INC DPTR
POP ACC
MOV R3,A
RET
;---------------------------------------------------------
CDCM2: MOV A,R3 ;將[R3]寫LCD,地址不變
ACALL CDWDT ;將[A]寫入LCD狀態字
ACALL CDCM3 ;將[R4]寫入LCD狀態字
RET
;---------------------------------------------------------
XSHZF: CLR C ;漢字送顯示
SUBB A,#80H
MOV B,#32
MOV DPTR,#HZKDD
LCALL HADNX ;計算當前字碼的字模表首址dPTR
MOV A,R2
PUSH ACC
MOV A,R3
PUSH ACC
MOV R6,#10H
HZPXS: LCALL XSDCN ;送出一個數據顯示
MOV B,#01H
LCALL HADRX ;計算顯示首址坐標[R2,R3]
LCALL XSDCN ;送出一個數據顯示
MOV B,#15
LCALL HADRX ;計算顯示首址坐標[R2,R3]
DJNZ R6,HZPXS ;發完一組[一個漢字16*16]
POP ACC
MOV R3,A
POP ACC
MOV R2,A
MOV B,#02H
LCALL HADRX ;計算顯示首址坐標[R2,R3]
RET
;----------------------------------------------------
;初始化屏顯
SCR:
MOV 50H,#05H
MOV 51H,#09H
MOV 52H,#05H
MOV 53H,#00H
MOV DPTR,#8000H
MOV A,#00H
MOVX @DPTR,A ;寫數據
MOV A,#00H
MOVX @DPTR,A
INC DPTR
MOV A,#42H
MOVX @DPTR,A ;寫指令
LCALL DY
MOV DPTR,#8000H
MOV A,#10H
MOVX @DPTR,A
MOV A,#00H
MOVX @DPTR,A
INC DPTR
MOV A,#43H
MOVX @DPTR,A
LCALL DY
MOV A,#0A7H
MOVX @DPTR,A
LCALL DY
MOV A,#80H
MOVX @DPTR,A
LCALL DY
MOV A,#9BH
MOVX @DPTR,A
LCALL DY
MOV DPTR,#8000H
MOV A,#00H
MOVX @DPTR,A
MOV A,#00H
MOVX @DPTR,A
MOV A,#24H
INC DPTR
MOVX @DPTR,A
LCALL DY
MOV A,#0B0H
MOVX @DPTR,A
MOV R0,#00H
QS0: MOV A,R2
MOV DPTR,#SCRTAB
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -