微机原理课程设计——在液晶模块上面实现文字的横向、纵向滚动——代码

代码是照着同学的框架完成的,实现的功能有:水平滚动、垂直滚动

IO_ADDRESS EQU  0298H
;----------------------------------------------------------------------
DATA SEGMENT
    HZ_TAB DW 0CEA2H,0BBFAH,0D4ADH,0C0EDH        
    HZ_ADR DB ?                  ;存放显示行起始端口地址
    MESS            DB  'STRIKE ANY KEY,RETURN TO DOS!',0AH,0DH,'$'
DATA ENDS
;----------------------------------------------------------------------
STACK SEGMENT
    STA DW 100 DUP(?)
    TOP EQU LENGTH STA
STACK ENDS
;----------------------------------------------------------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA
START:
    MOV AX, DATA
    MOV DS, AX
    MOV ES, AX
    MOV AX, STACK
    MOV SS, AX
    MOV SP, TOP
;--------------
    ;8255初始化
    MOV DX,IO_ADDRESS
    ADD DX,3
    MOV AL,80H
    OUT DX,AL                       
    MOV AL,0FFH
    MOV DX,IO_ADDRESS
    OUT DX,AL
;--------------
    MOV DX,OFFSET MESS
    MOV AH,09
    INT 21H                      ;显示提示信息
;--------------
    CALL CLEAR
    CALL FUNCUP
;--------------
    ;主循环
LOOPA:
    ;水平滚动
    MOV CX,2
LOP1:
    CALL HSCROLL_A
    LOOP LOP1 
    ;垂直滚动
    MOV CX,2
LOP2:
    CALL VSCROLL
    LOOP LOP2
    ;检测是否有键按下
    MOV    AH,01
    INT    16H
    JZ    LOOPA
    ;返回
    MOV   AH,4CH
    INT   21H
;====================================================================
;函数名:HSCROLL_A
;功能:对每一行实现水平滚动
;====================================================================
HSCROLL_A PROC NEAR
    PUSH CX
    PUSH BX
    MOV CX,0
    MOV BL, 80H
    JMP NEXT1
AGA1:
    MOV BL, 90H 
    JMP NEXT1
AGA2:
    MOV BL, 88H 
    JMP NEXT1
AGA3:
    MOV BL, 98H 
    JMP NEXT1
    ;延时等待
NEXT1:
    PUSH CX
    MOV CX,07FH
NEXT2:
    CALL DELAY
    LOOP NEXT2
    POP CX

    ;循环2次
    PUSH CX   
    MOV CX,2
NEXT3:
    CALL HSCROLL
    LOOP NEXT3
    POP CX

    INC CX
    CMP CX,1
    JZ AGA1
    CMP CX,2
    JZ AGA2
    CMP CX,3
    JZ AGA3

    POP BX
    POP CX
    RET
HSCROLL_A ENDP
;====================================================================
;函数名:HSCROLL
;功能:在某一行实现水平滚动
;====================================================================
HSCROLL PROC NEAR
    PUSH CX
    PUSH BX
    MOV CX,5
AGAIN: 
    MOV BYTE PTR HZ_ADR, BL 
    ;延时片段 
    PUSH CX
    MOV CX,07FH
BACK2:
    CALL DELAY
    LOOP BACK2
    POP CX
    
    CALL CLEAR              ;LCD 清除          
    CALL LCD_DISP           ;LCD 显示
    INC  BL
    LOOP AGAIN

    POP BX
    POP CX
    RET
HSCROLL ENDP
;====================================================================
;函数名:VSCROLL
;功能:垂直滚动子程序
;====================================================================
VSCROLL PROC NEAR
    PUSH CX
    PUSH DX
    MOV DL, 0

NEXT_ROW:
    MOV CX,0
    MOV BYTE PTR HZ_ADR, 80H 
    ADD BYTE PTR HZ_ADR, DL
    JMP NEX1
BAC1:
    MOV BYTE PTR HZ_ADR, 90H 
    ADD BYTE PTR HZ_ADR, DL
    JMP NEX1
BAC2:
    MOV BYTE PTR HZ_ADR, 88H 
    ADD BYTE PTR HZ_ADR, DL
    JMP NEX1
BAC3:
    MOV BYTE PTR HZ_ADR, 98H 
    ADD BYTE PTR HZ_ADR, DL
    JMP NEX1
NEX1:
    PUSH CX
    MOV CX,07FH
NEX2:
    CALL DELAY
    LOOP NEX2
    POP CX
    CALL CLEAR              ;LCD 清除          
    CALL LCD_DISP           ;LCD 显示

    INC CX
    CMP CX,1
    JZ BAC1
    CMP CX,2
    JZ BAC2
    CMP CX,3
    JZ BAC3
    ;下一列
    INC DL
    CMP DL,5
    JNZ NEXT_ROW
    POP DX
    POP CX
    RET
VSCROLL ENDP
;====================================================================
;函数名:CLEAR
;功能:LCD清零
;====================================================================
CLEAR PROC
                ;设置显示开,DDRAM内容保持不变、光标、闪烁关
                MOV AL,0CH              ;00001100
                MOV DX, IO_ADDRESS
                OUT DX,AL               ;设置CLEAR命令
                CALL CMD_SETUP
                ;清屏指令,DDRAM位址计数器调整为00H
                MOV AL,01H
                MOV DX, IO_ADDRESS
                OUT DX,AL               ;设置CLEAR命令
                CALL CMD_SETUP          ;启动LCD执行命令
                RET
CLEAR ENDP
;====================================================================
;函数名:FUNCUP 
;功能:设置LCD模式
;====================================================================
FUNCUP          PROC
                ;MOV AL, 0fH             ;LCD功能设置命令
                ;OUT DX, AL
                ;CALL CMD_SETUP
                ;      
                ;00110100功能设置指令——扩充指令集动作
                MOV AL, 34H             ;LCD显示状态命令
                OUT DX, AL
                CALL CMD_SETUP
                
                
                RET
FUNCUP           ENDP
;====================================================================
;函数名:LCD_DISP
;功能:显示汉字编码
;====================================================================
LCD_DISP        PROC
                PUSH CX
                PUSH BX
                MOV CX,4
                LEA BX, HZ_TAB
NEXT:
                MOV AL,HZ_ADR
                MOV DX, IO_ADDRESS
                OUT DX, AL
                CALL CMD_SETUP          ;设定DDRAM地址命令
                MOV AX,[BX]
                PUSH AX
                MOV AL,AH               ;先送汉字编码高位
                MOV DX,IO_ADDRESS
                OUT DX,AL
                CALL DATA_SETUP         ;输出汉字编码高字节
                CALL DELAY              ;延迟
                POP AX
                MOV DX,IO_ADDRESS
                OUT DX, AL
                CALL DATA_SETUP         ;输出汉字编码低字节
                CALL DELAY
                INC BX
                INC BX                  ;修改显示内码缓冲区指针
                INC BYTE PTR HZ_ADR     ;修改LCD显示端口地址
                
                LOOP NEXT
                POP BX
                POP CX
 
                RET               
LCD_DISP   ENDP
;====================================================================
;函数名:CMD_SETUP
;功能:写指令
;====================================================================
CMD_SETUP       PROC
                MOV DX,IO_ADDRESS                ;指向8255端口控制端口
                ADD DX,2
                NOP
                MOV AL,00000000B                ;PC1置0,pc0置0 (LCD I端=0,W端=0)
                OUT DX, AL
                CALL DELAY
                NOP
                MOV AL,00000100B                ;PC2置1 (LCD E端=1)
                OUT DX, AL
                NOP
                CALL DELAY
                MOV AL, 00000000B               ;PC2置0,(LCD E端置0)
                OUT DX, AL
                CALL DELAY

                RET
CMD_SETUP       ENDP
;====================================================================
;函数名:DATA_SETUP
;功能:写数据
;====================================================================
DATA_SETUP      PROC
                MOV DX,IO_ADDRESS                ;指向8255控制端口
                ADD DX,2
                MOV AL,00000001B                ;PC1置0,PC0=1 (LCD I端=1)
                OUT DX, AL
                NOP
                CALL DELAY
                MOV AL,00000101B                ;PC2置1 (LCD E端=1)
                OUT DX, AL
                NOP
                CALL DELAY
                MOV AL, 00000001B               ;PC2置0,(LCD E端=0)
                OUT DX, AL
                NOP
                CALL DELAY
                RET
DATA_SETUP      ENDP
;====================================================================
;函数名:DELAY
;功能:延时
;====================================================================
DELAY           PROC
                PUSH CX
                PUSH DX
                MOV CX, 0FFFFh
X1:         
                LOOP  X1
                MOV CX, 0FFFFh
X2:         
                LOOP  X2
                MOV CX, 0FFFFh
X3:         
                LOOP  X3

                POP DX
                POP CX
                RET
DELAY           ENDP
    CODE ENDS
END START
原文地址:https://www.cnblogs.com/YiDongZhao/p/14731814.html