Я пытался подключить дисплей 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