📄 ltp1245.a51
字号:
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 + -