.include "m128def.inc"
#define F_CPU 16000000
#define FINIC 0x30
#define FUNKC 0x28
#define CLEAR    1
#define HOME     2
#define ENTRY    6
#define BEKAPCS 15
#define CURKI 0x0C
#define CURJOBBRA 0x24
#define BTOL  0x18

#define EGY   0x80 //LCD 1. sor címe
#define KETTO 0xC0 //LCD 2. sor címe
#define HAROM 0x90 //LCD 3. sor címe
#define NEGY  0xD0 //LCD 4. sor címe

.CSEG
.def tmp = r16
.def tmp2 = r17
.def tmp4 = r18
.def tmp5 = r19
.ORG 0x00
jmp main
.ORG 0x100
;--------------------
; STACK INIT
;--------------------
.macro stack_init
ldi tmp, HIGH(RAMEND)
out SPH, tmp
ldi tmp, LOW(RAMEND)
out SPL, tmp
.endmacro
;==============
delay_ms: // r16-ba a várakozás ms-ei 16 MHz-s mikrokontrolleren
	eor tmp4, tmp4
	ldi tmp5, 20
delay_1_new:
	dec tmp4
	brne delay_1_new
	dec tmp5
	brne delay_1_new
	ldi tmp5, 197
mini_delay:
	dec tmp5
	brne mini_delay
	dec tmp
	brne delay_ms
	ret

delay_us: // r16-ba a várakozás us-ei 16 MHz-s mikrokontrolleren
	ldi tmp5, 3
delay_us_loop:
	dec tmp5
	brne delay_us_loop
	nop
	nop
	dec tmp
	brne delay_us
	ret

e1:
	lds tmp,PINF
	ori tmp, 0b00001000
	sts PORTF, tmp
	ret

e0: 
    lds tmp, PINF
	andi tmp, 0b11110111
	sts PORTF, tmp
	ret

rw1:
	lds tmp,PINF
	ori tmp, 0b00000100
	sts PORTF, tmp
	ret

rw0: 
    lds tmp, PINF
	andi tmp, 0b11111011
	sts PORTF, tmp
	ret

rs1:
	lds tmp,PINF
	ori tmp, 0b00000010
	sts PORTF, tmp
	ret

rs0: 
    lds tmp, PINF
	andi tmp, 0b11111101
	sts PORTF, tmp
	ret

irw:
	rcall rs0
	rcall rw0
	rcall e0
	ret

drw:
	rcall rs1
	rcall rw0
	rcall e0
	ret


wr:
	ldi tmp,3
	rcall delay_ms
	rcall e1
	ldi tmp,3
	rcall delay_us
	rcall e0
	ldi tmp,3
	rcall delay_us
	ret

lcd: // paraméter r16: a bájt, amit ki akarunk írni 4 bites üzemmódban
	push tmp
	in tmp2, PINE
	andi tmp2, 0x0F
	andi tmp, 0xF0
	or tmp2, tmp
	out PORTE, tmp2
	rcall wr
	pop tmp
	in tmp2, PINE
	andi tmp2, 0x0F
	andi tmp, 0x0F
	lsl tmp
	lsl tmp
	lsl tmp
	lsl tmp
	or tmp2, tmp
	out PORTE, tmp2
	rcall wr
	ret

lcd_init_new:
	ldi tmp, 0xF0
	out DDRE, tmp
	ldi tmp, 0x0E
	sts DDRF, tmp
	rcall irw
	in tmp, PINE
	andi tmp, 0x0F
	ldi tmp2, FINIC
	andi tmp2, 0xF0
	or tmp2, tmp
	out PORTE, tmp2
	rcall wr
	rcall wr
	in tmp, PINE
	andi tmp, 0x0F
	ldi tmp2, 0x20 // 4-bites mód
	andi tmp2, 0xF0
	or tmp2, tmp
	out PORTE, tmp2
	rcall wr
	ldi tmp, FUNKC
	rcall lcd
	ldi tmp, CLEAR // CLR
	rcall lcd
	ldi tmp, HOME
	rcall lcd
	ldi tmp, ENTRY
	rcall lcd
	ldi tmp, CURKI
	rcall lcd
	ldi tmp, EGY
	rcall lcd

	ret

;--------------------
; MAIN
;--------------------
main:
	//port_init
	stack_init
	//rcall ledinit
	rcall lcd_init_new
	rcall drw
	ldi tmp, 0b00110000
	rcall lcd
	ldi tmp, 0b00110001
	rcall lcd
	ldi tmp, 0b00110010
	rcall lcd
	ldi tmp, 0b00110011
	rcall lcd
	ldi tmp, 0b00110100
	rcall lcd
loop:
	jmp loop

	
