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

📄 ltp1245.a51

📁 单片机A51开发的打印机出动程序
💻 A51
📖 第 1 页 / 共 5 页
字号:
		CLR		LENGTHBIG
EXE21_3:
		MOV		ORDFLAG, #00H				;为0表示完成,FF表示末完成,其它表示命令串指针
        RET

EXE21_4:
		CLR		CROSSBIG					;DZHB 01-8-29 10:14
		CLR		LENGTHBIG
		SJMP	EXE21_3
		
EXE1B2A:
		NOP
        MOV		R6, #04H
        LJMP	ORDERR						;打印暂存缓冲区写R6个字节的R7(20H), 如缓冲区满则忽略 ORDFLAG=0
        
;打印暂存缓冲区写R6个字节的R7(20H), 如缓冲区满则忽略 ORDFLAG=0
ORDERR:
		MOV		R7, #20H
        LCALL	WD2PRTB						;打印暂存缓冲区写R6个字节的R7,如缓冲区满则忽略
		MOV		ORDFLAG, #00H				;为0表示完成,FF表示末完成,其它表示命令串指针
		RET

;取点阵送打印点阵缓冲区(每次取一个字符行)
;R7(数据指针),R6(数据暂存高位)R5(数据暂存低位)[加入放大功能]
;入口: PRTTEMPBUF,PRTTEMPBUFP,DOTBUFPE,DOTBUFPH,DOTBUFP,DOTBUF
GETDOT:
		MOV		R7, #00H
GETDOT0:
		MOV		DPTR, #PRTTEMPBUF			;打印暂存缓冲区
		MOV		A, R7
		CJNE	A, PRTTEMPBUFP, GETDOT1		;打印暂存缓冲区指针
        LJMP	GDOTEND
        
GETDOT1:
		LCALL	DPADDA						;DPTR+A-->DPTR
		MOVX	A, @DPTR
		MOV		R6, A
		INC		DPTR
		INC		R7
        CLR		C
		SUBB	A, #80H	
		JC		ITSASC						;是ASCII
		MOV		A, R6
		SUBB	A, #0B0H
		JC		ITSNHZ						;非汉字,打印一个' '
		MOV		A, R7
		CJNE	A, PRTTEMPBUFP, GETDOT2
		LJMP	GDOTEND
		
GETDOT2:
		MOVX	A, @DPTR
		MOV		R5, A
		INC		DPTR
		INC		R7
		CLR		C
		SUBB	A, #0A1H					;判是汉字内码吗
		JC		ITSNHZ1						;非汉字,打印一个' '
        LCALL	FINDDHZ						;判是否自定义汉字
		JC		ITSNDHZ
		LCALL	GDHZD						;取自定义汉字点阵送缓冲区
		SJMP	GETDOT0
		
ITSNDHZ:
		LCALL	GHZD	 					;取汉字点阵送缓冲区
		SJMP	GETDOT0

ITSNHZ1:									;打印一个' '
		MOV		R6,#20H
		LCALL	GASCD	

ITSNHZ:										;打印一个' '
		MOV		R6, #20H	
        LCALL	GASCD
        SJMP	GETDOT0
        
ITSASC:										;是ASCII
		LCALL	GASCD						;取ASC码送点阵缓冲区
		SJMP	GETDOT0
		
GDOTEND:
		MOV		DOTNOPFLAG, #0FFH			;点阵缓冲区为空标志
        MOV		DOTBUFP, #00H				;点阵缓冲区写位置指针
        MOV		ORDFLAG, #00H				;为0表示完成,FF表示末完成,其它表示命令串指针
        MOV		WDOTFLAG, #00H				;写点阵同一行ASC码写计数
        JB		LENGTHBIG, GDOTEND0			;纵向放大标志
        MOV		R2, #24
        SJMP	GDOTEND1
        
GDOTEND0:
		MOV		R2, #48
GDOTEND1:
		MOV		A, ROWSPACE					;??+  行间距(点行数)
        ADD		A, R2
        MOV		R2, A						;??+
        PUSH	IE
        CLR		EX1
        SETB	P1.6
GDOTEND3:
		INC		DOTBUFPE					;点阵缓冲区尾指针
		MOV		A, DOTBUFPE
        CLR		C
        SUBB	A, #DOTBUFMAX				;点阵缓冲区尾空极大值 (10*24)
        JC		GDOTEND2
        MOV		DOTBUFPE, #00H
GDOTEND2:
		DJNZ	R2, GDOTEND3
        CLR		P1.6
        POP		IE
        RET
        
;字节放大子程序, R0存放结果地址指针
;将点阵放大两倍
PUTBIG:
		PUSH	07H
		MOVX	A, @DPTR
		MOV		R6, #02H
PUTBIG1:
		MOV		R7, #04H
		MOV		R5, #00H
PUTBIG2:
		RLC		A
		DEC		R7
		MOV		B, A
		MOV		SAVEC, C
		MOV		A, R5
		RLC		A
		MOV		C, SAVEC
		RLC		A
		MOV		R5, A
		MOV		A, B
		CJNE	R7, #00H, PUTBIG2
		MOV		A, R5
		MOVX	@R0, A
		INC		R0
		MOV		A, B
		DJNZ	R6, PUTBIG1
		POP		07H
		RET
		
;取ASC码送点阵缓冲区
;入口: R6(数据),DOTBUFP(点阵缓冲区写位置指针)
;TEMPBUF1(数据暂存),R4(数据位数),R2(循环计数)
;WDOTFLAG(写点阵同一行ASC码写计数)
GASCD:
		MOV		A, R6
		CLR		C
		SUBB	A, #20H
		JNZ		GASCD_1						;?+
		INC		WDOTFLAG					;写点阵同一行ASC码写计数
        MOV		A, DOTBUFP					;点阵缓冲区写位置指针
        ADD		A, #02H
        MOV		DOTBUFP, A
        SJMP	GASCD_2						;?+
        
GASCD_1:
		MOV		B, #48
        MUL		AB							;使用24*12 ASC字库 按行存放,行右4位无效
		MOV		DPTR, #ASCZKBG				;8000H  ASC码开始地址
		CLR		C
		ADD		A, DPL
        MOV		DPL, A
        MOV		A, B
		ADDC	A, DPH
		MOV		DPH, A
		MOV		R2, #48
		MOV		R0, #TEMPDOTBUF				;外部 144 BYTE
        JB		CROSSBIG, GASCBIG      		;判断是否横向放大 
GASCD0:
		LCALL	DPX_XR0						;外部RAM-->外部RAM @DPTR-->@R0
        MOV		R4, #02H
        SJMP	GASCD2
        
GASCBIG:									;横向放大 
		LCALL	PUTBIG						;将点阵放大两倍
        INC		DPTR
        DJNZ	R2, GASCBIG
        MOV		R4, #04H
GASCD2:
		MOV		DPTR, #TEMPDOTBUF			;外部 144 BYTE
        MOV		R2, #00H
        JB		LENGTHBIG, GASCD3			;判是否纵向放大
        MOV		R3, #01H
        MOV		64H, #24
        SJMP	GASCD4
        
GASCD3:
		MOV		R3, #02H
        MOV		64H, #48
GASCD4:
		LCALL	RDOT
        INC		WDOTFLAG
        JB		CROSSBIG, GASCD6			;判断是否横向放大
GASCD_2:
		MOV		A, WDOTFLAG
        MOV		B,#02H
        DIV		AB
        MOV		A, B
        JNZ		GASCD5
GASCD6:
		DEC		DOTBUFP
GASCD5: 
		RET
		
;取自定义汉字点阵送缓冲区
;入口:
GDHZD:
		MOV		A, DEFBUFPR					;自定义汉字缓冲区读指针
        CLR		C
        SUBB	A, #DEFHZNUM				;32
        JC		GDHZD0
        RET
        
GDHZD0:
		MOV		DPTR, #DEFHZBUF				;32*72=2304(900H);自定义汉字通讯缓冲区
        MOV		A, DEFBUFPR					;自定义汉字缓冲区读指针
        MOV		B, #72						;?+
        MUL		AB
        ADD		A, DPL
        MOV		DPL, A
        MOV		A, DPH
        ADDC	A, B
        MOV		DPH, A
        MOV		R2, #72
        MOV		R0, #TEMPDOTBUF				;外部 144 BYTE
        JB		CROSSBIG, GDHZD2			;判断是否横向放大
GDHZD1:
		LCALL	DPX_XR0						;外部RAM-->外部RAM @DPTR-->@R0
        MOV		R4, #03H
        SJMP	GDHZD3
        
GDHZD2:
		LCALL	PUTBIG						;将点阵放大两倍
        INC		DPTR
        DJNZ	R2, GDHZD2
        MOV		R4, #04H
GDHZD3:
		INC		DEFBUFPR					;自定义汉字缓冲区读指针
GDHZD7:
		MOV		DPTR, #TEMPDOTBUF			;外部 144 BYTE
        MOV		R2, #00H
        JB		LENGTHBIG, GDHZD4			;判是否纵向放大
        MOV		R3, #01H
        MOV		64H, #24
        SJMP	GDHZD5
        
GDHZD4:
		MOV		R3, #02H
        MOV		64H, #48
GDHZD5:
		LCALL	RDOT
        RET
        
;取汉字点阵送缓冲区
;入口:	R6 R5
GHZD:
		LCALL	ZKADDR						;计算汉字地址
        MOV		DPTR, #WPAGE
		MOV		A, WPAGE_U7
		MOVX	@DPTR, A
		MOV		DPL, DPL1
		MOV		DPH, DPH1
		MOV		R2, #72
		MOV		R0, #TEMPDOTBUF				;外部 144 BYTE
		JB		CROSSBIG, GHZD1
		LCALL	GDPX_XR0					;字库-->外部RAM
		MOV		R4, #03H
		SJMP	GHZD2
		
GHZD1:
		LCALL	PUTBIG						;将点阵放大两倍
        INC		DPTR
        MOV		A, DPH
        CJNE	A, #0C0H, GHZD11
        LCALL	SPANPAGE					;跨页处理
GHZD11:
		DJNZ	R2, GHZD1
        MOV		R4, #06H
GHZD2:
		MOV		R2, #00H
        JB		LENGTHBIG, GHZD3			;判是否纵向放大
        MOV		R3, #01H
        MOV		64H, #24
        SJMP	GHZD4
GHZD3:
		MOV		R3, #02H
        MOV		64H, #48
GHZD4:
		MOV		DPTR, #WPAGE
        MOV		A, WPAGE_U7
        ANL		A, #0E0H
        MOV		WPAGE_U7, A
        MOVX	@DPTR, A
        MOV		DPTR, #TEMPDOTBUF
        LCALL	RDOT
        RET

;计算汉字地址
ZKADDR:
		CLR		C
        MOV		A, R5
        SUBB	A, #0A1H
        MOV		R5, A
        MOV		A, R6
        SUBB	A, #0B0H
        MOV		B, #94
        MUL		AB
        ADD		A, R5
        MOV		R5, A				;计
        MOV		A, B				;算
        ADDC	A, #00H				;字
        MOV		R6, A 				;库
        MOV		A, R5
        MOV		B, #72				;开
        MUL		AB					;始
        MOV		DPL1, A				;地
        MOV		A, R6				;址
        MOV		DPH1, B
        MOV		B, #72
        MUL		AB
        ADD		A, DPH1
        MOV		DPH1, A
        MOV		A, B
        ADDC	A, #00H
        MOV		R6, A
        MOV		DPTR, #HZZKBG		;计算页面
        MOV		A, DPL1
		CLR		C
		ADD		A, DPL
		MOV		DPL1, A
		MOV		A, DPH1
		ADDC	A, DPH
		MOV		DPH1, A
		MOV		A, R6
		ADDC	A, #00H
		MOV		R6, A
        MOV		A, DPH1
        RL		A
        RL		A
        ANL		A, #03H
        MOV		B, A
        MOV		A, R6
        RL		A
        RL		A
        ANL		A, #1CH
        ORL		A, 0F0H
        DEC		A
        DEC		A
        MOV		R6, A
        MOV		A, WPAGE_U7       ;求页面
        ANL		A, #0E0H
      	ORL		A, R6
        MOV		WPAGE_U7, A
        MOV		A, DPH1
        ANL		A, #3FH
        ORL		A, #80H
        MOV		DPH1, A
        RET

;查找汉字内码是否为自定义汉字 
;入口:	R6 R5
;出口:	C(=0 为自定义汉字,=1 不是); 
;       DPH1(自定义汉字点阵地址高位); DPL1(自定义汉字点阵地址高位);
FINDDHZ:
		MOV		A, R6
        CJNE	A, #DEFCODE, FINDDHZ1			;常数0FEH
        MOV		A, R5
        CJNE	A, #DEFCODE, FINDDHZ1			;常数0FEH
        CLR		C
        SJMP	FINRET
        
FINDDHZ1:
		SETB	C
FINRET:
		RET
		
;读点阵到TEMPBUF1(12个字节长);送一单位点阵到点阵缓冲区
;入口: R2 点行位置(行偏移),DOTBUFP 数据位置(列偏移),WDOTFLAG(行ASC码计数)
;TEMPBUF1(数据)R4(数据位数,不可变);DPH1,DPL1(点行始址),R3纵向放大倍数为1
;表示不变,64H,最大传送点行数.
;R0()
;出口:
RDOT:
		JNB		CROSSBIG, RDOT_				;判断是否横向放大
        CLR		C
        MOV		A, #48
        SUBB	A, DOTBUFP
        JC		RDRET
        SUBB	A, R4
        JNC		RDOT_
RDRET:
		RET

RDOT_:
		PUSH	4
        MOV		R0, #TEMPBUF1
RDOT0:
		MOVX	A, @DPTR
        MOV		@R0, A
        INC		R0
		INC		DPTR
        DJNZ	R4, RDOT0
        POP		4
        MOV		A, DPH
        MOV		DPH2, A
		MOV		A, DPL
        MOV		DPL2, A
        PUSH	3
RDOT3:
		MOV		A, R2
        JNZ		RDOT1
        MOV		DPTR, #DOTBUF
        MOV		A, DOTBUFPE
        MOV		B, #49
		MUL		AB
        CLR		C
        ADD		A, DPL
		MOV		DPL, A
        MOV		DPL1, A
		MOV		A, DPH
		ADDC	A, B
		MOV		DPH, A
		MOV		DPH1, A
RDOT1:
		LCALL	WDOT						;写一行点阵到点阵缓冲区
        INC		R2
        DJNZ	R3, RDOT3					;
        POP		3
        MOV		A, R2
        CJNE	A, 64H, RDOT2              ;????
        MOV		A, DOTBUFP
        ADD		A, R4
        MOV		DOTBUFP, A
        RET
        
RDOT2:
		MOV		A, DPH2
		MOV		DPH, A
		MOV		A, DPL2
		MOV		DPL, A
        LJMP	RDOT
        
;写一行点阵到点阵缓冲区
;入口: R5 点行位置(行偏移),DOTBUFP 数据位置(列偏移),WDOTFLAG(行ASC码计数)
;       TEMPBUF1(数据)R4(数据位数,不可变);DPH1,DPL1(点行始址)
;R0()
;出口:
WDOT:
		PUSH	4
        PUSH	2
        MOV		A, DPL1
        MOV		DPL, A
        MOV		A, DPH1
        MOV		DPH, A
        MOV		A, R2						;??+
        ADD		A, DOTBUFPE					;点阵缓冲区尾指针
        JNC		WDOT_0
        ADD		A, #04H
        MOV		R2, A
        MOV		DPTR, #21A0H
        SJMP	WDOT10
        
WDOT_0:
		SUBB	A, #DOTBUFMAX				;点阵缓冲区尾空极大值 (10*24)
        JC		WDOT10
        MOV		DPTR, #21A0H
        MOV		R2, A
WDOT10:
		MOV		A, R2
        CLR		C
        MOV		B, #49
        MUL		AB
        CLR		C
        ADD		A, DPL
		MOV		DPL, A
		MOV		A, DPH
		ADDC	A, B
		MOV		DPH, A						;??+
WDOT6:
		INC		DPTR
        MOV		A, DOTBUFP
        LCALL	DPADDA						;DPTR+A-->DPTR
        MOV		R0, #TEMPBUF1
        MOV		A, WDOTFLAG					;写点阵同一行ASC码写计数
		MOV		B, #02H
		DIV		AB
		MOV		A, B
		JZ		WDOT0	
WDOT2:
		JB		CROSSBIG, WDOT0				;判断是否横向放大
        JNB		LENGTHBIG, WDOT3			;判是否纵向放大
        MOV		A, R3
        CJNE	A, #02H, WDOT7
WDOT3:
		LCALL	RMOV4BIT					;已写入个奇数个ASC码  ;缓冲区数据右移4位,最高4位与最低4位均为0
WDOT7:
		MOV		R0, #TEMPBUF1
        MOV		A, @R0
		INC		R0
		MOV		B, A
        CLR		C
        MOV		A, DPL
        SUBB	A, #01H
        MOV		DPL, A
        MOV		A, DPH
        SUBB	A, #00H
        MOV		DPH, A
        MOVX	A, @DPTR
        LCALL	CON

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -