
	list      p=16F877            
	#include <p16F877.inc>         

Timer1          equ     32
Timer2          equ     33
Timer3		equ	34
Counter		equ	35
Pointer		equ	36
Shift_Cntr	equ	37

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	0x003
		nop
	
		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

	        bcf	PORTE,RS	; LCD parancs következik
		movlw   H'38'           ; 8 bites interfész, 2 sor
                call    Write
                call    Kesl		; Busy flag olvasását "helyettesíti"
                movlw   H'38'
                call    Write
                movlw   6               ; 06h, Entry mode set: increment
                call    Write
                movlw   12              ; 0ch, Display on, 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   208             ; LCD cím= második LCD sor +16
                call    Write
		bsf	PORTE,RS	; LCD adat következik
		movlw	16		; 16 adat kiiratása
		movwf	Counter
		clrf	Pointer
Start1		movf	Pointer,0
		call	LCD_Tabla1
                call    Write
		incf	Pointer,1
		decfsz	Counter,1
		goto	Start1
;-------------------------------------------------------------------------------
; Display léptetés
;
		bcf	PORTE,RS	; LCD parancs
		movlw	16
		movwf	Shift_Cntr
Shift_Loop	movlw	H'18'
                call    Write
		call	Shift_Delay
		decfsz	Shift_Cntr,1
		goto	Shift_Loop
;-------------------------------------------------------------------------------
; Adatküldés LCD-re
;
		bcf	PORTE,RS	; LCD parancs
                movlw   192             ; LCD cím= második LCD sor
                call    Write
		bsf	PORTE,RS	; LCD adat következik
		movlw	16		; 16 adat kiiratása
		movwf	Counter
		clrf	Pointer
Start2		movf	Pointer,0
		call	LCD_Tabla1
                call    Write
		incf	Pointer,1
		decfsz	Counter,1
		goto	Start2
;-------------------------------------------------------------------------------
; Display léptetés
;
		bcf	PORTE,RS	; LCD parancs
		movlw	3
                call    Write
		call    Kesl2
;-------------------------------------------------------------------------------
; Adatküldés LCD-re
;
                movlw   208             ; LCD cím= második LCD sor +16
                call    Write
		bsf	PORTE,RS	; LCD adat következik
		movlw	16		; 16 adat kiiratása
		movwf	Counter
		clrf	Pointer
Start3		movf	Pointer,0
		call	LCD_Tabla2
                call    Write
		incf	Pointer,1
		decfsz	Counter,1
		goto	Start3
;-------------------------------------------------------------------------------
		bcf	PORTE,RS	; LCD parancs
                movlw   144             ; LCD cím= első LCD sor +16
                call    Write
		bsf	PORTE,RS	; LCD adat következik
		movlw	16		; 16 adat kiiratása
		movwf	Counter
		clrf	Pointer
Start4		movf	Pointer,0
		call	LCD_Tabla1
                call    Write
		incf	Pointer,1
		decfsz	Counter,1
		goto	Start4
;-------------------------------------------------------------------------------
; Display léptetés
;
		bcf	PORTE,RS	; LCD parancs
		movlw	16
		movwf	Shift_Cntr
Shift_Loop1	movlw	H'18'
                call    Write
		call	Shift_Delay
		decfsz	Shift_Cntr,1
		goto	Shift_Loop1
;-------------------------------------------------------------------------------
Stop		goto	Stop		; resetre vár
;===============================================================================
;
;
;-------------------------------------------------------------------------------
LCD_Tabla1	addwf	PCL,1
		dt	"FD-1 demo panel "
;-------------------------------------------------------------------------------
LCD_Tabla2	addwf	PCL,1
		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
;-------------------------------------------------------------------------------
Shift_Delay	movlw	10		; kb. 0,5mp késleltetés
		movwf	Timer3
Delay		decfsz	Timer1,1
		goto	Delay
		decfsz	Timer2,1
		goto	Delay
		decfsz	Timer3,1
		goto	Delay
		return			
;-------------------------------------------------------------------------------
                end


