;**********************************
;	LCD.INC
;
;          LCD Rutinok
;
;          Csikos Zoltan
;
;**********************************
;
;szükséges include a főprogramban :
;
;		#include "Lcd.inc"

;;-------------------------------------------------------------------------------
;
;                          LCD UTASÍTÁSOK
;-------------------------------------------------------------------------------
;              LCD kijelző kivezetései
;   RS   R/W  DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0   Funkció  (végrehajtási idő)
;-------------------------------------------------------------------------------
;    0    0   0   0   0   0   0   0   0   1     Display clear        (1,6ms)
;    0    0   0   0   0   0   0   0   1   x     Display, cursor home (1,6ms)
;    0    0   0   0   0   0   0   1  I/D  S     Entry mode set       (40us)
;    0    0   0   0   0   0   1   D   C   B     Display ON/OFF       (40us)
;    0    0   0   0   0   1  S/C R/L  x   x     Display/Cursor shift (40us)
;    0    0   0   0   1   DL  N   x   x   x     Function set         (40us)
;    0    0   0   1   ------ CG ADDR ------     CG RAM address set   (40us)
;    0    0   1   ------- DD ADDR ---------     DD RAM address set   (40us)
;    1    0   --------- Write data --------     CG/DD RAM data write (40us)
;-------------------------------------------------------------------------------
;    0    1   BF  ----- Address counter ---     Busy flag/Addr cnt read (0)
;    1    1   ---------- Read data --------     CG/DD RAM data read  (40us)
;-------------------------------------------------------------------------------
;
;	I/D=1 inkrementálás, I/D=0 dekrementálás
;	S=1 display léptetés, S=0 display "rögzített"
;    	D=1 display on, D=0 display off
;    	C=1 kurzor on, C=0 kurzor off
;    	B=1 karakter a kurzor helyén villog, B=0 nem villog
;    	S/C=1 display léptetés, S/C=0 kurzor mozog
;    	R/L=1 léptetés jobbra, R/L=0 léptetés balra
;    	DL=1 8 bites, DL=0 4 bites interfész
;    	N=1 két soros, N=0 egy soros üzemmód
;    	CG ADDR : karakter generátor RAM cím
;    	DD ADDR : display adat RAM cím
;
;-------------------------------------------------------------------------------
	cblock	0x76
	LOOPcnt
	LOcnt
	LCD_temp
	LCDbuf
	TMP0
	LCDtemp
	DelayTMP1
	DelayTMP2

	endc

LCDport	equ 	PORTD		;LCD a PORTD - n (4 adatvonal RD4-RD7)
	constant	LCD_LINE0 = 0x00	; LCD Line Address
	constant	LCD_LINE1 = 0x40	; LCD Line Address
	constant	LCD_LINE2 = 0x14	; LCD Line Address
	constant	LCD_LINE3 = 0x54	; LCD Line Address

	constant	RS	 = 2	; RS linija RD2
	constant	RW	 = 1	; R/W linija RD3
	constant	EN	 = 0	; EN linija RD3
;	
;
;
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;	LCD Inicializálás
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
lcd_init:
	
 	movlw	0x30		; 8 bites
 	movwf	LCDport
	call	SendW
				; 4ms szünet
	call	Delay1ms
	call	Delay1ms	
	call	Delay1ms
	call	Delay1ms	
 
	movlw	0x30		; 8 bites
	movwf	LCDport	
	call	SendW
				; 4ms szünet
	call	Delay1ms
	call	Delay1ms	
	call	Delay1ms
	call	Delay1ms	
 
 	movlw	0x30		; 8 bites
	movwf	LCDport
	call	SendW
				; 4ms szünet
	call	Delay1ms
	call	Delay1ms	
	call	Delay1ms
	call	Delay1ms	

 	movlw	0x80		; 0 beirása a DDRAM-ba
 	movwf	LCDport
 	call	SendW
 				; 4ms szünet
	call	Delay1ms
	call	Delay1ms	
	call	Delay1ms
	call	Delay1ms	

 	movlw	0x20		; 4-bit interf
  	movwf	LCDport	
	call	SendW
				; 4ms szünet
	call	Delay1ms
	call	Delay1ms	
	call	Delay1ms
	call	Delay1ms	
	
  	movlw	0x28		; 4-bit interf , 2 lines	
  	call	LCDcomd
				; 4ms szünet
	call	Delay1ms
	call	Delay1ms	
	call	Delay1ms
	call	Delay1ms
		
 	movlw	b'00001100'	; Kijelző bekapcsolás, aláhúzás ki, 
  	call	LCDcomd		; kurzor villgás ki
				; 2ms szünet
	call	Delay1ms
	call	Delay1ms	
	
  	movlw	b'00000001'	; Kijelző törlés
  	call	LCDcomd
				; 2ms szünet
	call	Delay1ms
	call	Delay1ms

	return
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;	[Parancs és adat kiküldés az LCD-re érték a W-ben ]
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------

LCDcomd:	clrf	LCDbuf		; parancs küldés lesz 
	bcf	LCDbuf,RS	; Register select bit kikapcsolás  = 0
	goto	LCDwr

LCDdata:	clrf	LCDbuf		; adat küldés lesz
	bsf	LCDbuf,RS	; Register select bit bekapcsolás  = 1    

LCDwr:
   	movwf	LCDtemp		; W mentése az LCDtemp regiszterbe      
	movfw	LCDport		; Port beolvasas
	andlw	0x00		; maszkolas 
	movwf	LCDport		; 
	movfw	LCDtemp		;		
        	andlw	b'11110000'    	; a felso 4 bit maszkolása
       	iorwf	LCDbuf,w      	; a W-hez hozzáadni az RS értéket
 	iorwf	LCDport,f      	; a felso 4 bit kikuldese a portra

	bsf	LCDport,EN   	; LCD Enable bit bekapcsolás
	nop
	nop
	bcf	LCDport,EN	; LCD Enable bit kikapcsolás
	call	Delay45us

	movfw	LCDport		; Port beolvasas
	andlw	0x00		;
	movwf	LCDport		;
	
       	swapf	LCDtemp,w	; Alsó és felső bitek cseréje     
        	andlw	b'11110000'    	; a felso 4 bit maszkolása    
       	iorwf	LCDbuf,w      	; a W-hez hozzáadni az RS értéket
 	iorwf	LCDport,f      	; az also 4 bit kikuldese a portra

	bsf	LCDport,EN   	; LCD Enable bit bekapcsolás
	nop
	nop
	bcf	LCDport,EN	; LCD Enable bit kikapcsolás
	call	Delay45us
	return

SendW:   				;Ispisuje sadrzaj W registra na LCD

	bsf	LCDport,EN   	; LCD Enable bit bekapcsolás
	nop
	nop
	bcf	LCDport,EN	; LCD Enable bit kikapcsolás
	goto	Delay45us
	return

;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;	Kijelzo törlés
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------

lcdclear:
	movlw	0x01
	call	LCDcomd
	call	Delay1ms
	call	Delay1ms	
	return
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;***********[ Kijelzo alaphelyzetbe ]******************************************
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
lcdhome:
	movlw	0x02
	call	LCDcomd
	call	Delay1ms
	call	Delay1ms		
	return
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;***********[ Kijelzo címének beállítása ]*************************************
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------

lcdsor:
	iorlw 	0x80		; function set
	call	LCDcomd
	return
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;******************************************************************************
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
lcdemode:
	andlw	0x03		; strip upper bits
	iorlw	0x04		; function set
	call	LCDcomd
	return
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;******************************************************************************
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------

lcddmode:
	andlw	0x07		; strip upper bits
	iorlw	0x08		; function set
	call	LCDcomd
	return
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;******************************************************************************
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
lcdscga:
	andlw	0x3f		; strip upper bits
	iorlw	0x40		; function set
	call	LCDcomd
	return

;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;***********[ 20MHz-n 41 usec 4 MHz-n 45 usec késleltetés ]********************
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
Delay45us:
	movlw 	.4 ;* 5	;20MHz * 5
	movwf 	LOOPcnt
Delay10us:
	nop		
	nop 
	nop
	nop	
	nop 
	nop
	nop
	
	decfsz	LOOPcnt,f
	goto	Delay10us
	return

;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------	
;*******************[ 10 msec késleltetés ]***********************************	
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
Delay10ms:	movlw	.9
	movwf	DelayTMP1
	movlw	.9
	movwf	DelayTMP2
	movlw 	.40
	movwf 	LOOPcnt
	call	Delay10us1	
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
dlcor:
	nop
	nop
	nop
	call	Delay100us
	decfsz	DelayTMP2,f
	goto	dlcor
dl10:	call	Delay1ms
	decfsz	DelayTMP1,f
	goto	dl10
	return
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------	
;*******************[ 1 msec késleltetés ]***********************************
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
Delay1ms:	movlw	.9
	movwf	TMP0
	movlw	.21   ;.155	; 20 Mhz = 155 , 4MHz = 21 + 2*NOP
	movwf	LOcnt
	nop
	nop
	nop
	nop
correct:	decfsz	LOcnt,f
	goto	correct
	
d1ms:	call	Delay100us
	decfsz	TMP0,f
	goto	d1ms
	return
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------	
;*******************[ 100 usec késleltetés ]***********************************		
;
Delay100us:
	nop
	nop
	nop
	nop
	nop
	movlw 	(.10 )-1 ;* 5)-1
	movwf 	LOOPcnt
Delay10us1:
	nop		
	nop 
	nop
	nop	
	nop 
	nop
	nop
	
	decfsz	LOOPcnt,f
	goto	Delay10us1
	return

; Példa
;
;	call	lcd_init		; Inicializálás
;
;	movlw	LCD_LINE0	; Első sor
;	call	lcdsor
;	movlw	'H'
;	call	LCDdata
;	movlw	'e'
;	call	LCDdata
;	movlw	'l'
;	call	LCDdata
;	movlw	'l'
;	call	LCDdata
;	movlw	'o'
;	call	LCDdata
;
;	movlw	LCD_LINE1	; Második sor
;	call	lcdsor
;	movlw	'H'
;	call	LCDdata
;	movlw	'e'
;	call	LCDdata
;	movlw	'l'
;	call	LCDdata
;	movlw	'l'
;	call	LCDdata
;	movlw	'o'
;	call	LCDdata


