Не удается заставить дисплей LCD1602 работать с ATmega2560 - PullRequest
0 голосов
/ 03 декабря 2018

Я пытался подключить дисплей LCD1602 к своему ATmega2560, но я просто не могу заставить его работать.Следующий код должен отображать «Привет» на ЖК-дисплее, но вместо этого он просто включается и все.

Основная функция:

.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

1 Ответ

0 голосов
/ 09 декабря 2018

Время после включения может быть слишком быстрым.В соответствии с таблицей HD44780 должно пройти не менее 15 мс, прежде чем подать первую команду на контроллер дисплея.

...