; S_lcd.asm Elkészült: 2011.09.23
; Készítette: Kiss László
; Utolsó módosítás: 2011.09.23
; 2*16 karakteres LCD kijelző kezelőprogram
; Ver:1.0
; MCU: 16F887

;-----------------[ SPECIFIKACIOK, KIEGÉSZÍTÉSEK ]------------------ 
; 
;=================[ PROCESSZOR + KONFIGURACIO + INCLUDE ]=========== 
; 
	INCLUDE HEADER.INC

	
	CBLOCK 0X20
	T1
	T2
	T3
	T4
	TEMP
	COUNT
	ENDC
	
#DEFINE	RS		PORTC,4
#DEFINE	EN		PORTC,5

	
	ORG	0X00

	CLRF	PORTC
	CLRF	PORTD
START	
	BSF		STATUS,RP0
	CLRF	TRISC
	CLRF	TRISD
	BCF		STATUS,RP0
	CLRF	TEMP
	CLRF	COUNT
		
;-------------------------------------------------------------------------------
; LCD kijelző inicializálása 
;
	CALL	S_KESLELTET_100MS	;Az LCD éledésére várunk Bekapcsolás után >55 ms.
	BCF		RS
	MOVLW	0X30
	MOVWF	PORTC
	BSF		EN
	NOP
	BCF		EN
	CALL	S_KESLELTET_10MS
	MOVLW	0X30
	MOVWF	PORTC
	BSF		EN
	NOP
	BCF		EN
	CALL	S_KESLELTET_10MS
	MOVLW	0X30
	MOVWF	PORTC
	BSF		EN
	NOP
	BCF		EN
	CALL	S_KESLELTET_10MS
	MOVLW	0x20			; Bekapcsoljuk a 4 bites üzemmódot
	MOVWF	PORTC
	BSF		EN
	NOP
	BCF		EN
	CALL	S_KESLELTET_100MS
	MOVLW	0X28
	CALL	S_WRITE
    MOVLW	0x06			; 06h, beviteli mód incrementális, rögzített display
    CALL	S_WRITE
    MOVLW	0x0C 			; 0Ch, kijelző bekapcs, nem villog, kurzor ki
    CALL	S_WRITE
    MOVLW	0x14 			; 14h, kurzor mozog, léptetés jobbra
    CALL	S_WRITE
    MOVLW	0x01			; 01h, Display clear
    CALL	S_WRITE
    MOVLW	0X80			; LCD cím= 0 (+128), első LCD sor
	CALL	S_WRITE
	CALL	S_SORKIMENET_2
	MOVLW	D'10'
	CALL	S_KESLELTET_X100MS
	BCF		RS
	MOVLW	0X28			; képernyő 2 soros
	CALL	S_WRITE
	MOVLW	D'194'			; 2 sor 3. pozíció
	CALL	S_WRITE
	CLRF	COUNT
	CALL	S_SORKIMENET
	
STOP	GOTO	STOP
		
;-------------------------------------------------------------------------------
; Szubrutinok
;			
;-------------------------------------------------------------------------------
; Adatküldés LCD-re
;
S_SORKIMENET
	BSF		RS			; LCD adat következik	
KIIRAS
	MOVF	COUNT,W
	CALL	S_TABLAZAT_1
	CALL	S_WRITE
	MOVF	COUNT,W
	XORLW	D'11'
	BTFSC	STATUS,Z
	RETURN
	INCF	COUNT,F
	GOTO	KIIRAS
	RETURN

S_SORKIMENET_2
	BSF		RS			; LCD adat következik	
KIIRAS2
	MOVF	COUNT,W
	CALL	S_TABLAZAT_2
	CALL	S_WRITE
	MOVF	COUNT,W
	XORLW	D'15'
	BTFSC	STATUS,Z
	RETURN
	INCF	COUNT,F
	GOTO	KIIRAS2
	RETURN

	
S_WRITE
		MOVWF	TEMP		;Fölső nible küldése először
		MOVLW	0XF0
		ANDWF	PORTC,F
		SWAPF	TEMP,W
		ANDLW	0X0F
		ADDWF	PORTC,F
		BSF		EN
		NOP
		BCF		EN
		MOVLW	0XF0		; Alsó nible következik.
		ANDWF	PORTC,F
		MOVF	TEMP,W
		ANDLW	0X0F
		ADDWF	PORTC,F
		BSF		EN
		NOP
		BCF		EN
		CALL	S_KESLELTET_10MS
		RETURN
		

S_TABLAZAT_2
	ADDWF   PCL, F		; ADATTÁBLA A BITMINTÁNAK
	RETLW   A'('		;1
	RETLW   A'T'		;2
	RETLW   A'E'		;3
	RETLW   A'S'		;4
    RETLW   A'Z'		;5
    RETLW   A'T'		;6
    RETLW   A' '		;7
    RETLW   A'K'		;8
    RETLW   A'E'		;9
    RETLW   A'P'		;10
    RETLW   A'E'		;11
    RETLW   A'R'		;12
    RETLW   A'N'		;13
    RETLW   A'Y'		;14
    RETLW   A'O'		;15
    RETLW   A')'		;16	

S_TABLAZAT_1
	ADDWF   PCL, F		; ADATTÁBLA A BITMINTÁNAK
	RETLW	A'<'
	RETLW	A'-'
	RETLW   A'G'		;1
	RETLW   A'o'		;2
	RETLW   A'r'		;3
	RETLW   A'r'		;4
    RETLW   A'o'		;5
    RETLW   A'd'		;6
    RETLW   A'i'		;7
	RETLW   A'n'		;8
	RETLW	A'-'
	RETLW	A'>'

		INCLUDE	várakozik.inc

		END
	
Az LCD bekötése:	

	Port bitek
		0	DB4
		1	DB5
		2	DB6
		3	DB7
		4	RS
		5	E
		6	NC
		7	NC
4 Bites adatátvitel. A DB0-3 és	az R/W lábak GND-re kötve

;-------------------------------------------------------------------------------
;
;                          LCD UTASÍTÁSOK                           
;-------------------------------------------------------------------------------
;              LCD kijelző kivezetései                                              
;	Vss (-)			1
;	Vcc,Vdd(+)		2	
;	Vee(kontraszt)	3
;	E(enable)		6
;	
;   RS   R/W  DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0   Funkció  (végrehajtási idő)		HEX			DEC
;	 4	  5   14  13  12  11  10  9   8   7
;-------------------------------------------------------------------------------
;    0    0   0   0   0   0   0   0   0   1     Display clear          (1,6ms)	01			1
;    0    0   0   0   0   0   0   0   1   x     Display, cursor home   (1,6ms)  02-03		2-3
;    0    0   0   0   0   0   0   1  I/D  S     Karakter beviteli mód  (40us)	04-07		4-7
;    0    0   0   0   0   0   1   D   C   B     Display ON/OFF         (40us)	08-0F		8-15
;    0    0   0   0   0   1  S/C R/L  x   x     Display/Cursor eltolás (40us)	10-1F		16-31
;    0    0   0   0   1   DL  N   F   x   x     Function set           (40us)	20-3F		32-63
;    0    0   0   1   ------ CG ADDR ------     CG RAM address set     (40us)	40-7F		64-127
;    0    0   1   ------- DD ADDR ---------     DD RAM address set     (40us)	80-FF		128-255
;    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
;	F=1 Karkter font 5*10 					F=0 5*8 két soros kijelzésnél nem kell állítani.
;-------------------------------------------------------------------------------
