⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yejingxianshi.asm

📁 用汇编编写的液晶显示实验代码。效果挺不错的。共享了。适用于8086。
💻 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 + -