📄 12864zk.asm
字号:
; 12864接口程序
;****************************************************************************
; *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.0 ;定义数据与指令线
RW equ P3.3 ;定义读写线
E equ P3.1 ;定义使能控制线
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
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:
;延时
;首先选择基本指令集
MOV A, #30H ;30---基本指令操作
LCALL LCDWC
MOV A,#30H ;使用8位控制界面
LCALL LCDWC
MOV A, #01H ;指令#01H为:清除屏幕文字,把地址指针指向00H单元
LCALL LCDWC ;
MOV A, #06H ;指定在资料写入或读取时,设定游标的移动方向及指定显示的移位
LCALL LCDWC
MOV A,#0CH
CALL LCDWC
RET
;---------------------------------------------------------
;SEARCH ADDRESS -
;目的是为了转换地址单元为DDRAM地址单元,以方便 -
;定义显示位置 -
;汉字显示DDRAM位置为:第一行:80H----87H -
; 第二行:90H----97H -
; 第三行:88H----8FH -
; 第四行:98H----9FH -
;---------------------------------------------------------
LCDPOS: PUSH DPH ;地址转换子程序
PUSH DPL
; PUSH A
MOV DPTR,#LINE_ADD ;LINE-ADD为地址表指针
MOV A,FIRST_LIN
MOVC A,@A+DPTR
ADD A,FIRST_ADD
MOV START_ADD,A
; POP A
POP DPL
POP DPH
RET
LINE_ADD:
DB 00H,80H,90H,88H,98H.00H
READ: MOV P3, #0FBH ;读数据子程序
;P3--CONTRAL I/O
NOP ;P3=11111011B RS=1 R/W=1 READ DATA
SETB E ;E=E(I/O)
LCALL DELAY01
MOV A, P1 ;P1=DATA(I/O)
NOP
CLR E
RET
CHK_BUSY:PUSH ACC
CLR RS ;读忙状态子程序
SETB RW
SETB E
CHK_B: NOP
JB P1.7,CHK_B
CLR E
POP ACC
RET
LCDWD: ;写数据子程序
LCALL CHK_BUSY ;P3--CONTRAL I/O
NOP ;RS=1 RW=0 WRITE DATA
SETB RS
CLR RW
SETB E ;E=1
MOV P1, A ;P1=DATA(I/O)
; LCALL DELAY01
NOP
CLR E
NOP
MOV P1,#0FFH
RET
LCDWC: ;写指令子程序
LCALL CHK_BUSY ;以确保上一指令/数据模块已经接收处理完
NOP ;RS=0 WRITE INSTRUTION
CLR RS ;RW=0
CLR RW
SETB E ;E=1
MOV P1, A ;P1=DATA(I/O)
;LCALL DELAY01
NOP
CLR E
NOP
MOV P1,#0FFH
RET
DELAY: ; 延时子程序
MOV R5,#03H
DE_1: MOV R6,#0FFH
DE_2: MOV R7,#0FFH
DE_3: DJNZ R7,DE_3
DJNZ R6,DE_2
NOP
NOP
DJNZ R5, DE_1
RET
DELAY01: MOV R6, #6
DE_A: MOV R7, #0Fh
DE_B: DJNZ R7, DE_B
DJNZ R6, DE_A
RET
DELAY02: MOV R6, #6
DE_A1: MOV R7, #18h
DE_B1: DJNZ R7, DE_B1
DJNZ R6, DE_A1
RET
DELAY03: MOV R5,#03H
DE_6: MOV R6,#0BFH
DE_4: MOV R7,#0BFH
DE_5: DJNZ R7,DE_5
DJNZ R6,DE_4
NOP
NOP
DJNZ R5,DE_6
RET
TAB:
DB "长春第二材料试验机厂"
DB "按照 ISO9001"
DB "质量管理体系运作"
DB "力值: "
DB 00H
RET
BITMAP:
;-- 宽度x高度=128x64 --
; 源文件 / 文字 :TESTFILE
; 宽×高(像素): 128x64
; 字模格式/大小 : 单色点阵液晶字模,横向取模,字?正序/640字节
; 数据转换日期 : 04-4-8 14:04:09
;-------------------------------------------------------------------------------
db 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
;以下省略
db 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
;-------------------------------------------------------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -