初始化 16x2 LCD 后如何用 8051 在 LCD 中显示字符?

Posted

技术标签:

【中文标题】初始化 16x2 LCD 后如何用 8051 在 LCD 中显示字符?【英文标题】:After initializing 16x2 LCD how to display characters in LCD with 8051? 【发布时间】:2015-02-28 10:21:03 【问题描述】:

我的 LCD 接口程序有问题。我知道它很有效,因为它与我的 Arduino Leonardo 配合得很好。我写了一个 8051 汇编程序来连接它。然而,我从 LCD 得到的只是一个闪烁的光标。我读了很多教程。但我还没有找到解决方案。这是我的程序。我正在等待你的帮助。谢谢。

            ORG     0
            ;---------DECLERATIONS---------
EN          EQU     P3.2
RW          EQU     P3.3
RS          EQU     P3.4
BF          EQU     P3.5
DATAP       EQU     P1
CLRDSP      EQU     01H         ;Clear display
RETHM       EQU     02H         ;Return home
LFTSHT      EQU     06H         ;Write to left
DSPCTRL     EQU     0FH         ;Display on, cursor on and blinking
CRSRSFT     EQU     14H         ;Shift cursor
MODE        EQU     38H         ;Two line display, 5x8 chars, 8-bit bus
INITPOS     EQU     80H         ;Set cursor to first position

        SJMP    MAIN
;---------SUBROUTINES---------
SENDCMD:    CLR     RS          ;Select instruction register
        CLR     RW          ;Select write mode
        CLR     EN          ;Prepare for pulse
        MOV     DATAP,A     ;Bring data into data port
        SETB    EN          ;Apply pulse
        CLR     EN
        RET

SENDDATA:   SETB    RS          ;Select data register
        CLR     RW          ;Select write mode
        CLR     EN          ;Prepare for pulse
        MOV     DATAP,A     ;Bring data into data port
        SETB    EN          ;Apply pulse
        CLR     EN
        RET

WAIT:       CLR     RS          ;Select instruction register
        SETB    RW          ;Select read mode
        SETB    BF          ;Set busy flag as input
        CLR     EN          ;Prepare for pulse
        SETB    EN          ;Apply pulse
        CLR     EN
HERE:       JB      BF,HERE     ;Wait for busy flag
        RET

INIT:       CLR     EN

        MOV     A,#MODE
        ACALL   SENDCMD
        ACALL   WAIT

        MOV     A,#DSPCTRL
        ACALL   SENDCMD
        ACALL   WAIT

        MOV     A,#LFTSHT
        ACALL   SENDCMD
        ACALL   WAIT

        MOV     A,#CLRDSP
        ACALL   SENDCMD
        ACALL   WAIT

        MOV     A,#RETHM
        ACALL   SENDCMD
        ACALL   WAIT
        RET

MAIN:       MOV     P1,#0FFH
        MOV     P3,#0FFH

        ACALL   INIT

        MOV     A,#'H'
        ACALL   SENDDATA
        ACALL   WAIT

        MOV     A,#'E'
        ACALL   SENDDATA
        ACALL   WAIT

        MOV     A,#'L'
        ACALL   SENDDATA
        ACALL   WAIT

        MOV     A,#'L'
        ACALL   SENDDATA
        ACALL   WAIT

        MOV     A,#'O'
        ACALL   SENDDATA
        ACALL   WAIT

INFLOOP:    SJMP    $

        END

【问题讨论】:

也许检查有问题的代码***.com/q/14261374/291641 会有所帮助。 确保接线在级别方面是正确的,您实际上在代码中编程了正确的位,您的时序正确。请指定您使用的 LCD 以及指向数据表的链接,并在可能的情况下显示您的电路图。 PS:还要检查您是否在wait 例程中挂断。 感谢您的帮助。我使用的 LCD 是 TC1602B-08(R)。数据表在link 中提供。电路图在这里:link。我的液晶显示器有一个20SPLC780D控制器。它的数据表在这里:link。我仔细检查了接线,并将检查挂断等待程序。 可能是时间问题。开发板的时钟速度和您的电路是否发生了很大变化? 是的,它可能是。也许我也应该延迟尝试,但我没有使用开发板。我的 AT89C4051 的振荡器频率是 12MHz。 【参考方案1】:

感谢您的回答。我刚刚找到了解决方案。在检查了忙碌标志后,我添加了一些延迟。之后它就像一个魅力。

【讨论】:

嗯,您忽略电气问题的可能性不是零。检查输出是否被约 10 千欧电阻上拉。

以上是关于初始化 16x2 LCD 后如何用 8051 在 LCD 中显示字符?的主要内容,如果未能解决你的问题,请参考以下文章

基于8051单片机与1601LCD的计算器设计仿真 程序 论文(转发)

基于8051单片机与1601LCD的计算器设计仿真 程序 论文(转发)

调用重采样后如何用值0填充na()?

资料分享基于8051单片机与1601LCD的计算器设计(仿真 程序 论文)基于51单片机数字电压表的设计(仿真程序原理图论文)

cecos安装好后如何用virt-viewer直接访问啊

django表单提交后如何用弹框提示成功?