m820250812LCDHD44780.asm

;; (C) David Vajda
;; 2025-08-12
;; LCD HD44780 Text Output AVR ATMega8

.include "m8def.inc"

;; Pin 1 - VSS - GND
;; Pin 2 - VDD - +5V Versorgungsspannung, sonst VCC - Voltages Currency Collector - VB - Betriebsspannung
;; Pin 3 - VEE - Kontrastspannung
;; Pin 4 - RS - Register Select: Command/Data
;; Pin 5 - RW - Read Write
;; Pin 6 - E - Enable
;; Pin 7 .. Pin 14: D0 .. D7
;; Pin 15: A Anode
;; Pin 16: K Kathode


;; enable: ja, brauchen wir - Enable bit senden, noop noop noop Bit Clear -> nach jedem befehl
;; Read write brauchen wir nicht
;; RS - machen wir 0, fuer commmands, glaube ich, sonst umdrehen und 1 fuer data
;; D4 .. D7 sind im vier bit modus verwendet, dafuer senden wir init 3, 3, 3, 30, 20, ... oder so

;;

.equ HD44780_ATMEGA8_PORTX_ENABLE = 6
.equ HD44780_ATMEGA8_PORTX_RW = 5
.equ HD44780_ATMEGA8_PORTX_RS = 4
.equ HD44780INIT0 = 0x03
.equ HD44780INIT1 = 0x03
.equ HD44780INIT2 = 0x03
.equ HD44780INIT2 = 0x02
.equ HD44780INIT3 = 0x20
.equ PORTX = PORTD
.equ DDRX = DDRD


ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRX, r16

end: rjmp end

lcdhd44780cmdcomplete:
;;sbi set bits in register aber ports
sbi PORTX, HD44780_ATMEGA8_PORTX_ENABLE
nop
nop
nop
cbi PORTX, HD44780_ATMEGA8_PORTX_ENABLE
ret

lcdh44780init:
rcall delay
ldi r16, HD44780INIT0
rcall lcdhd44780cmdsend
rcall delay
ldi r16, HD44780INIT1
rcall lcdhd44780cmdsend
rcall delay
ldi r16, HD44780INIT2
rcall lcdhd44780cmdsend
rcall delay
ldi r16, HD44780INIT3
rcall lcdhd44780cmdsend
rcall delay
ret

lcdh44780cmdsend:
ldi r16,
;; swap nibbles, CMD/DATA Entsprechend setzen usw.
ret

delay:
push r16
ldi r16, DELAYVAL
delay1:
dec r16
breq delay1
pop r16
et