代码是照着同学的框架完成的,实现的功能有:水平滚动、垂直滚动
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