首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使LCD1602 display与ATmega2560一起使用

无法使LCD1602 display与ATmega2560一起使用
EN

Stack Overflow用户
提问于 2018-12-03 05:20:12
回答 1查看 64关注 0票数 0

我一直在尝试将LCD1602显示屏连接到我的ATmega2560上,但我就是做不到。下面的代码应该在LCD上显示"Hi“,但它只是将其打开,仅此而已。

主要功能:

代码语言:javascript
复制
.INCLUDE "m2560def.inc"

.EQU    LCD_DPRT = PORTA;
.EQU    LCD_DDDR = DDRA;
.EQU    LCD_DPIN = PINA;
.EQU    LCD_CPRT = PORTB;
.EQU    LCD_CDDR = DDRB;
.EQU    LCD_CPIN = PINB;
.EQU    LCD_RS = 0;
.EQU    LCD_RW = 1;
.EQU    LCD_EN = 2;  

    LDI R21, HIGH(RAMEND)
    OUT SPH,R21
    LDI R21, LOW(RAMEND)
    OUT SPL,R21; set up stack

    LDI R21, 0xFF;
    OUT LCD_DDDR, R21; make LCD data port output
    OUT LCD_CDDR, R21; make LCD command port output;

    CBI LCD_CPRT, LCD_EN; LCD_EN = 0;

    CALL DELAY_2ms; wait for power on

    LDI R16, 0x38; start initializing the matrix
    CALL CMNDWRT; write to the command registers
    CALL DELAY_2ms; wait 2ms

    LDI R16, 0x0E;
    CALL CMNDWRT; 

    LDI R16, 0x01;
    CALL CMNDWRT;

    CALL DELAY_2ms;

    LDI R16, 0x06; shift cursor right
    CALL CMNDWRT;

    LDI R16, 'H';
    CALL DATAWRT;

    LDI R16, 'i';
    CALL DATAWRT;

HERE:
    JMP HERE; stay here

;---------------------------------------------------------------------------------------------------------------------

这是用于编写命令的函数

代码语言:javascript
复制
CMNDWRT:
    OUT LCD_DPRT, R16; send R16 to Data Port
    CBI LCD_CPRT, LCD_RS; make RS pin 0, to enable command sending
    CBI LCD_CPRT, LCD_RW; make pin RW 0,  to enable writing
    SBI LCD_CPRT, LCD_EN; make pin E 1, start of high to low signal
    CALL SDELAY; make a wide pulse
    CBI LCD_CPRT, LCD_EN; clear E bit
    CALL DELAY_100us; wait for the LCD to run the command;
    RET

;---------------------------------------------------------------------------------------------------------------------

这是用于写入数据的函数

代码语言:javascript
复制
DATAWRT:
    OUT LCD_DPRT, R16; send R16 to data port
    SBI LCD_CPRT, LCD_RS; make RS pin 1, to enable data sending
    CBI LCD_CPRT, LCD_RW; make pin RW 0,  to enable writing
    SBI LCD_CPRT, LCD_EN; make pin E 1, start of high to low signal
    CALL SDELAY; make a wide pulse
    CBI LCD_CPRT, LCD_EN; EN = 0, for H-t-L Pulse
    CALL DELAY_100us
    RET

;---------------------------------------------------------------------------------------------------------------------

这些是我正在使用的延迟函数

代码语言:javascript
复制
SDELAY:
    NOP
    NOP
    RET

;---------------------------------------------------------------------------------------------------------------------

DELAY_100us:
    PUSH R17;
    LDI R17, 228; 
AGAIN:
    NOP
    NOP
    NOP
    NOP
    DEC R17
    BRNE AGAIN
    RET

;----------------------------------------------------------------------------------------------------------------------

DELAY_2ms:
    PUSH R17
    LDI R17,20; load the counter
LDR0:
    CALL DELAY_100us
    DEC R17
    BRNE LDR0
    POP R17
    RET
EN

回答 1

Stack Overflow用户

发布于 2018-12-09 17:14:40

开机后的计时可能太快了。在HD44780 datasheet之后,在向显示控制器发出第一个命令之前,必须经过至少15ms。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53584727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档