                                                            *
;    LCD kijelző vezérlő program                                      *
;    ---------------------------                                      *
;    Kétsoros szöveg kiiratása az LCD kijelzőre.                      *
;                                                                     *
;**********************************************************************
;
;
;
	list      p=16F877            
	#include <p16F877.inc>         
	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _LVP_OFF
;-------------------------------------------------------------------------------
;
;                          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
;
;-------------------------------------------------------------------------------
Timer1          equ     32
Timer2          equ     33
Counter		equ	34
Pointer		equ	35
;-------------------------------------------------------------------------------
; PORTE kivezetések
;
RS              equ     0               ; 0= utasítás, 1= adat reg. választás
RdWr		equ	1		; R/W=0 LCD írás, R/W=1 LCD memória olvasás
E               equ     2               ; 0= LCD tiltás, 1= engedélyezés
;-------------------------------------------------------------------------------
;
                org     0
;===============================================================================
; Port beállítás
;
	        clrf    PORTD
                clrf    PORTE
Start		bcf	STATUS,RP1	
		bsf	STATUS,RP0	; bank1 kiválasztás
		movlw	14
		movwf	ADCON1		; RA0 analóg bemenet !!!
		movlw	B'11111111'	; PORTA bemenet
		movwf	TRISA
		clrf	TRISD		; PORTD kimenet
		clrf	TRISE		; PORTE kimenet
		bcf	STATUS,RP0	; bank0 kiválasztás
;-------------------------------------------------------------------------------
; LCD kijelző inicializálása 
;
	        bcf	PORTE,RS	; LCD parancs következik
		movlw   56              ; 38h, 8 bit interface set
                call    Write
                call    Kesl		; Busy flag olvasását "helyettesíti"
                movlw   56
                call    Write
                movlw   6               ; 06h, Entry mode set: increment
                call    Write
                movlw   13              ; 0dh, Display on, cursor/blink off
                call    Write
                movlw   16              ; 10h, Display/cursor shift: cursor
                call    Write
                movlw   1               ; 01h, Display clear
                call    Write
                call    Kesl2		; Busy flag olvasását "helyettesíti"
;-------------------------------------------------------------------------------
; Adatküldés LCD-re
;
                movlw   128             ; LCD cím= 0 (+128), első LCD sor
                call    Write
		bsf	PORTE,RS	; LCD adat következik
		movlw	15		; 15 adat kiiratása
		movwf	Counter
		clrf	Pointer
Start1		movf	Pointer,0
		call	LCD_Tabla
                call    Write
		incf	Pointer,1
		decfsz	Counter,1
		goto	Start1
;-------------------------------------------------------------------------------
		bcf	PORTE,RS	; LCD parancs
                movlw   192             ; LCD cím= 40h (+128), második sor
                call    Write
		bsf	PORTE,RS	; LCD adat következik
		movlw	15		; 15 adat kiiratása
		movwf	Counter
Start2		movf	Pointer,0
		call	LCD_Tabla
                call    Write
		incf	Pointer,1
		decfsz	Counter,1
		goto	Start2
;-------------------------------------------------------------------------------
Stop		goto	Stop		; resetre vár
;===============================================================================
;
;
;-------------------------------------------------------------------------------
LCD_Tabla	addwf	PCL,1
		dt	"FD-1 PROBAPANEL"
		dt	"SZEGO@UMSZKI.HU"
;-------------------------------------------------------------------------------
; LCD írás lépései:
; -----------------
;   1/   RS, R/W beállítása
;   2/   E=1
;   3/   adat kiküldés
;   4/   késleltetés (100us)
;   5/   E=0
;
Write           movwf   PORTD
		bsf     PORTE,E
                call    Kesl100		; Busy flag olvasását "helyettesíti"
                bcf     PORTE,E
                return
;-------------------------------------------------------------------------------
Kesl100         movlw   165		; 100us késleltetés
                movwf   Timer1
Kesl1		decfsz  Timer1,1
                goto    Kesl1
                return
;-------------------------------------------------------------------------------
Kesl2           clrf    Timer1		; 2ms késleltetés
                movlw	20
		movwf   Timer2
Kesl21          call	Kesl100
                decfsz  Timer2,1
                goto    Kesl21
                return
;-------------------------------------------------------------------------------
Kesl		call	Kesl2
                call    Kesl2
                call    Kesl2
                call    Kesl2
                call    Kesl2
		return			; 5x2ms késleltetés
;-------------------------------------------------------------------------------
                end



