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

时间:2015-02-28 10:21:04

标签: assembly 8051 lcd

我的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

1 个答案:

答案 0 :(得分:0)

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