You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Proteus项目中字符型LCD无显示问题求助

Proteus中LCD无显示问题排查与解决

我在Proteus中尝试让LCD打印姓名,但LCD完全无显示。试过各种方案和不同原理图都没用,怀疑问题出在Proteus但不确定,求解决办法。

Proteus原理图

LIST P='16F877A'
INCLUDE <P16F877A.INC>
DEGER EQU 0x21
SAYAC1 EQU 0x22
SAYAC2 EQU 0X23
    ORG 0x00
    GOTO START
    ORG 0x04
VERIYAZ
    
    MOVWF DEGER ;
    SWAPF DEGER ,W ;
    ANDLW 0x0F
    MOVWF PORTB
    BSF PORTB,4 ;
    CALL GECIKME ;
    
    MOVF DEGER,W ;
    ANDLW 0x0F
    MOVWF PORTB
    BSF PORTB,4 ;
    CALL GECIKME
    RETURN

KOMUTYAZ
    MOVWF DEGER ; 1101 1010
    SWAPF DEGER,W;1010 1101
    ANDLW 0x0F ;  0000 1111 =0000 1101
    MOVWF PORTB
    BCF PORTB,4 ;
    CALL GECIKME ;
    
    MOVF DEGER,W ;1101 1010
    ANDLW 0x0F   ;0000 1010
    MOVWF PORTB
    BCF PORTB,4 ;
    CALL GECIKME
    RETURN
    
START
    CLRF PORTB
    
    BANKSEL TRISB
    CLRF TRISB
    
    BANKSEL PORTB
    MOVLW 0x03  ;
    CALL KOMUTYAZ ;
    
    MOVLW 0x02;
    CALL KOMUTYAZ ;
    MOVLW 0x28 ;
    CALL KOMUTYAZ ;
    MOVLW 0x01 ;
    CALL KOMUTYAZ ;
    MOVLW 0x06;
    CALL KOMUTYAZ ;
    MOVLW 0x0C ;
    CALL KOMUTYAZ ;
    
    MOVLW 0x80;
    CALL KOMUTYAZ ;
    
    MOVLW 'B'
    CALL VERIYAZ
    MOVLW 'A'
    CALL VERIYAZ
    MOVLW 'T'
    CALL VERIYAZ
    MOVLW 'U'
    CALL VERIYAZ
    MOVLW 'H'
    CALL VERIYAZ

    
    MOVLW 0xC0;
    CALL KOMUTYAZ
    MOVLW 0x06 ;
    CALL KOMUTYAZ
    
    MOVLW 'D'
    CALL VERIYAZ
    MOVLW 'I'
    CALL VERIYAZ
    MOVLW 'L'
    CALL VERIYAZ
    MOVLW 'L'
    CALL VERIYAZ
    MOVLW 'I'
    CALL VERIYAZ
    
GECIKME
    BSF PORTB,5;
    CALL BEKLE
    BCF PORTB,5;
    RETURN
BEKLE
    MOVLW 0x40
    MOVWF SAYAC1;
D1
    MOVLW 0x05
    MOVWF SAYAC2
D2
    DECFSZ SAYAC2
    GOTO D2
    DECFSZ SAYAC1
    GOTO D1
    RETURN
    
    END

问题排查与解决方案

1. 代码逻辑核心问题

  • 初始化顺序错误:你先发送0x03(4位模式初始化指令),接着又发送0x02(切回8位模式),直接导致LCD初始化失败。正确的4位模式初始化流程应为:
    1. 发送0x30(尝试8位模式),重复2-3次
    2. 发送0x20切换到4位模式
    3. 再发送0x28(4位模式、2行显示、5x8点阵)
  • 冗余指令干扰:第二行地址设置后重复发送0x06(光标移动指令),属于无效操作,可能打乱显示时序。
  • 延时长度不足:LCD指令识别需要足够的延时,当前BEKLE函数的延时太短,无法保证指令被正确解析,需延长延时参数。

2. Proteus仿真设置检查

  • LCD模型兼容性:确保使用Proteus自带的LM016L或官方兼容16x2 LCD模型,第三方模型可能存在bug。
  • 电源与对比度:LCD的VDD必须接5V,VSS接地;V0引脚(对比度调节)需通过电位器接0~5V,悬空会导致无显示。
  • 单片机时钟匹配:检查16F877A的时钟配置,确保与代码延时逻辑匹配,时钟错误会导致延时不符合LCD要求。
  • 引脚连接验证:确认PORTB低4位接LCD的D4~D7,PORTB.4接RS,PORTB.5接EN,连接错误直接导致无显示。

修正后的初始化代码示例

START
    CLRF PORTB
    
    BANKSEL TRISB
    CLRF TRISB
    
    BANKSEL PORTB
    ; 正确4位模式初始化流程
    MOVLW 0x30  ; 8位模式尝试
    CALL KOMUTYAZ
    CALL BEKLE_LONG
    MOVLW 0x30
    CALL KOMUTYAZ
    CALL BEKLE_LONG
    MOVLW 0x30
    CALL KOMUTYAZ
    CALL BEKLE_LONG
    MOVLW 0x20  ; 切换到4位模式
    CALL KOMUTYAZ
    CALL BEKLE_LONG
    
    MOVLW 0x28 ; 4位模式、2行、5x8点阵
    CALL KOMUTYAZ
    CALL BEKLE_SHORT
    MOVLW 0x01 ; 清屏
    CALL KOMUTYAZ
    CALL BEKLE_LONG
    MOVLW 0x06 ; 光标自动右移
    CALL KOMUTYAZ
    CALL BEKLE_SHORT
    MOVLW 0x0C ; 开显示、关光标
    CALL KOMUTYAZ
    CALL BEKLE_SHORT
    
    ; 后续显示代码保持不变...
    
BEKLE_LONG ; 长延时
    MOVLW 0xFF
    MOVWF SAYAC1
D1_LONG
    MOVLW 0xFF
    MOVWF SAYAC2
D2_LONG
    DECFSZ SAYAC2
    GOTO D2_LONG
    DECFSZ SAYAC1
    GOTO D1_LONG
    RETURN

BEKLE_SHORT ; 短延时
    MOVLW 0x40
    MOVWF SAYAC1
D1_SHORT
    MOVLW 0x05
    MOVWF SAYAC2
D2_SHORT
    DECFSZ SAYAC2
    GOTO D2_SHORT
    DECFSZ SAYAC1
    GOTO D1_SHORT
    RETURN

3. 额外排查步骤

  • 单独测试LCD:搭建简单测试电路,用Proteus示例代码验证LCD是否正常工作,排除模型问题。
  • 确认程序烧录:确保代码编译无错误,且正确加载到Proteus的单片机模型中。

内容的提问来源于stack exchange,提问作者BatuBey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 14:25:00