8088汇编测试程序 (MASM/TASM) — 显示 “HELLO 8088!“ + “LCD1602 OK“

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位模式.

⚙️ 另外提供简易硬件连接清单:

  1. 8088 的AD0~AD7 → 74LS373输入 (锁存地址) + 74LS245 (数据收发) → LCD DB0-DB7.

  2. 74LS138 输入 A7, A6, A5 分别接8088地址总线高三位,Y0接CS_IC6,Y1接CS_IC5。

  3. 将 A0 直接作为RS的参考,但最终由片选参与选择。实现端口80H(RS=0)和81H(RS=1)。

  4. RW引脚接GND(只写),E信号由WR#与片选经过与非门产生正脉冲,简化设计。

相关推荐
AOI小白新手上路16 小时前
韦东山 01_ARM架构与编程_2-1_处理器的区分MCU_MPU_AP_内容总结
嵌入式硬件
ysu_031416 小时前
TinyML 模型部署:从 Edge Impulse 到 STM32F103
驱动开发·stm32·嵌入式硬件·mcu·硬件架构·硬件工程·dsp开发
zjxtxdy18 小时前
SPI通信协议
笔记·单片机
恒锐丰科技林技术员21 小时前
EG1196S:高压宽输入降压 DC‑DC 芯片,电动车工业电源的优选方案
经验分享·嵌入式硬件·硬件工程
>Andre<1 天前
UFS5.0标准中文全译·卷一:范围、术语与架构
android·linux·嵌入式硬件
剑指offer.1 天前
ARM裸机开发-点亮LED灯
linux·服务器·嵌入式硬件
朝发如雪1 天前
快速掌握单片机基础(8)(内存映射与启动寻址方式)(编译工具链与构建流程)(C语言操作寄存器)
单片机
糖糖单片机设计1 天前
基于STM32的电子密码锁设计与实现(矩阵键盘+防拆检测+GSM远程报警)
人工智能·stm32·单片机·嵌入式硬件
cyl12240711 天前
2026年10月嵌入式培训指南:在“AI+嵌入式“爆发前夜,如何选择你的职业跳板?
人工智能·嵌入式硬件
充哥单片机设计1 天前
【STM32开源项目】智能家电控制系统
stm32·单片机·嵌入式硬件·毕业设计·智能家电控制·家电控制