📄 tg19264.asm
字号:
RET ;OUT: B
;****************************************************************
;全角字符数据输出,16*16点阵
;****************************************************************
PUTCWDOT: ;IN: DPTR
PUSH XPOS
MOV R7,#16
PCW_PA: ;上半个字符
CLR A
MOVC A,@A+DPTR ;获取点阵码
CALL LCDWRITE ;写入LCM(上半个字部分)
INC XPOS ;X坐标加1
INC DPTR ;指向下一个点阵码
DJNZ R7,PCW_PA
INC YPOS
POP XPOS
MOV R7,#16
PCW_PB: ;下半个字符
CLR A ;
MOVC A,@A+DPTR ;再取一个点阵码
CALL LCDWRITE ;输出
INC DPTR ;指向下一个点阵码
INC XPOS ;指向下一列
DJNZ R7,PCW_PB
DEC XPOS
CALL CUSORNEXT ;坐标指针自动移位计算(指向下一列)
MOV A,XPOS ;判断是否换行?
JNZ PCW_PC
INC YPOS
PCW_PC: DEC YPOS ;返回上半个字部分
RET
;****************************************************************
;半角字符数据输出,8*16点阵
;****************************************************************
PUTCHARDOT: ;IN: DPTR
PUSH XPOS
MOV R7,#8
PAC_PA: ;上半个字符
CLR A
MOVC A,@A+DPTR ;获取点阵码
CALL LCDWRITE ;写入LCM(上半个字部分)
INC DPTR ;指向下一个点阵码
INC XPOS
DJNZ R7,PAC_PA
INC YPOS
POP XPOS
MOV R7,#8
PAC_PB: ;下半个字符
CLR A ;
MOVC A,@A+DPTR ;再取一个点阵码
CALL LCDWRITE ;输出
INC DPTR ;指向下一个点阵码
INC XPOS
DJNZ R7,PAC_PB
DEC XPOS
CALL CUSORNEXT ;坐标指针自动移位计算(指向下一列)
MOV A,XPOS ;判断是否换行?
JNZ PAC_LA2
INC YPOS
PAC_LA2:
DEC YPOS ;返回上半个字部分
RET
;****************************************************************
; 汉字库实际指针换算,结果置入DPTR
;****************************************************************
HZKPOS: ;IN: A
MOV B,#32
MUL AB
MOV DPTR,#HZKDOT
AJMP ZKPOS
;****************************************************************
; 英文字母数字实际指针换算,结果置入DPTR
;****************************************************************
EZKPOS: ;IN: A
MOV B,#16
MUL AB
MOV DPTR,#EZKDOT ;修改数据指针,指向所选字母
ZKPOS: ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
RET ;OUT: DPTR
;****************************************************************
;按给定的XY坐标定位,并写数据子程序
;****************************************************************
LCDWRITE: ;IN: A
CALL LCDPOS ;坐标指针定位
CALL LCDWD ;写数据
RET
;****************************************************************
; 连续输出时的坐标指针换算,自动指向下一个可写入地址
;****************************************************************
CUSORNEXT:
PUSH ACC
ANL YPOS,#7
INC XPOS
MOV A,XPOS
CJNE A,#192,CNT_LAX
MOV XPOS,#0
INC YPOS
MOV A,YPOS
ANL A,#0F8H
JZ CNT_LAX
MOV YPOS,#0
CNT_LAX:
POP ACC
RET
;****************************************************************
;一字节数据输出
;****************************************************************
LCDWD: ;IN: A
PUSH B
PUSH ACC
MOV B,A
MOV A,XPOS
CJNE A,#64,$+3
JNC LWD_LA1
MOV A,B
CALL LCDWD1
JMP LWD_LA3
LWD_LA1:CJNE A,#128,$+3
JNC LWD_LA2
MOV A,B
CALL LCDWD2
JMP LWD_LA3
LWD_LA2:CJNE A,#192,$+3
JNC LWD_LA3
MOV A,B
CALL LCDWD3
LWD_LA3:
POP ACC
POP B
RET
;****************************************************************
; X,Y坐标定位处理
;****************************************************************
LCDPOS:
PUSH ACC
PUSH B
MOV A,YPOS ;取Y座标
ANL A,#7 ;保留低三位
ADD A,#0B8H ;光标定位指令
MOV B,A ;暂存Y坐标
CLR C
MOV A,XPOS ;取X坐标值
SUBB A,#PD1 ;左区边界
JNC LPS_LA1 ;如果不在左区
MOV A,XPOS ;重新取X坐标值
ANL A,#3FH ;左边部分(CS1)
ORL A,#40H ;X方向定位指令
CALL LCDWC1 ;X定位
MOV A,B ;Y定位
CALL LCDWC1
JMP LPS_LA3 ;返回
LPS_LA1:CLR C
MOV A,XPOS
SUBB A,#PD1 ;SUBB A,#PD1*2 ;中间区右边界
SUBB A,#PD1
JNC LPS_LA2 ;如果不在中间区
MOV A,XPOS
ANL A,#3FH ;中间部分(CS2)
ORL A,#40H ;X方向定位指令
CALL LCDWC2 ;X定位
MOV A,B
CALL LCDWC2 ;Y坐标定位
JMP LPS_LA3 ;返回
LPS_LA2:CLR C
MOV A,XPOS
SUBB A,#PD1 ;SUBB A,#PD1*3 ;右边区域边界
SUBB A,#PD1
SUBB A,#PD1
JNC LPS_LA3 ;如果还出界则不予定位
MOV A,XPOS
ANL A,#3FH ;右边部分(CS3)
ORL A,#40H ;X方向定位指令
CALL LCDWC3
MOV A,B
CALL LCDWC3 ;Y方向定位
LPS_LA3:
POP B
POP ACC
RET
;--------------------------------底层操作子程序----------------------------------
; 修改人:SZN
; 修改日期:2005.07.10
;
;********************************************************************
;功能:控制命令输出子程序
;标号: (1)ASM: LCDWC1, LCDWC2, LCDWC3
;入口参数:(1)ASM: A
;出口参数:无
;子程序调用:WAITIDLE1, WAITIDLE2, WAITIDLE3
;堆栈需求:4 字节
;影响资源:LCMCTRL
;********************************************************************
LCDWC1: PUSH ACC
PUSH DPH
PUSH DPL
MOV DPTR,#BLK1_WR_CMD
SJMP WCCOM
LCDWC2: PUSH ACC
PUSH DPH
PUSH DPL
MOV DPTR,#BLK2_WR_CMD
SJMP WCCOM
LCDWC3: PUSH ACC
PUSH DPH
PUSH DPL
MOV DPTR,#BLK3_WR_CMD
WCCOM:
MOVX @DPTR,A ;E=1 D/I=0 R/W=0
POP DPL
POP DPH
POP ACC
RET
;****************************************************************
;数据写输出(分为左中右3个程序)
;****************************************************************
LCDWD1: PUSH ACC ;片1写数据子程序
PUSH DPH
PUSH DPL
MOV DPTR,#BLK1_WR_DATA
SJMP WDCOM
LCDWD2: PUSH ACC ;片2写数据子程序
PUSH DPH
PUSH DPL
MOV DPTR,#BLK2_WR_DATA
SJMP WDCOM
LCDWD3: PUSH ACC ;片3写数据子程序
PUSH DPH
PUSH DPL
MOV DPTR,#BLK3_WR_DATA
WDCOM:
MOVX @DPTR,A ;E=1 D/I=0 R/W=0
POP DPL
POP DPH
POP ACC
RET
;********************************************************************
;功能:延时Xms子程序 /***IN:R7****(char)*************/
;标号: (1)ASM: _DelayXms (2) C : DelayXms(unsigned char)
;入口参数:(1)ASM: R7 (延时R7毫秒)
;出口参数:无
;子程序调用:无
;堆栈需求:4 字节
;影响资源:R7
;********************************************************************
_DelayXms:
PUSH ACC
PUSH B
DLYXMS:MOV A,#02H
AG0: MOV B,#0C7H
AG1: DJNZ B,AG1
DEC A
JNZ AG0
DJNZ R7,DLYXMS
POP B
POP ACC
RET
;********************************************************************
;功能:延时10us子程序
;标号: (1)ASM: Delay10us (2) C : Delay10us(void)
;入口参数:无
;出口参数:无
;子程序调用:无
;堆栈需求:2 字节
;影响资源:无
;********************************************************************
Delay10us:
NOP
NOP
NOP
NOP
NOP
NOP
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -