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