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

📄 ltp1245.a51

📁 单片机A51开发的打印机出动程序
💻 A51
📖 第 1 页 / 共 5 页
字号:
        MOV		A, WPAGE_U7
        MOV		DPTR, #WPAGE
        MOVX	@DPTR, A					;置RAM 0页
        MOV		A, R1
        CJNE	A, 04H, ZJZK_ERR
        MOV		A, R0
        CJNE	A, 03H, ZJZK_ERR
        SJMP	ZJZK_OK
ZJZK_ERR:
		SETB	ZKERROR
         MOV	R7, #0FFH
         MOV	DPTR, #ERRTAB
         MOV	R0, #PRTTEMPBUF				;打印暂存缓冲区	32个字节 (20H)
         MOV	R6, #13
ZJZKERR1:
		CLR		A
		MOVC	A, @A+DPTR
		MOVX	@R0, A
		INC		DPTR
		INC		R0
		DJNZ	R6, ZJZKERR1
		MOV		PRTTEMPBUFP, #13			;打印暂存缓冲区指针
		MOV		DPTR, #ORDBUF
		MOV		A, #0DH
		MOVX	@DPTR, A
		MOV		ORDFLAG, #0FFH				;为0表示完成,FF表示末完成,其它表示命令串指针
ZJZK_OK:
		RET
		
ROMADD:
		MOV		A, #00H
		MOVC	A, @A+DPTR
		ADD		A, R1
		MOV		R1, A
		MOV		A, #00H
		ADDC	A, R0
		MOV		R0, A
		INC		DPTR
        RET
        
;打印电压,温度值
FINDVT:
		MOV		R7, #ADCH0					;常数 11000000B
		LCALL	AD							;AD转换子程序
;		mov		r7, #80						;DZHB	01-8-21 11:25
		LCALL	TEMP_COMP					;温度补偿
		MOV		TX, R7						;TX 存放AD转换温度结果
		MOV		A, R7
		CJNE	A, #TMAX, FIND1				;TMAX 常数 29
FIND1:
		JNC		FIND2
		SETB	HEAD_HEAT					;打印头过热
		LJMP	VTRET

FIND2:
		CJNE	A, #TMIN, FIND3				;TMIN 常数 232
		
FIND3:
		JC		FIND4
		SETB	HEAD_OPEN					;打印头开路
		LJMP	VTRET

FIND4:
		MOV		DPTR, #ZITAB1
		MOV		DPL1, DPL
		MOV		DPH1, DPH
		MOV		R7, #15
		LCALL	FINWCOM						;从ROM写入通讯缓冲区
		MOV		A, TX						;TX 存放AD转换温度结果
		MOV		DPTR, #TTAB
		MOV		B, #02H
		MUL		AB
		ADD		A, DPL
		MOV		DPL, A
		MOV		A, B
		ADDC	A, DPH
		MOV		DPH, A
		CLR		A
		MOVC	A, @A+DPTR
		MOV		R6, A
		INC		DPTR
		CLR		A
		MOVC	A, @A+DPTR
		MOV		R5, A
		CJNE	A, #156, FINDVT3
FINDVT3:
		JC		FINDCT5
		MOV		B, #2DH
		LCALL	WCOM						;写通讯缓冲区一个字节
		MOV		2H, 6H
		LCALL	FTC							;BCD码转ASC码
		MOV		B, R4
		LCALL	WCOM						;写通讯缓冲区一个字节
		MOV		B, R3
		LCALL	WCOM
		MOV		B, #2FH
		LCALL	WCOM
		MOV		A, TX						;TX 存放AD转换温度结果
		CJNE	A, #163, FINDCT4
FINDCT4:
		JC		FINDCT6
		MOV		B, #2DH
		LCALL	WCOM						;写通讯缓冲区一个字节
FINDCT6:
		MOV		2, 5
		LCALL	FTC							;BCD码转ASC码
		MOV		B, R4
		LCALL	WCOM						;写通讯缓冲区一个字节
		MOV		B, R3
		LCALL	WCOM
		SJMP	FIND7

FINDCT5:
		MOV		2, 6
		LCALL	FTC
		MOV		B, R4
		LCALL	WCOM
		MOV		B, R3
		LCALL	WCOM
		MOV		B, #2FH
		LCALL	WCOM
		MOV		2, 5
		LCALL	FTC
		MOV		B, R4
		LCALL	WCOM
		MOV		B, R3
		LCALL	WCOM
FIND7:
		MOV		B, #0DH
		LCALL	WCOM
		MOV		R7, #ADCH1					;常数 11100000B
		LCALL	AD
;		mov		r7, #200					;DZHB	01-8-21 11:25
		MOV		VP, R7						;VP 存放AD转换电压值
		MOV		A, R7
		CJNE	A,	#142, FIND8
		
FIND8:
		JNC		FIND10
		SETB	VPABNORM					;电压非正常标志,为1出错
		SJMP	VTRET
		
FIND10:
		CJNE	A, #243, FIND11
FIND11:
		JC		FIND9
		SETB	VPABNORM					;电压非正常标志,为1出错
		SJMP	VTRET
		
FIND9:
		MOV		DPTR, #ZITAB2
		MOV		DPL1, DPL
		MOV		DPH1, DPH
		MOV		R7, #09H
		LCALL	FINWCOM						;从ROM写入通讯缓冲区
		MOV		A, VP						;VP 存放AD转换电压值
		CLR		C
		SUBB	A, #142
		MOV		DPTR, #VPTAB
		LCALL	DPADDA
		CLR		A
		MOVC	A, @A+DPTR
		MOV		R2, A
		LCALL	FTC
		MOV		B, R4
		LCALL	WCOM
		MOV		B, #2EH
		LCALL	WCOM
		MOV		B, R3
		LCALL	WCOM
		MOV		B, #56H
		LCALL	WCOM
		MOV		B, #0DH
		LCALL	WCOM
VTRET:
		RET
		
;BCD码转ASC码,入口R2
FTC:
		MOV		A, R2
		ANL		A, #0F0H
		SWAP	A
		ADD		A, #30H
		MOV		R4, A
		MOV		A, R2
		ANL		A, #0FH
		ADD		A, #30H
		MOV		R3, A
		RET
		
;从ROM写入通讯缓冲区
;DPH1,DPL1,被写入块首地址,R7,数据长度
FINWCOM:
		MOV		DPL, DPL1
		MOV		DPH, DPH1
		CLR		A
		MOVC	A, @A+DPTR
		MOV		B, A
		INC		DPTR
		MOV		DPL1, DPL
		MOV		DPH1, DPH
		LCALL	WCOM
		DJNZ	R7, FINWCOM
 		RET
 		
;写通讯缓冲区一个字节
;入口 B存放被写数据
WCOM:
		MOV		DPTR, #COMBUF					;2K 通讯缓冲 1000H
		MOV		A, DPL
		ADD		A, COMBUFPEL
		MOV		DPL, A
		MOV		A, DPH
		ADDC	A, COMBUFPEH
		MOV		DPH, A
		MOV		A, B
		MOVX	@DPTR, A
		MOV		A, COMBUFPEL
		ADD		A, #01H
		MOV		COMBUFPEL, A
		MOV		A, COMBUFPEH
		ADDC	A, #00H
		MOV		COMBUFPEH, A
		MOV		A, COMBUFPEH				;DEL MORE
		SUBB	A, #08H
		JC		WCOM1
		MOV		COMBUFPEH, #00H
		MOV		COMBUFPEL, #00H
WCOM1:	
		RET

;检测外存
SAVERTST:
		SETB	P1.6
		CLR		EA
		MOV		DPTR, #00H
		MOV		A, #55H
		MOV		50H, A
		MOVX	@DPTR, A
		NOP
		NOP
		LCALL	VERTST						;内存检验子程序
		JNZ		SAVERR
		MOV		A, #0AAH
		MOV		50H, A
		MOV		DPTR, #00H
		MOVX	@DPTR, A
		NOP
		NOP
		LCALL	VERTST
		JNZ		SAVERR
		MOV		DPTR, #SAVTAB1
		MOV		DPL1, DPL
		MOV		DPH1, DPH
		MOV		R7, #13
		LCALL	FINWCOM						;从ROM写入通讯缓冲区
		MOV		B, #0DH
		LCALL	WCOM
		SJMP	SAVERET

SAVERR:
		MOV		DPTR, #SAVTAB2
		MOV		DPL1, DPL
		MOV		DPH1, DPH
		MOV		R7, #12
		LCALL	FINWCOM
		MOV		B, #0DH
		LCALL	WCOM
SAVERET:
		CLR		P1.6
		SETB	EA
		RET

;内存检验子程序
;出口,A为0,通过,A为FF,出错
VERTST:
		MOVX	A, @DPTR
		MOV		R6, A
		CLR		A
		MOVX	@DPTR, A
		MOV		A, R6
		CJNE	A, 50H,	VERTST1
		INC		DPTR
		MOVX	@DPTR, A
		MOV		A, DPH
		CJNE	A, #80H, VERTST
		MOV		A, #00H
		SJMP	VERTST2
VERTST1:
		MOV A,#0FFH
VERTST2:
		RET

;打印版本号
PEDITION:
		MOV		DPTR, #002EH				;??
		CLR		A
		MOVC	A, @A+DPTR
		ADD		A, #30H
		MOV		50H, A
		MOV		A,#01H
		MOVC	A, @A+DPTR
		MOV		51H, A
		MOV		A, #02H
		MOVC	A, @A+DPTR
		ADD		A, #30H
		MOV		52H, A
		MOV		DPTR, #PRTTEMPBUF			;打印暂存缓冲区	32个字节 (20H)
		MOV		A, PRTTEMPBUFP				;打印暂存缓冲区指针
		LCALL	DPADDA
		MOV		R0, #50H
		MOV		R7, #03H
		LCALL	IR0_DPX						;内部RAM-->外部RAM
		MOV		A, PRTTEMPBUFP
		ADD		A, #03H
		MOV		PRTTEMPBUFP, A
		RET

;打印代码和
PROMADD:
		MOV		DPTR, #0033H
		MOV		R0, #50H
		MOV		R7, #02H
PROMA1:
		CLR		A
		MOVC	A, @A+DPTR
		MOV		R6, A
		ANL		A, #0F0H
		SWAP	A
		LCALL	CJBAS						;BCD转换为ASCII
		MOV		@R0, A
		MOV		A, R6
		INC		R0
		ANL		A, #0FH
		LCALL	CJBAS						;BCD转换为ASCII
		MOV		@R0, A
		INC		R0
		INC		DPTR
		DJNZ	R7, PROMA1
		MOV		DPTR, #PRTTEMPBUF
		MOV		A, PRTTEMPBUFP
		LCALL	DPADDA
		MOV		R0, #50H
		MOV		R7, #04H
		LCALL	IR0_DPX						;内部RAM-->外部RAM
		MOV		A, PRTTEMPBUFP
		ADD		A,#04H
		MOV		PRTTEMPBUFP, A
		RET
		
;BCD转换为ASCII
CJBAS:
		CJNE	A, #0AH, CJBAS1
CJBAS1:
		JNC		CJBAS2
		ADD		A, #30H
		RET
CJBAS2:
		ADD		A, #37H
		RET
		
;打印测试页
PTESTPAG:
		MOV		A, DOTBUFPH					;点阵缓冲区头指针
		XRL		A, DOTBUFPE
		JNZ		PTESTPAG
		MOV		DOTBUFPE, #00H
		MOV		DOTBUFPH, #00H
		MOV		DOTBUFP, #00H				;点阵缓冲区写位置指针
		MOV		R5, #06H
TEST_3:
		MOV		R6, #24
TEST_2:
		MOV		DPTR, #21A0H
		MOV		A, DOTBUFPE
		MOV		B, #49
		MUL		AB
		ADD		A, DPL
		MOV		DPL, A
		MOV		A, B
		ADDC	A, DPH
		MOV		DPH, A
		INC		DPTR
		MOV		A, DOTBUFP					;点阵缓冲区写位置指针
		LCALL	DPADDA
		MOV		R7, #08H
		MOV		A, #0FFH
TEST_1:
		MOVX	@DPTR, A
		INC		DPTR
		DJNZ	R7, TEST_1
		INC		DOTBUFPE
		DJNZ	R6, TEST_2
		MOV		A, #08H
		ADD		A, DOTBUFP					;点阵缓冲区写位置指针
		MOV		DOTBUFP, A
		DJNZ	R5, TEST_3
		INC		DOTBUFPE
		MOV		DOTBUFP, #00H				;点阵缓冲区写位置指针
		MOV		R6, #08H
		MOV		R5, #64
TEST_5:
		MOV		A, R6
		MOV		DPTR, #DSTTAB
		MOVC	A, @A+DPTR
		MOV		R4, A
		MOV		DPTR, #21A0H
		MOV		A, DOTBUFPE
		MOV		B, #49
		MUL		AB
		ADD		A, DPL
		MOV		DPL, A
		MOV		A, B
		ADDC	A, DPH
		MOV		DPH, A
		INC		DPTR
		MOV		A, DOTBUFP					;点阵缓冲区写位置指针
		LCALL	DPADDA
		MOV		R7, #06H
TEST_4:
		MOV		A, R4
		MOVX	@DPTR, A
		MOV		A, #08H
		LCALL	DPADDA
		DJNZ	R7, TEST_4
		INC		DOTBUFPE
		DJNZ	R6, TEST_6
		INC		DOTBUFP						;点阵缓冲区写位置指针
		MOV		R6, #08H
TEST_6:
		DJNZ	R5, TEST_5
		MOV		DOTNOPFLAG, #0FFH			;点阵缓冲区为空标志
		MOV		DOTBUFP, #00H				;点阵缓冲区写位置指针
		RET

DSTTAB:
		DB 00H
        DB 10000000B
        DB 01000000B
        DB 00100000B
        DB 00010000B
        DB 00001000B
        DB 00000100B
        DB 00000010B
        DB 00000001B

;TPC自检出错,未准备好(过热,开路处理,没纸...)
TPCERROR:
		MOV		A, ZJRETSTATUS				;自检/校验 返回状态
		MOV		R2, #00H
TPCER1:
		RRC		A
        JNC		TPCER2
		LCALL	TPCERDO
TPCER2:
		INC		R2
        CJNE	R2, #08H, TPCER1
		MOV		A, TPCSTATUS
TPCER3: 
		RRC		A
        JNC		TPCER4
        LCALL	TPCERDO
        RET
        
TPCER4:
		INC		R2
        CJNE	R2, #16, TPCER3
        RET
        
TPCERDO:
		PUSH	ACC
		PUSH	2
		MOV		A, R2
		MOV		B, #03H
		MUL		AB	
		MOV		DPTR, #ERRPTAB
		JMP		@A+DPTR

ERRPTAB:
		LJMP	ERR00						;代码和错					(BUSY,PE,PERR) = 101
		LJMP	ERR01						;字库代码和错				(BUSY,PE,PERR) = 
		LJMP	ERR02						;内存错						(BUSY,PE,PERR) = 
		LJMP	ERR03						;外存错						(BUSY,PE,PERR) = 
		LJMP	ERR04						;打印队列满					(BUSY,PE,PERR) = 
		LJMP	ERR05						;收据头校验错				(BUSY,PE,PERR) = 
		LJMP	ERR06						;未定义						(BUSY,PE,PERR) = 
		LJMP	ERR07						;自定义汉字校验错			(BUSY,PE,PERR) = 
		LJMP	ERR08						;打印头过热					(BUSY,PE,PERR) = 101
		LJMP	ERR09						;打印头开路					(BUSY,PE,PERR) = 101
		LJMP	ERR0A						;电压非正常标志,为1出错		(BUSY,PE,PERR) = 0X1
		LJMP	ERR0B						;没纸						(BUSY,PE,PERR) = 110
		LJMP	ERR0C						;打印头末放下				(BUSY,PE,PERR) = 100
		LJMP	ERR0D						;未定义						(BUSY,PE,PERR) = 
		LJMP	ERR0E						;未定义						(BUSY,PE,PERR) = 
		LJMP	ERR0F						;其它致命错误				(BUSY,PE,PERR) = 

ERR00:
		POP		2							;代码和错
		POP		ACC
		SETB	P1.6
		SETB	P1.5
		SETB	PERR_						;加热驱动
        MOV		DPTR, #WPAGE
        MOV		A, WPAGE_U7
		MOVX	@DPTR, A
;        SJMP	$							;*DZHB 01-8-21 9:53
ERR01:	
		CLR		ZKERROR						;字库代码和错
		LJMP	ERRRET
		
ERR02:	CLR		RAMERROR					;内存错
		LJMP	ERRRET

⌨️ 快捷键说明

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