www.pudn.com > yejingxianshi.rar > 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