📄 12864zk并.asm
字号:
; SMG12864ZK 并口(8位)接口程序
;****************************************************************************
;连线图: *LCM---8031* *LCM---8031* *LCM------------8031* *LCM----------8031 *
; *DB0---P1.0* *DB4---P1.4* *RS-------------P3.1* *PSB----------P3.4 *
; *DB1---P1.1* *DB5---P1.5* *RW-------------P3.3* *
; *DB2---P1.2* *DB6---P1.6* *E--------------P3.0 *
; *DB3---P1.3* *DB7---P1.7* *RESET----------P3.5? (详见说明书)*
;注:8031的晶振频率为12MHz *
;****************************************************************************
RS equ P3.1 ;定义数据与指令线
RW equ P3.3 ;定义读写线
E equ P3.0 ;定义使能控制线
PSB equ P3.4 ;定义串并口选择线
RESET equ P3.5 ;定义复位线
XPOS EQU 20H ;定义列地址
YPOS EQU 21H ;定义行地址
FIRST_COL EQU 30H ;定义字符/汉字显示起始行
FIRST_ROW EQU 31H ;定义字符/汉字显示起始列
HZK_WID EQU 32H ;定义字符/汉字显示长度
HZK_LIN EQU 33H ;定义字符/汉字显示行数
FIRST_ADD EQU 34H ;定义字符/汉字显示起始位置
START_ADD EQU 35H ;起始位置缓存单元
FIRST_LIN EQU 36H ;起始行位置缓存单元
G_COLUMN EQU 37H ;定义图形显示起始行
G_ROW EQU 38H ;定义图形显示起始列
G_WID EQU 39H ;定义图形显示宽度
ORG 0000H
START: mov SP,#60h
CLR RESET
NOP
SETB RESET
SETB PSB ;PSB=1 并口
CLR RW
LCD:
LCALL LCDRESET ;调用系统初始化程序
CALL HZKLIB ;汉字显示
CALL DELAY ;延时
CALL DELAY
CALL DELAY
MOV A,#01H ;指令#01H为:清除屏幕文字,把地址指针指向00H单元
CALL LCDWC
MOV DPTR,#BITMAP ;显示图形 BITMAP
CALL LCDDIS
CALL DELAY
CALL DELAY
; MOV A,#55H
; CALL LCDFILL ;全屏显示隔列相间的线条
CALL DELAY
CALL DELAY
CALL CLEAR ;清屏
JMP 0000H
HZKLIB: ;显示汉字子程序
MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV DPTR, #TAB ;需要显示汉字机内码数据表
MOV HZK_WID,#08H ;每行显示汉字个数
MOV HZK_LIN,#04H ;显示行数
MOV START_ADD,#00H ;清首个显示地址缓存单元
LCALL HZK_DISP ;调用汉字显示子程序
RET
LCDDIS: ;图形显示子程序,该子程序可简化为一个函数调用
MOV XPOS,#0 ;设定图形显示起始行单元
MOV YPOS,#0
DIS_A1:MOV XPOS,#0
DIS_A2:
MOV A,#36H ;选择扩充指令集关闭图形显示
; 该指令在扩充指令集
CALL LCDWC
MOV A,YPOS
ADD A,#80H ;输入图形显示起始地址
CALL LCDWC
MOV A,XPOS
ADD A,#80H
CALL LCDWC
MOV B,A
MOV A,#30H ;重新选择基本指令集
CALL LCDWC
CLR A
MOVC A,@A+DPTR ;输入显示数据(横向高8位数据)
CALL LCDWD
INC DPTR
CLR A
MOVC A,@A+DPTR ;输入显示数据(横向低8位数据)
CALL LCDWD
INC XPOS ;列地址加一
INC DPTR
MOV A,B
CJNE A,#87H,DIS_A2 ;最后一列地址为87H
INC YPOS ;行地址加一
MOV A,YPOS
CJNE A,#20H,DIS_A1 ;最后行地址为80H+20H=0A0H
MOV YPOS,#0
DIS_A3:MOV XPOS,#0 ;下半部分的显示
DIS_A4:
MOV A,#36H ;选择扩充指令集关闭图形显示
CALL LCDWC
MOV A,YPOS
ADD A,#80H
CALL LCDWC
MOV A,XPOS
ADD A,#88H ;下部分 列地址首址
CALL LCDWC
MOV B,A
MOV A,#30H ;重新选择基本指令集
CALL LCDWC
CLR A
MOVC A,@A+DPTR ;输入显示数据(横向高8位数据)
CALL LCDWD
INC DPTR
CLR A
MOVC A,@A+DPTR ;输入显示数据(横向低8位数据)
CALL LCDWD
INC DPTR
INC XPOS ;列地址加一
MOV A,B
CJNE A,#8FH,DIS_A4 ;最后一列地址为8FH
INC YPOS ;行地址加一
MOV A,YPOS
CJNE A,#20H,DIS_A3 ;最后行地址为80H+20H=0A0H
RET
CLEAR: ;清除图形显示CGRAM
MOV A,#00
CALL LCDFILL
RET
LCDFILL:
MOV R4,A
MOV XPOS,#0
MOV YPOS,#0
LCD_A1:MOV YPOS,#0
LCD_A2:
MOV A,#36H ;选择扩充指令集关闭图形显示
CALL LCDWC
;CALL LCDPOS
MOV A,XPOS
ADD A,#80H
CALL LCDWC
MOV A,YPOS
ADD A,#80H
CALL LCDWC
MOV B,A
MOV A,#30H ;重新选择基本指令集
CALL LCDWC
MOV A,R4
CALL LCDWD
CALL LCDWD
INC YPOS
MOV A,B
CJNE A,#87H,LCD_A2 ;最后一列地址?87H
INC XPOS
MOV A,XPOS
CJNE A,#20H,LCD_A1 ;最后行地址为80H+20H=0A0H
MOV XPOS,#0
LCD_A3:MOV YPOS,#0
LCD_A4:
MOV A,#36H
CALL LCDWC
MOV A,XPOS
ADD A,#80H
CALL LCDWC
MOV A,YPOS
ADD A,#88H
CALL LCDWC
MOV B,A
MOV A,#30H ;重新选择基本指令集
CALL LCDWC
MOV A,R4
CALL LCDWD
CALL LCDWD
INC YPOS
MOV A,B
CJNE A,#8FH,LCD_A4 ;最后一列地址为8FH
INC XPOS
MOV A,XPOS
CJNE A,#20H,LCD_A3 ;最后行地址为80H+20H=0A0H
RET
HZK_DISP: ;汉字显示子程序
MOV R1,HZK_WID
HZK10: LCALL LCDPOS ;调用调整地址单元子程序
MOV A, START_ADD ;设定DDRAM地址,显示位置地址
LCALL LCDWC
HZK11: CLR A ;因为要连续输入机内码高位(区码)、低位(位码)
MOVC A, @A+DPTR ;所以要输入两次数据,如果是字符就是输入两个字符字符代码可以看说明书
LCALL LCDWD ;DATA LCDWC
INC DPTR ;显示地址会自动加一,如果连续写就不用再输入地址,空白可用某空白汉字或字符代替
CLR A
MOVC A, @A+DPTR
LCALL LCDWD
LCALL DELAY03
INC DPTR
DJNZ R1,HZK11
MOV R1,HZK_WID ;调整显示长度
INC FIRST_LIN ;跳到下一行
DJNZ HZK_LIN,HZK10
RET
LCDRESET:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -