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#与片选经过与非门产生正脉冲,简化设计。

相关推荐
Bryce_Zhou2 小时前
STM32U5A9J-DK 介绍
stm32·单片机·嵌入式硬件
Bryce_Zhou2 小时前
stm32cubex创建freertos
单片机
快乐的划水a2 小时前
单片机仿Linux驱动开发(三)
linux·驱动开发·单片机
lzx186488437022 小时前
锂电池11V升23V 1.2A恒流升压DC-DC转换芯片_AH1102
嵌入式硬件·集成测试·硬件工程·ic
踏着七彩祥云的小丑2 小时前
嵌入式——认识电子元器件——轻触按键开关系列
单片机·嵌入式硬件
Bryce_Zhou3 小时前
stm32U5A9配置USART+DMA
stm32·单片机·嵌入式硬件
踏着七彩祥云的小丑3 小时前
嵌入式——认识电子元器件——三极管系列
单片机·嵌入式硬件
快乐的划水a3 小时前
单片机仿Linux驱动开发(二)
linux·驱动开发·单片机
wearegogog1233 小时前
基于STM32的物联网系统设计
stm32·嵌入式硬件·物联网