;***************************************************************
;						PROGRAM NÉV
;***************************************************************
;Program: PIC16F628A
;
;LÁBKIOSZTÁS
;Lábszám	Port		Funkció
; 1			RA2
; 2			RA3
; 3			RA4
; 4			RA5/MCLR
; 5			VSS 0V
; 6			RB0/INT
; 7			RB1			RS	L=0 parancs 4 láb		
; 8			RB2			R/W	L=0 írás    5
; 9			RB3			Enable H-L
;10			RB4			DB4
;11			RB5			DB5
;12			RB6			DB6
;13			RB7			DB7	
;14			VDD 5V
;15			OSC2
;16			OSC1
;17			RA0
;18			RA1

;***************************************************************
;===============================================================
;PROCESSOR TIPUSMEGADÁSA
;===============================================================
 LIST P=16F628A 
 #INCLUDE "P16F628A.INC" 
;===============================================================
;KONFIGURÁCIÓS SZÓ
;===============================================================
 __CONFIG _XT_OSC&_CP_OFF&_WDT_OFF&_LVP_OFF 
;===============================================================
;BANKHIBAJELZÉS ELNYOMÁSA A FORDÍTÓBAN 
;===============================================================
 errorlevel -302 			
 errorlevel -305 			
;===============================================================
;VÁLTOZÓK DEKLARÁLÁSA
;===============================================================
	CBLOCK 0x20 		
	ADAT
	BITE
	DEC1
	DEC2
	DEC3
	TEMP0
	TEMP1
	TEMP2
	ENDC
;===============================================================
;DEFINÍCIÓK
#DEFINE		LCD_TRIS		TRISB	
#DEFINE		LCD_PORT		PORTB	;4-7 bit
#DEFINE		LCD_EN			PORTB,3	;LCD ENABLE	6
#DEFINE		LCD_RW			PORTB,2	;LCD R/W	5
#DEFINE		LCD_RS			PORTB,1	;LCD RS		4	

;===============================================================
;BEMENETEK


;KIMENETEK

;===============================================================
;MAKRÓK
;===============================================================
;LCD_Szoveg:
;Használat:
;       LCD_Szoveg "Hello", d'5'
;===============================================================
LCD_Szoveg	MACRO	String, Length
            LOCAL   Loop, Table, Finish
	MOVLW	Length
	MOVWF   TEMP2
Loop
	CALL    Table
	CALL    LCD_Txt
	DECFSZ  TEMP2, f
	GOTO    Loop
	GOTO    Finish
Table
	MOVLW   high Table
	MOVWF   PCLATH
	MOVF    TEMP2, w
	SUBLW   Length
	ADDWF   PCL, f
	DT 		String
Finish
        	ENDM
;===============================================================
;===============================================================
;PROGRAM VEKTOR
;===============================================================
	ORG	0 
	GOTO START

;===============================================================
;MEGSZAKÍTÁSI VEKTOR
;===============================================================
	ORG	4               	
;	MOVWF	SAVEW			;Mentések
;	SWAPF	STATUS, W 	
;	CLRF	STATUS		
;	MOVWF	SAVES	
;	MOVF	PCLATH, W
;	MOVWF	SAVEP
;	CLRF	PCLATH	


;	MOVF	SAVEP, W		;Visszaállítás
;	MOVWF	PCLATH
;	SWAPF	SAVES, W	
;	MOVWF	STATUS 
;	SWAPF	SAVEW, F	
;	SWAPF	SAVEW, W

	RETFIE

;===============================================================


;===============================================================
;ALAPBEÁLLÍTÁSOK
;===============================================================
START
	CLRF	PORTA			;komparátor kikapcsolás
	MOVLW	0x07
	MOVWF 	CMCON 		
				
	BANKSEL	TRISA
	MOVLW	B'00000000' 	;1=Bemenet
	MOVWF	TRISA 			;PORT BEÁLLÍTÁSA
	MOVLW	B'00000000' 	;
	MOVWF	TRISB			;PORT BEÁLLÍTÁSA
	BANKSEL	PORTB

	CALL	LCD_Init
	MOVLW	A'T'
	CALL	LCD_Txt
	MOVLW	A'E'
	CALL	LCD_Txt
	MOVLW	A'S'
	CALL	LCD_Txt
	MOVLW	A'Z'
	CALL	LCD_Txt
	MOVLW	A'T'
	CALL	LCD_Txt
	MOVLW	.124
	CALL	lcd_bite_decimal
	LCD_Szoveg " Braun Antal",d'12'
;Parancskódok betöltése
	goto	vege

;--------------------------------------------
;            LCD inicializálás
;--------------------------------------------
LCD_Init
	BCF		LCD_RS          ; Choix des registres LCD
	MOVLW	d'150'          ; 15 ms késleltetés
	CALL   	Delay_100µs
	MOVLW 	b'00110000'     ; Function set
	CALL   	LCD_Nybble
	MOVLW	d'41'           ; 4,1 ms késleltetés
	CALL   	Delay_100µs
	MOVLW	b'00110000'     ; Function set
	CALL   	LCD_Nybble
	MOVLW	d'1'            ; 100 µs késleltetés
	CALL   	Delay_100µs
	MOVLW	b'00110000'     ; Function set
	CALL   	LCD_Nybble
	MOVLW	d'1'            ; 100 µs késleltetés
	CALL   	Delay_100µs
	MOVLW	b'00100000'     ; 4 bites :  -- 0 0 1 0 0 0 0 0
	CALL   	LCD_Nybble
	MOVLW	d'1'            ; 100 µs késleltetés
	CALL   	Delay_100µs
	MOVLW	b'00101000'     ; Fonction  : -- 0 0 1 DL N F X X
	CALL	LCD_Cmd
	MOVLW	b'00001000'     ; Turn off Display -- 0 0 0 0 1 0 0 0
	CALL	LCD_Cmd
	CALL	LCD_Clear       ; Kijelző törlés
	MOVLW	b'00000110'     ; Mode "Entry" : -- 0 0 0 0 0 1 ID S
	CALL	LCD_Cmd
	MOVLW	b'00001100'     ; Display On/Off : -- 0 0 0 0 1 D C B
	CALL	LCD_Cmd
	RETURN

;--------------------------------------------
;            	  LCD Parancs
;--------------------------------------------
LCD_Cmd
	MOVWF   TEMP1         	; W értéke TEMP1-be
LCD_CmdLoop
    CALL    LCD_Busy     	; Az LCD tudja fogadni?
	ANDLW   0x80			; A 7. bit átállítása
	BTFSS   STATUS, Z    	; 
	GOTO    LCD_CmdLoop   	; Ha nem, akkor újra megnézzük.
	BCF     LCD_RS        	;
	BCF     LCD_RW       	; Commande de lecture
	MOVF    TEMP1, w      	; Récupération de W
	CALL   	LCD_Nybble
	SWAPF   TEMP1, w
	CALL   	LCD_Nybble
	RETURN

;--------------------------------------------
;            LCD foglaltság
;--------------------------------------------
LCD_Busy
	BCF		LCD_RS
	BSF		LCD_RW
	BSF		LCD_EN
;	MOVLW	0x0C			; RW,EN H szintre
;	MOVWF	LCD_PORT
	BANKSEL	LCD_TRIS
	MOVLW	0xF0			; Felső 4 bit 1-re állítva (bemenet)
	MOVWF	LCD_TRIS
	BANKSEL	LCD_PORT
	BCF     LCD_EN          ; Lecture des données du LCD
	MOVF    LCD_PORT, W        ; Enregistrement dans W
	ANDLW   0xF0
	MOVWF   TEMP0           ; Stockage des 4 bits
	BTFSS   TEMP0,7			; Megnézzük, hogy végzett-e az LCD
	GOTO    Busy1			; Ha igen akkor tovább megyünk
	MOVLW   d'150'          ; Ha nem akkor várunk 15 ms-ot.
	CALL    Delay_100µs
Busy1
	BSF     LCD_EN          ; Nouvelle lecture
	SWAPF   TEMP0, F        ; Combinaison de l'octet
	BCF     LCD_EN          ; Lecture des données du LCD
	MOVF    LCD_PORT, W
	ANDLW   0xF0
	IORWF   TEMP0, F
	SWAPF   TEMP0, W        ; Placement du résultat dans W
	RETURN

;--------------------------------------------
;            	  LCD Törlés
;--------------------------------------------
LCD_Clear
	MOVLW	0x001
	CALL	LCD_Cmd
	RETURN

;--------------------------------------------
;            	  LCD Adat
;--------------------------------------------

LCD_Nybble
;	MOVLW	0x00
	BANKSEL	LCD_TRIS
; 	MOVWF	LCD_TRIS

;       BSF     STATUS,RP0      ; Sélection du banc 1
    BCF     TRISB,7         ; PORTB(7:4) en sortie
    BCF     TRISB,6
    BCF     TRISB,5
    BCF     TRISB,4
;        BCF     STATUS,RP0      ; sélection du banc 0
	BANKSEL	LCD_PORT
    BCF     LCD_RW          ; Ceci est une commande d'écriture
    BSF     LCD_EN          ; Validation de la commande
   	IORLW   0x0F            ; W <- wwww1111
    ANDWF   LCD_PORT, f        ; écriture des bits a 0 sur le PORTB.
    ANDLW   0xF0            ; W <- wwww0000
    IORWF   LCD_PORT, f        ; écriture des bits a 1 sur le PORTB.
    BCF     LCD_EN          ; Fin de commande et enregistrement par le LCD
    RETURN

;=============================================================================
; LCD_Txt (W)
; Affichage d'un caractere sur le LCD
; Le caractere doit se trouver dans W
; appel des procédures : LCD_Busy et LCD_Nybble
; registres modifiés : TEMP0 (LCD_Busy) et TEMP1
;=============================================================================
LCD_Txt
    movwf   TEMP1           ; Sauvergarde de W
LCD_TxtLoop
    call    LCD_Busy        ; Vérification de la disponibilité du LCD
    andlw   0x80
    btfss   STATUS, Z
    goto    LCD_TxtLoop     ; boucle en cas de module LCD occupé
    bsf     LCD_RS          ; Sélection du registre de données
    bcf     LCD_RW          ; C'est un ordre d'écriture du LCD
    movf    TEMP1, w        ; Récupération de W
    call    LCD_Nybble      ; Envoi des 4 bits MSB
    swapf   TEMP1, w
    call    LCD_Nybble      ; Envoi des 4 bits LSB
    return

;---------------------------------------------------------------
;                         Decimalis kiírás
;---------------------------------------------------------------
lcd_bite_decimal
	CLRF	DEC1
	CLRF	DEC2
	CLRF	DEC3
	MOVWF	BITE
ki100
	MOVLW	.100
	SUBWF	BITE,0
	BTFSS	STATUS,C
	GOTO	kisebb100
	INCF	DEC3
	MOVWF	BITE
	GOTO	ki100
kisebb100
	MOVLW	.10
	SUBWF	BITE,0
	BTFSS	STATUS,C
	GOTO	kisebb10
	INCF	DEC2
	MOVWF	BITE
	GOTO	kisebb100
kisebb10
	MOVF	BITE,0
	MOVWF	DEC1
	MOVLW	B'00110000'
	IORWF	DEC3
	MOVF	DEC3,0
	CALL	LCD_Txt
	MOVLW	B'00110000'
	IORWF	DEC2
	MOVF	DEC2,0
	CALL	LCD_Txt
	MOVLW	B'00110000'
	IORWF	DEC1
	MOVF	DEC1,0
	CALL	LCD_Txt
	RETURN



Delay_100µs
    movwf   TEMP0           ; +1            1 cycle
    MOVLW   .24;	6*(OSC_FREQ)/.1000000   ; +1    1 cycle
    ADDLW   -1              ; +1            1 cycle
    BTFSS   STATUS, Z       ; +1            1 cycle
    GOTO    $ - 2           ; +2            2 cycles
    decfsz  TEMP0, f        ; +1            1 cycle
    goto    $ - 5           ; +2            2 cycles
    return                  ; +1            1 cycle


vege
	GOTO	vege
;===============================================================
;ADAT EEPROMBA
;===============================================================
;     ORG 2100             ; data eeprom values
;     DE 0x51,0x50,0x00,0x00,0x00,0x00
;===============================================================
	END