首页 > 解决方案 > 无法让 LCD1602 显示器与 ATmega2560 一起使用

问题描述

我一直在尝试将 LCD1602 显示器连接到我的 ATmega2560,但我无法让它工作。以下代码应在 LCD 上显示“Hi”,但它只是将其打开,仅此而已。

主功能:

.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

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

这是用于编写命令的函数

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

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

这是用于写入数据的函数

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

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

这些是我正在使用的延迟功能

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

标签: assemblyarduinoavratmegalcd

解决方案


你开机后的时间可能太快了。按照HD44780 数据表,在向显示控制器发出第一个命令之前必须至少经过 15 毫秒。


推荐阅读