📄 yejingxianshi.asm
字号:
CWADD1 EQU 08000H ;写指令代码地址(E1)
DWADD1 EQU 08001H ;写显示数据地址(E1)
CRADD1 EQU 08002H ;读状态字地址(E1)
DRADD1 EQU 08003H ;读显示数据地址(E1)
CWADD2 EQU 08004H ;写指令代码地址(E2)
DWADD2 EQU 08005H ;写显示数进地址(E2)
CRADD2 EQU 08006H ;读状态字地址(E2)
DRADD2 EQU 08007H ;读显示数据地址(E2)
PD1 EQU 3DH ;122/2 分成左右两半屏 122x32
DATA SEGMENT
FONT DW 0000H ;Font address
COLUMN DB 0H
PAGE_ DB 0H ;页地址寄存器 D1,DO:页地址
CODE_ DB 0H ;字符代码寄存器
COUNT DB 0H ;计数器
DIR DB 0h
R4 DB 0h
R3 DB 0h
COL2 DB 0h
CTEMP DB 0H
COM DB 0H ;指令寄存器
DAT DB 0H ;数据寄存器
;中文字符库
CCTAB:
DB 000H,004H,0e4H,024H,024H,064H,0b4H,02fH ; 南
DB 024H,0a4H,064H,024H,024H,0e6H,004H,000H
DB 000H,000H,07fH,004H,005H,005H,005H,07fH
DB 005H,005H,005H,025H,044H,03fH,000H,000H
DB 000H,004H,004H,0e4H,024H,024H,025H,026H ; 京
DB 024H,024H,024H,0e4H,006H,004H,000H,000H
DB 000H,020H,010H,019H,00DH,041H,081H,07fH
DB 001H,001H,005H,00dH,038H,010H,000H,000H
DB 000H,080H,060H,0f8H,007H,00aH,028H,028H ; 伟
DB 028H,0ffH,028H,028H,028H,028H,000H,000H
DB 001H,000H,000H,0fFH,000H,001H,001H,001H
DB 001H,0ffH,001H,021H,041H,03fH,000H,000H
DB 008H,008H,089H,0ceH,028H,018H,002H,07aH ; 福
DB 04aH,04aH,04aH,04aH,04aH,07aH,002H,000H
DB 002H,001H,000H,0ffH,001H,002H,0ffH,049H
DB 049H,049H,07fH,049H,049H,049H,0ffH,000H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
;---------------------------------------
; 初始化程序
INIT PROC NEAR
MOV AH, 0E2H ;复位
CALL PRO
CALL PR3
MOV AH, 0A4H ;关闭休闭状态
CALL PRO
CALL PR3
MOV AH, 0A9H ;设置 1/32占空比
CALL PRO
CALL PR3
MOV AH, 0A0H ;正向排序设置
CALL PRO
CALL PR3
MOV AH, 0C0H ;设置显示起始行为第一行
CALL PRO
CALL PR3
MOV AH, 0AFH ;开显示设置
CALL PRO
CALL PR3
RET
INIT endp
;------------------------------------------------
; 清屏
CLEAR PROC NEAR
MOV R4, 00H ;页面地址暂存器设置
CLEAR1: MOV AL,R4 ;取页地址值
OR AL, 0B8H ;"或"页面地址设置代码
MOV AH,AL ;页面地址设置
CALL PRO
CALL PR3
MOV AH, 00H ;列地址设置为"0"
CALL PRO
CALL PR3
MOV R3, 50H ;一页清 80个字节
CLEAR2: MOV DAT,00H ;显示数据为"0"
CALL PR1
CALL PR4
DEC R3
JNZ CLEAR2 ;页内字节清零循环
INC R4 ;页地址暂存器加一
MOV AL,R4
CMP AL,04H
JNE CLEAR1 ;RAM区清零循环
RET
CLEAR ENDP
;-----------------------------------
;1.写指令代码子程序(E1)
PRO PROC NEAR
MOV DX,CRADD1 ;设置读状态字地址
PR01: IN AL,DX ;读状态字
TEST AL,80H
JNZ PR01 ;判"忙"标志为句"0",否再读
MOV DX,CWADD1 ;设置写指令代码地址
MOV AL,AH ;取指令代码
OUT DX,AL ;写指令代码
RET
PRO ENDP
;------------------------------------
;2.写显示数据子程序(E1)
PR1 PROC NEAR
MOV DX,CRADD1 ;设置读状态字地址
PR11: IN AL,DX ;读状态宇
TEST AL,80h
JNZ PR11 ;判"忙"标志为"0",否再读
MOV DX,DWADD1 ;设置写显示数据地址
MOV AL,DAT ;取数据
OUT DX,AL ;写数据
RET
PR1 endp
;-------------------------------------
;3.读显示数据子程序(E1)
PR2 PROC NEAR
MOV DX,CRADD1 ;设置读状态字地址
PR21: IN AL,DX ;读状态字
TEST AL,80H
JNZ PR21 ;判"忙"标志为"0"否,否再读
MOV DX,DRADD1 ;设置读显示数据地址
IN AL,DX ;读数据
MOV DAT,AL ;存数据
RET
PR2 ENDP
;-------------------------------------
;4.写指令代码子程序(E2)
PR3 PROC NEAR
MOV DX,CRADD2 ;设置读状态字地址
PR31: IN AL,DX ;读状态字
TEST AL,80H
JNZ PR31 ;判"忙"陈志为"0"否,否再读
MOV DX,CWADD2 ;设置写指令代码地址
MOV AL,AH ;取指令代码
OUT DX,AL ;写指令代码
RET
PR3 ENDP
;-------------------------------------
; 5.写显示数据子程序(E2)
PR4 proc near
mov dx,CRADD2 ;设置读状态字地址
PR41: IN al,dx ;读状态字
TEST AL,80H
JNZ PR41 ;判"忙"标志为"0"否,否再读
MOV DX,DWADD2 ;设置写显示数据地址
MOV AL,DAT ;取数据
OUT dx,al ;写数据
RET
PR4 endp
;---------------------------------------
; 6.读显示数据子程序(E2)
PR5 proc near
mov dx,CRADD2 ;设置读状态字地址
PR51: IN al,dx ;读状态字
TEST AL,80H
JNZ PR51 ;判"忙"标志为"0",否再读
mov dx,DRADD2 ;设置写显示数据地址
IN al,dx ;读数据
MOV DAT,AL ;存数据
RET
PR5 endp
;---------------------------------------
; 中文显示子程序
CCW_PR proc near
mov dx,OFFSET CCTAB ;确定字符字模块首地址
MOV AL,CODE_ ;取代码
MOV AH,0
MOV CL,5 ;字模块宽度为 32个字节
SHL AX,CL ;代码×32
ADD AX,DX ;字符字模块首地址
;字模库首地址+代码×32
MOV FONT,AX
MOV AL,COLUMN ;列地址
MOV COL2,AL
MOV CODE_,00H ;代码寄存器借用为间址寄存器
CCW_1: MOV COUNT,10H ;计数器设置为 16
MOV AL,PAGE_ ;读页地址寄存器
AND AL,03H ;取页地址有效值
OR AL,0B8H ;"或"页地址设置代码
MOV ah,AL ;设置页地址
CALL PRO
CALL PR3
MOV AL,COL2 ;取列地址值
MOV COLUMN,AL
MOV AL,COLUMN ;读列地址寄存器
CMP AL, PD1
JL CCW_2 ;<0为左半屏显示区域(E1)
MOV COLUMN,AL ;≥0为右半屏显示区域(E2)
MOV AL,PAGE_
OR AL,08H ;设置区域标志位。
MOV PAGE_,AL ;"0"为E1,"1"为E2
CCW_2: MOV ah,COLUMN ;设置列地址值
MOV AL,PAGE_ ;判区域标志以确定设置哪个控制器
TEST AL,08H
JZ CCW_3
CALL PR3 ;区域E2
JMP CCW_4
CCW_3: CALL PRO ;区域E1
CCW_4: MOV AL,CODE_ ;取间址寄存器值
mov ah,0
add ax,FONT
mov bx,ax
MOV Al,DS:[bx] ;取汉字字模数据
MOV DAT,Al ;写数据
MOV Al,PAGE_
test al,08h
Jz CCW_5
CALL PR4 ;区域E2
JMP CCW_6
CCW_5: CALL PR1 ;区域E1
CCW_6: INC CODE_ ;间址寄存器加一
INC COLUMN ;列地址寄存器加一
MOV Al,COLUMN ;判列地址是否超出区域范围
cmp al, pd1
CCW_7: Jl CCW_8 ;未超出则继续
MOV Al,PAGE_ ;超出则判是否在区域E2
test al, 08h
Jnz CCW_8 ;在区域E2则退出
or Al,08h ;在区域E1则修改成区域E2
MOV PAGE_,Al
MOV ah,00H ;设置区域E2列地址为"0"
CALL PR3
CCW_8: dec count
JNZ CCW_4 ;当页循环
MOV Al,PAGE_ ;读页地址寄存器
test al,80h
Jnz CCW_9 ;判完成标志D7位,"1"则完成退出
INC Al ;否则页地址加一
or al,80h ;置完成位为"1"
and al,0f7h
MOV PAGE_,Al
MOV CODE_,10H ;间址寄存器设置为 16
JMP CCW_1 ;大循环
CCW_9: RET
CCW_PR endp
;------------------------------------.
; 中文演示显示程序段
MAIN proc near
mov ax, data
mov ds, ax
CALL INIT
CALL CLEAR
MOV CTEMP,0
MOV DIR,0
AAA:
MOV PAGE_,02H
MOV AL,CTEMP
MOV COLUMN,AL
MOV CODE_,00H
CALL CCW_PR
MOV PAGE_,02H
MOV Al,CTEMP
ADD Al,10H
MOV COLUMN,Al
MOV CODE_,01H
CAll CCW_PR
MOV PAGE_,02H
MOV Al,CTEMP
ADD Al,20H
MOV COLUMN,Al
MOV CODE_,02H
CAll CCW_PR
MOV PAGE_,02H
MOV AL,CTEMP
ADD AL,30H
MOV COLUMN,AL
MOV CODE_,03H
CALL CCW_PR
JMP $
MAIN ENDP
DELAY PROC NEAR
MOV R4,060H ;延时子程序
MOV R3,00H
DELAY1: NOP
DEC R3
JNZ DELAY1
DEC R4
JNZ DELAY1
RET
DELAY ENDP
CODE ENDS
END main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -