1.程序
cpp
; ==================================================================
; LCD1602 驱动 DEMO for Intel 8088 (I/O独立编址方式)
; 端口: 命令端口 80H ,数据端口 81H
; 硬件平台: 8088最小系统 + 74LS138译码 + LCD1602模块
; 功能: 初始化LCD,在第一行显示 "HELLO 8088!" ,第二行显示 "LCD1602 OK"
; 编译: masm lcd_demo.asm; link lcd_demo;
; ==================================================================
CODE SEGMENT
ASSUME CS:CODE, DS:CODE
ORG 100H ; COM文件起始地址
CMD_PORT EQU 80H ; 指令寄存器地址 (RS=0)
DATA_PORT EQU 81H ; 数据寄存器地址 (RS=1)
START:
CALL LCD_INIT ; 初始化LCD1602
; 第一行显示字符串
MOV SI, OFFSET MSG1
CALL LCD_PRINT_STR
; 设置DDRAM地址到第二行首 (0x40 + 0x80 = 0xC0)
MOV AL, 0C0H ; 第二行起始命令
CALL LCD_WR_CMD
; 第二行显示字符串
MOV SI, OFFSET MSG2
CALL LCD_PRINT_STR
FINISH:
HLT ; 停止,或死循环
JMP FINISH
; ========== LCD初始化 (标准4步+功能设置) ==========
LCD_INIT PROC NEAR
CALL DELAY_30MS
MOV AL, 30H ; 8位模式请求1
CALL LCD_WR_CMD
CALL DELAY_5MS
MOV AL, 30H
CALL LCD_WR_CMD
CALL DELAY_1MS
MOV AL, 30H
CALL LCD_WR_CMD
CALL DELAY_2MS
MOV AL, 38H ; 功能设置: 8位数据, 2行, 5x7点阵
CALL LCD_WR_CMD
CALL DELAY_1MS
MOV AL, 08H ; 显示关闭
CALL LCD_WR_CMD
CALL DELAY_1MS
MOV AL, 01H ; 清屏指令
CALL LCD_WR_CMD
CALL DELAY_5MS
MOV AL, 06H ; 输入方式: 地址增量, 无移位
CALL LCD_WR_CMD
CALL DELAY_1MS
MOV AL, 0CH ; 显示开, 无光标, 不闪烁
CALL LCD_WR_CMD
CALL DELAY_1MS
RET
LCD_INIT ENDP
; ========== 写命令 (AL = 命令字节) ==========
LCD_WR_CMD PROC NEAR
PUSH DX
MOV DX, CMD_PORT
OUT DX, AL ; 8088 I/O写周期,WR#自动产生,硬件生成E脉冲
CALL LCD_BUSY_DELAY ; 软件延时 (确保LCD处理)
POP DX
RET
LCD_WR_CMD ENDP
; ========== 写数据 (AL = 数据) ==========
LCD_WR_DATA PROC NEAR
PUSH DX
MOV DX, DATA_PORT
OUT DX, AL
CALL LCD_BUSY_DELAY
POP DX
RET
LCD_WR_DATA ENDP
; ========== 打印以0结尾的字符串 ==========
LCD_PRINT_STR PROC NEAR
PUSH AX
PUSH SI
NEXT_CH:
LODSB
CMP AL, 0
JE STR_END
CALL LCD_WR_DATA
JMP NEXT_CH
STR_END:
POP SI
POP AX
RET
LCD_PRINT_STR ENDP
; ========== 简单延时 (40~80us) 替代忙检测 ==========
LCD_BUSY_DELAY PROC NEAR
PUSH CX
MOV CX, 48 ; 根据CPU频率调整 (保证>37us)
DELAY_LP:
NOP
LOOP DELAY_LP
POP CX
RET
LCD_BUSY_DELAY ENDP
; ---------- 辅助长延时 (ms级) ----------
DELAY_30MS PROC NEAR
PUSH CX
MOV CX, 30000
D30: NOP
LOOP D30
POP CX
RET
DELAY_30MS ENDP
DELAY_5MS PROC NEAR
PUSH CX
MOV CX, 5000
D5M: NOP
LOOP D5M
POP CX
RET
DELAY_5MS ENDP
DELAY_2MS PROC NEAR
PUSH CX
MOV CX, 2000
D2M: NOP
LOOP D2M
POP CX
RET
DELAY_2MS ENDP
DELAY_1MS PROC NEAR
PUSH CX
MOV CX, 1000
D1M: NOP
LOOP D1M
POP CX
RET
DELAY_1MS ENDP
; ========== 显示的字符串 ==========
MSG1 DB 'HELLO 8088!', 0
MSG2 DB 'LCD1602 OK', 0
CODE ENDS
END START
时序匹配 & 硬件调试指南
✧ LCD1602 时序要求
- E高脉冲宽度 ≥ 450ns
- 数据建立时间 ≥ 100ns
- 保持时间 ≥ 10ns
✧ 8088 I/O写周期
- 时钟4.77MHz下, T = 210ns
- OUT指令产生约3~4个时钟周期的WR#低电平,宽度约600ns~800ns → 满足E脉冲宽度
- 软件延时增加额外稳定时间
🔧 常见问题快速修复
• 无显示 -> 检查LCD对比度调节电位器 (VO脚) 及VCC/GND.
• 显示方块 -> 初始化时序不正确,降低CPU频率或增加延时.
• 地址冲突 -> 确保74LS138使能G1接IO/M#高电平有效,G2A/G2B接地.
• 数据线高4位没接 -> 必须全连接DB0-DB7,本设计为8位模式.
⚙️ 另外提供简易硬件连接清单:
-
8088 的AD0~AD7 → 74LS373输入 (锁存地址) + 74LS245 (数据收发) → LCD DB0-DB7.
-
74LS138 输入 A7, A6, A5 分别接8088地址总线高三位,Y0接CS_IC6,Y1接CS_IC5。
-
将 A0 直接作为RS的参考,但最终由片选参与选择。实现端口80H(RS=0)和81H(RS=1)。
-
RW引脚接GND(只写),E信号由WR#与片选经过与非门产生正脉冲,简化设计。