#include <p16F887.inc>
	__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

;-------------------------------------------------------------------------------

Timer1          equ     30
Timer2          equ     31
Timer3          equ     32
Counter		equ	33
Pointer		equ	34


Sec		equ	35              ; átmeneti regiszterek
Min		equ	36
Hour		equ	37
Day_of_week	equ	38
Day		equ	39
Month		equ	3A
Year		equ	3B


Slave           equ     B'01100100'     ; óra modul slave címe

; PORTC kivezetések

SCL             equ     3               ; RC3, I2C soros órajel
SDA             equ     4               ; RC4, I2C be/kimeneti adat

; PORTE kivezetesek


RS              equ     0               ; 0= utasitas, 1= adat reg. valasztas
RdWr		equ	1		; R/W=0 LCD iras, R/W=1 LCD memoria olvasas
E               equ     2               ; 0= LCD tiltás, 1= engedelyezes

                org     0


;===============================================================================

;START

		clrf    PORTD
                clrf    PORTE		; Port beallitas PORT E,D,B output
                clrf    PORTB

		bsf 	STATUS,RP1
		bsf 	STATUS,RP0 	; ez a bank 3 kiv laszt s

		clrf 	ANSEL 		; ANS0 - 7-ig Digit lis be llˇt s
		bcf 	STATUS,RP1	
		bsf	STATUS,RP0	; bank1 kiválasztás

		movlw   0x07
	     	movwf   TRISA         	; RA0, RA1, RA2 bemenet (SW1,SW2)
		movlw   0x00
    		movwf   ANSELH        	; PortA digitialis beallitas
 
		clrf	TRISD		; PORTB kimenet
		clrf	TRISE		; PORTE kimenet

		movlw	0xFF
		movwf	TRISC		; PORTC bemenet

		bcf	STATUS,RP0	; bank0 kiválasztás

;------------------------------------------------------------------------------
; Az I2C port konfigurálása
;
		clrf	PIE1		; a periféria megszakítások tiltása 
		clrf	INTCON		;
		movlw	0x80 
		movwf	SSPSTAT		; slew rate vezérlés tiltva
		movlw	0x31		; SSPADD=49  0x31
		movwf	SSPADD
		bcf	STATUS,RP0	; bank0 kiválasztás
		clrf	PORTD
		movlw	B'00101000'	; SSPEN=1, soros port engedélyezés
		movwf	SSPCON		; I2C master, Fosc/(4*(SSPADD+1))
		clrf	PIR1

;-------------------------------------------------------------------------------
; LCD kijelzo inicializalasa 

	        bcf	PORTE,RS	; LCD parancs kovetkezik
		movlw   38h             ; 00111000 8bit, 2line, 5x8
                call    Write
                call    Kesl		; Busy flag olvasasat "helyettesiti"
               
		movlw   06h             ; 00000110 increment l s, scroll ki
                call    Write
                movlw   0ch             ; 00001100, Display on, cursor/blink off
                call    Write
                movlw   01h             ; 00000001, Display clear
                call    Write
                call    Kesl2		; Busy flag olvasását "helyettesiti"

;-------------------------------------------------------------------------------
; Adatkuldes LCD-re

;-------------------------------------------------------------------------------

		bsf	PORTE,RS	; LCD adat kovetkezik
;-------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; ÓRA MODUL írás
;

Clock_Write	bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,SEN	; start bit
		bcf	STATUS,RP0	; bank0 kiválasztás

		call	Wait
		movlw	Slave		; W= slave + R/W (=0)
		movwf	SSPBUF
		call	Wait
		movlw	0xF0		; kezdőcím= 0Fh, átv. formátum reg.= 0
		movwf	SSPBUF
		call	Wait
		movlw	0x20		; CONTROL2 regiszter írás, 24 órás üzemmód
		movwf	SSPBUF
		call	Wait
		movlw	0x00		; SEC regiszter írás
		movwf	SSPBUF
		call	Wait
		movlw	0x00		; MIN regiszter írás
		movwf	SSPBUF
		call	Wait
		movlw	0x00		; HOUR regiszter írás
		movwf	SSPBUF
		call	Wait
		movlw	0x00		; DAY OF WEEK regiszter írás (=vasárnap !)
		movwf	SSPBUF
		call	Wait
		movlw	0x01		; DAY regiszter írás
		movwf	SSPBUF
		call	Wait
		movlw	0x01		; MONTH regiszter írás
		movwf	SSPBUF
		call	Wait
		movlw	0x08		; YEAR regiszter írás (2001)
		movwf	SSPBUF
		call	Wait
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,PEN	; stop bit
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		call	Delay		; várakozás az írás végére (kb. 10ms)
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; ÓRA MODUL olvasás
;




Clock_Read	

		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,SEN	; start bit
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		movlw	Slave		; W= slave + R/W (=0)
		movwf	SSPBUF
		call	Wait
		movlw	0x00		; SEC regiszter címe
		movwf	SSPBUF
		call	Wait

;------------------------------------------------------------------------------
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,RSEN	; ismételt start bit !!!
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		movlw	Slave
		addlw	1		; W= slave + R/W (=1), olvasás !
		movwf	SSPBUF
		call	Wait

;------------------------------------------------------------------------------
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,RCEN	; vétel engedélyezés
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		movf	SSPBUF,0
		movwf	Sec		; vett adat másolása SEC regiszterbe
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,ACKEN	; acknowledge bit generálás
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,RCEN	; vétel ismételt engedélyezése
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		movf	SSPBUF,0
		movwf	Min		; vett adat másolása MIN regiszterbe
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,ACKEN	; acknowledge bit generálás
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,RCEN	; vétel ismételt engedélyezése
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		movf	SSPBUF,0
		movwf	Hour		; vett adat másolása HOUR regiszterbe
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,ACKEN	; acknowledge bit generálás
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,RCEN	; vétel ismételt engedélyezése
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		movf	SSPBUF,0
		movwf	Day_of_week	; vett adat másolása DAY OF WEEK regiszterbe
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,ACKEN	; acknowledge bit generálás
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,RCEN	; vétel ismételt engedélyezése
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		movf	SSPBUF,0
		movwf	Day		; vett adat másolása DAY regiszterbe
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,ACKEN	; acknowledge bit generálás
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,RCEN	; vétel ismételt engedélyezése
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		movf	SSPBUF,0
		movwf	Month		; vett adat másolása MONTH regiszterbe
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,ACKEN	; acknowledge bit generálás
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,RCEN	; vétel ismételt engedélyezése
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
		movf	SSPBUF,0
		movwf	Year		; vett adat másolása YEAR regiszterbe
		bsf	STATUS,RP0	; bank1 kiválasztás
		bsf	SSPCON2,PEN	; stop bit
		bcf	STATUS,RP0	; bank0 kiválasztás
		call	Wait
;------------------------------------------------------------------------------


		call Sor2

		movlw   ' '
		call    Write
		movlw   ' '
		call    Write
		movlw   '2'
		call    Write
		movlw   '0'

		call    Write
		swapf	Year,0
		andlw	0x0F
		addlw	0x30

                call    Write		; év tizesek kiiratása
		movf	Year,0
		andlw	0x0F
		addlw	0x30


                call    Write		; év egyesek kiiratása
		movlw	'.'
                call    Write
		swapf	Month,0
		andlw	0x0F
		addlw	0x30
                call    Write		; hónap tizesek kiiratása
		movf	Month,0
		andlw	0x0F
		addlw	0x30
                call    Write		; hónap egyesek kiiratása
		movlw	'.'
                call    Write
		swapf	Day,0
		andlw	0x0F
		addlw	0x30
                call    Write		; nap tizesek kiiratása
		movf	Day,0
		andlw	0x0F
		addlw	0x30
                call    Write		; nap egyesek kiiratása
		movlw	'.'
                call    Write


		Call Sor1
		movlw   ' '
		call    Write
		movlw   ' '
		call    Write
		movlw   ' '
		call    Write
		swapf	Hour,0
		andlw	0x0F
		addlw	0x30
                call    Write		; óra tizesek kiiratása
		movf	Hour,0
		andlw	0x0F
		addlw	0x30
                call    Write		; óra egyesek kiiratása
		movlw	':'
                call    Write
		swapf	Min,0
		andlw	0x0F
		addlw	0x30
                call    Write		; perc tizesek kiiratása
		movf	Min,0
		andlw	0x0F
		addlw	0x30
                call    Write		; perc egyesek kiiratása
		movlw	':'
                call    Write
		swapf	Sec,0
		andlw	0x0F
		addlw	0x30
                call    Write		; másodperc tizesek kiiratása
		movf	Sec,0
		andlw	0x0F
		addlw	0x30
                call    Write		; másodperc egyesek kiiratása
		call	Delay05

		goto	Clock_Read


;===============================================================================

;Rutinok


;------------------------------------------------------------------------------
Wait	
		btfss	PIR1,SSPIF	; SSPIF megszakitas flagre var
		goto	Wait
		bcf	PIR1,SSPIF	; SSPIF flag torlese

	        return

;------------------------------------------------------------------------------
Delay           movlw   0x0A		; kb. 10ms késleltetés
                movwf   Timer2		
Delay1          decfsz  Timer1,1
                goto    Delay1
                decfsz  Timer2,1
                goto    Delay1
                return

;-------------------------------------------------------------------------------

Write           
		movwf   PORTD
		bsf     PORTE,E
                call    Kesl100		; Busy flag olvasasat "helyettesiti"
                bcf     PORTE,E
                return

;-------------------------------------------------------------------------------

Sor1
	        bcf	PORTE,RS	; LCD parancs kovetkezik

                movlw   0xC1            ; 2. sor (2. karakter)

        	call    Write
                call    Kesl		; Busy flag olvasasat "helyettesiti"
		bsf	PORTE,RS	; LCD adat kovetkezik

		return
;-------------------------------------------------------------------------------
Sor2
	        bcf	PORTE,RS	; LCD parancs kovetkezik

		movlw   0x81            ; 1. sor (2. karakter)

        	call    Write
                call    Kesl		; Busy flag olvasasat "helyettesiti"
		bsf	PORTE,RS	; LCD adat kovetkezik

		return


;-------------------------------------------------------------------------------
Kesl100         movlw   0xA5		; 100us kesleltetes
                movwf   Timer1
Kesl1		decfsz  Timer1,1
                goto    Kesl1
                return
;-------------------------------------------------------------------------------
Kesl2           clrf    Timer1		; 2ms kesleltetes
                movlw	0x30
		movwf   Timer2
Kesl21          call	Kesl100
                decfsz  Timer2,1
                goto    Kesl21
                return

;-------------------------------------------------------------------------------
Kesl		call	Kesl2
                call    Kesl2
                call    Kesl2
                call    Kesl2
                call    Kesl2
		return			; 5x2ms kesleltetes

;-------------------------------------------------------------------------------
Delay05		movlw	0x1A		; kb. 0,1 mp késleltetés
		movwf   Timer3
Del31           call	Delay
                decfsz  Timer3,1
                goto    Del31
                return

;-------------------------------------------------------------------------------

end