📄 ocmc(并).asm
字号:
;MODUL OCM2X8C-2
;RS=P3.1
;RW=P3.3
;E=P3.0
;PSB=P3.4
;RESET=P3.5
;DATA/IO=P1
;显示汉字或图形方法步骤请参照说明书
;E EQU P3.0 ;选择I/O口定义,E为使能端
;RS EQU P3.1 ;选择I/O口定义,RS为指令/数据选择端
;RW EQU P3.3
;PSB EQU P3.5
;RESET EQU P3.4
RS EQU P0.0
RW EQU P0.1
E EQU P0.2
PSB EQU P0.3
RESET EQU P0.4
FIRST_COL EQU 30H ;定义字符/汉字显示起始行
FIRST_ROW EQU 31H ;定义字符/汉字显示起始列
WORD_WID EQU 32H ;定义字符/汉字显示长度
WORD_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
LJMP START
org 0100h
START: mov sp,#60h
MOV G_WID,#00H
MOV G_ROW,#00H
setb RESET
setb PSB
CLR RW
QIU1: LCALL INITIL ;调用系统初始化程序
MOV A, #0CH ;开显示,关游标
LCALL INPUT
LCALL DELAY01
MOV A, #01H ;DDRAM清零,DDRAM地址计数器到00H
LCALL INPUT
LCALL DELAY01
;-----------
;WORD DISPLAY,显示汉字子程序
;----------
MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV DPTR, #TAB ;需要显示汉字机内码数据表
MOV word_WID,#08H ;每行显示汉字个数
MOV word_LIN,#02H ;显示行数
MOV START_ADD,#00H ;清首个显示地址缓存单元
LCALL WORD_DISP ;调用汉字显示子程序
LCALL DELAY
LCALL DELAY
LCALL DELAY
MOV A, #01H
LCALL INPUT
LCALL DELAY01
MOV FIRST_ADD,#00H
MOV FIRST_LIN,#01H
MOV DPTR, #TAB1
MOV word_WID,#08H
MOV word_LIN,#02H
MOV START_ADD,#00H
LCALL WORD_DISP
LCALL DELAY
LCALL DELAY
LCALL DELAY
MOV A, #01H
LCALL INPUT
LCALL DELAY01
MOV FIRST_ADD,#00H
MOV FIRST_LIN,#01H
MOV DPTR, #TAB2
MOV word_WID,#08H
MOV word_LIN,#02H
MOV START_ADD,#00H
LCALL WORD_DISP
LCALL DELAY
LCALL DELAY
LCALL DELAY
MOV A, #01H
LCALL INPUT
LCALL DELAY01
LCALL DELAY
;---------------------------
;GRAPHIC DISPLAY
;图形显示
;---------------------------
GRAPHIC_A:
MOV G_ROW, #80H ;定义列
MOV G_COLUMN, #80H ;定义行
MOV DPTR, #GRAPHICTAB ;设定图形显示数据区地址
LCALL GRAPHIC_DISP ;调用图形显示子程序
LCALL DELAY
LCALL DELAY
LCALL DELAY
MOV G_ROW, #80H
MOV G_COLUMN, #80H
MOV DPTR, #GRAPHICTAB2
LCALL GRAPHIC_DISP
LCALL DELAY
LCALL DELAY
LCALL DELAY
;-----------------**************
QIU: LJMP QIU1
;-----------------
;汉字显示子程序
;---------------
WORD_DISP:
MOV R1,WORD_WID
WORD10: LCALL DEADD ;调用调整地址单元子程序
MOV A, START_ADD ;设定DDRAM地址,显示位置地址
LCALL INPUT
WORD11: CLR A ;因为要连续输入机内码高位(区码)、低位(位码)
MOVC A, @A+DPTR ;所以要输入两次数据,如果是字符就是输入两个字符字符代码可以看说明书
LCALL DISPL ;DATA INPUT
INC DPTR ;显示地址会自动加一,如果连续写就不用再输入地址,空白可用某空白汉字或字符代替
CLR A
MOVC A, @A+DPTR
LCALL DISPL ;DATA INPUT
; LCALL DELAY01
INC DPTR
DJNZ R1,WORD11
MOV R1,WORD_WID ;调整显示长度
INC FIRST_LIN ;跳到下一行
DJNZ WORD_LIN,WORD10
RET
;-------------------
;图形显示子程序
;该子程序可简化为一个函数调用
;-----------------
GRAPHIC_DISP:
LCALL CLEAR_GRAPHIC ;清除图形显示RAM单元(GDRAM)
MOV G_ROW, #80H ;设定图形显示起始行单元
MOV G_COLUMN, #80H ;设定图形显示起始列单元
GRA_DISP:
MOV A, #34H ;选择扩充指令集关闭图形显示
;该指令在扩充指令集
LCALL INPUT
LCALL DELAY01
MOV A, G_COLUMN ;输入图形显示起始地址
LCALL INPUT
MOV A, G_ROW
LCALL INPUT
MOV A, #30H ;重新选择基本指令集
LCALL INPUT
CLR A ;输入显示数据(横向高8位数据)
MOVC A, @A+DPTR
LCALL DISPL
INC DPTR
CLR A ;输入显示数据(横向低8位数据)
MOVC A, @A+DPTR
LCALL DISPL
INC DPTR
INC G_ROW ;列地址加一
MOV A, G_ROW
CJNE A, #88H, GRA_DISP ;最后一列地址为88H
MOV G_ROW, #80H
INC G_COLUMN ;行地址加一
MOV A, G_COLUMN
CJNE A, #0A0H, GRA_DISP ;最后行地址为0A0H
MOV A, #36H ;打开图形显示
LCALL INPUT ;
LCALL DELAY01
RET
INITIL: LCALL DELAY ;延时
;首先选择基本指令集
MOV A, #30H ;30---基本指令操作
LCALL INPUT
LCALL DELAY01
MOV A, #01H ;指令#01H为:清除屏幕文字,把地址指针指向00H单元
LCALL INPUT ;
LCALL DELAY01
MOV A, #06H ;指定在资料写入或读取时,设定游标的移动方向及指定显示的移位
LCALL INPUT
LCALL DELAY01
RET
;-----------------
;SEARCH ADDRESS
;目的是为了转换地址单元为DDRAM地址单元,以方便
;定义显示位置
;汉字显示DDRAM位置为:第一行:80H----87H
; 第二行:90H----97H
;-----------------
DEADD: PUSH DPH ;地址转换子程序
PUSH DPL
PUSH A
MOV DPTR,#LINE_ADD ;LINE-ADD为地址表指针
MOV A,FIRST_LIN
MOVC A,@A+DPTR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -