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

📄 pronew.asm

📁 工程训练课程设计 可实现温度压力两路参数的监测与控制 LCD界面显示驱动
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	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 + -