list	P=16F84, R=DEC
include	"p16f84.inc"

RAM		equ	0Ch	; první adresa paměti RAM pro PIC16F84 - 68bajtů (0C-2F)
TMP_W		equ	RAM+1	; temp preruseni
TMP_S		equ	RAM+2	; temp preruseni
TMP_PCL		equ	RAM+3	; temp preruseni


PC_REG		equ	RAM+7	; zapis kontroly spuštěneho pc
CISLO		equ	RAM+8	;
TX_REG		equ	RAM+10	;
RX_REG		equ	RAM+11	;
DELAY		equ	RAM+12	;
CITAC		equ	RAM+13	;


#define	PCON	PORTA,4		; vstup kontroly spuštěného PC
#define	PIN_RX	PORTA,2		; Rx - PRIJEM	or
#define	PIN_TX	PORTA,3		; Tx - vysilani b or

#define	SDA	TRISA,0		;I2C
#define	SCL	TRISA,1		;I2C

#define	OUT0	PORTB,0		; OUT0 nastavení jmena portu 
#define	OUT1	PORTB,1
#define	OUT2	PORTB,2
#define	OUT3	PORTB,3
#define	OUT4	PORTB,4
#define	OUT5	PORTB,5
#define	OUT6	PORTB,6
#define	OUT7	PORTB,7


	org	0x2007		; adresa konfigurace PIC16F84
	dw _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_ON

	org	0x0000		; zacatek programu
	goto	INIT		; skok na počáteční inicializaci

	org	0x0004		; vektor přerušení

	goto	PRERUS

;**************************************************************************
;*                      preruseni kazdych 8,192ms (122Hz)                 *
;**************************************************************************
PRERUS	movwf	TMP_W		; (ulozeni hodnot registru W a STATUS)
	movf	STATUS,W	; prohodi nibble STATUS a ulozi do W
	clrf	STATUS		; nastaveni banky 0
	movwf	TMP_S		; ulozit STATUS

	movf	PCLATH,W
	movwf	TMP_PCL
	clrf	PCLATH		; nastaveni banky 0
;       ------------------------
	bcf	INTCON,T0IF	; vynulovat priznak preruseni (pretekl casovac TMR0)
;-------------------------------





;------------------------------- (obnovení hodnot registru W a STATUS)
INT_END movf	TMP_PCL,W
	movwf	PCLATH		; obnova PCLATH

	movf	TMP_S,W		; prohodi nibble TMP_S a ulozi do W
;	swapf	TMP_S,W		; prohodi nibble TMP_S a ulozi do W
	movwf	STATUS		; obnova STATUS

	swapf	TMP_W,F		; prohodi nibble TMP_W a ulozi do W
	swapf	TMP_W,W		; obnova W
	retfie
;**************************************************************************
INIT	movlw	b'00000'
	movwf	PORTA
	movlw	b'00000000'
	movwf	PORTB
;       ------------------------

	bsf	STATUS,RP0	; banka registru 1
	movlw	b'11111111'	; 
	movwf	TRISB

	movlw	b'11010100'	; PULL-UPy OFF, preddelic=1:32 pripojen k TMR0
	movwf	OPTION_REG	; f:4  :32  :256 = 122,1Hz (8,192ms)
	movlw	b'10111'	; portA4-0, 3*vstupy, 1*vystupy
	movwf	TRISA

	bcf	STATUS,RP0	; banka registru 0
;       ------------------------
;	movlw	b'10100000'	; povolena všechna přerušení a od přetečení TMR0
;	movwf	INTCON

;	bsf	INTCON,TOIE	; 1=povoleno přerušení při přetečení TMR0
;	BCF	INTCON,INTE	; 0=ZAKAZANO přerušení z portu RB0/INT
;	bsf	INTCON,GIE	; 1=povolena všechna nemaskovaná přerušení

	goto	MAIN
;**************************************************************************




MAIN	BTFSS	OUT2	 
	GOTO MAIN	
	call	i2csta
	GOTO MAIN

	BTFSS	OUT3	
	GOTO MAIN	
	call	i2cstp
	GOTO MAIN


;************************************************************
; Podprogram pro START sekvenci
;************************************************************
i2csta	bsf	STATUS,RP0
	bcf	SDA
	nop
	nop
	nop
	bsf	SCL
	bcf	STATUS,RP0
	return
;************************************************************
; Podprogram STOP sekvence
;************************************************************
i2cstp	bsf	STATUS,RP0
	bsf	SCL
	bcf	STATUS,RP0
i2csp1	btfss	SCL		
	goto	i2csp1
	bsf	STATUS,RP0
	bsf	SDA
	bcf	STATUS,RP0
	return
;************************************************************


	end			; konec programu

