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小白新手上路4 小时前
江科协51单片机 17-2 红外遥控电机调速实验调试总结
单片机·嵌入式硬件·51单片机
oshan20126 小时前
零基础STM32入门教程--10-PWM 呼吸灯
stm32·单片机·嵌入式硬件
记帖6 小时前
STM32C5A3R开发(7)----ADC电压采集
嵌入式硬件·adc·dac·stm32cubeide·stm32c5·stm32cubemx2·stm32c5a3rgt6
自小吃多9 小时前
器件移动、旋转、镜像、对齐、等间距操作笔记
笔记·嵌入式硬件
jianqiang.xue9 小时前
智能体整体架构设计:四大模块与目录组织
单片机·嵌入式硬件·物联网·架构·esp32
Messy create11 小时前
【BMS-AFE-温度检测】
stm32·单片机·能源
东莞市永盛电气11 小时前
三相208V变380V变压器,出海工业设备供电适配方案
python·单片机·嵌入式硬件
Learn-Share_HY12 小时前
[IT Network]如何配置反向路徑過濾器(rp_filter),以解決路由不對稱問題?
linux·嵌入式硬件·物联网·网络协议·tcp/ip·http·iot
深圳市宝华视联13 小时前
医院内网部署手术示教系统注意事项
嵌入式硬件·实时互动·音视频·实时音视频·视频编解码·嵌入式实时数据库
新晨单片机设计13 小时前
S001A-基于STM32单片机超声波视力保护仪【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus