;*******************************************************************
;prace s EEPROM
;stisk tlacitek delsi nez 1s se zapise do EEPROM
;*******************************************************************
;*******************************************************************
w	equ	0		;parametr instrukci
f	equ	1		;parametr instrukci
c	equ	0		;bit registru SWR
f0	equ	0x00		;registr neprimeho adresovani
swr	equ	0x03		;adresa SWR registru
fsr	equ	0x04		;registr adresy neprimeho adresovani
porta	equ	0x05		;adresa brany A
trisa	equ	0x85		;pouzijeme neprime adresovani
portb	equ	0x06		;adresa brany B
trisb	equ	0x86		;pouzijeme neprime adresovani
cnt1	equ	0x0C		;definice registru cnt1
cnt2	equ	0x0D		;definice registru cnt2
cnt3	equ	0x0E		;definice registru cnt3
temp1	equ	0x0F		;definice registru temp1
eedata	equ	0x08		;data v EEPROM
eeadr	equ	0x09		;adresa v EEPROM
eecon1	equ	0x08		;ovladani EEPROM banka 1
eecon2	equ	0x09		;ridici registr pro zapis do EEPROM banka 1
;*******************************************************************
#define	bit_z	swr,2		;priznak nuloveho vysledku operace
#define rp0	swr,5		;rp0 prepina banky registru
#define	ee_rd	eecon1,0	;cteni z EEPROM
#define	ee_wr	eecon1,1	;zapis do EEPROM
#define	ee_wren	eecon1,2	;bit povolujici zapis do EEPROM
;*******************************************************************
	list 	p = 16F84
	__config 0x3FF1		;nastaveni konfigurace
;*******************************************************************
	org	0x0000		;adresa zacatku programu
	goto	main		;skoci na zacatek hlavniho programu
;*******************************************************************
;cekaci smycka

cekat	movwf	cnt3		;naplneni registru 3.smycky z regisru W
cekej_a	movlw	d'50'		;naplneni registru W
	movwf	cnt2		;naplneni registru 2.smycky
cekej_b	movlw	d'50'		;naplneni registru W
	movwf	cnt1		;naplneni registru 1.smycky
cekej_c	decfsz	cnt1,f		;odecte od registru 1.smycky 1
	goto	cekej_c		;skoci, je-li registr roven 0
	decfsz	cnt2,f		;odecte od registru 2.smycky 1
	goto	cekej_b		;skoci, je-li registr roven 0
	decfsz	cnt3,f		;odecte od registru 3.smycky 1
	goto	cekej_a		;skoci, je-li registr roven 0

	return			;navrat do hlavniho programu

;*******************************************************************
;prepnuti portu na cteni tlacitek

cteni	movlw	trisa		;naplneni registru W
	movwf	fsr		;presun do registru FSR - neprima adresa
	movlw	B'11111111'	;naplneni registru W - vsechny piny jako vstupy
	movwf	f0		;presun do registru neprimeho adresovani
	movlw	trisb		;naplneni registru W
	movwf	fsr		;presun do registru FSR - neprima adresa
	movlw	B'11111111'	;naplneni registru W - vsechny piny jako vstupy
	movwf	f0		;presun do registru neprimeho adresovani

	return			;navrat

;*******************************************************************
;prepnuti portu na vystup, aktivni rada LED
	
zapis	movlw	trisa		;naplneni registru W				
	movwf	fsr		;presun do registru FSR - neprima adresa
	movlw	B'11111011'	;naplneni registru W - rada LED jako vystup
	movwf	f0		;presun do registru neprimeho adresovani
	movlw	B'11111011'	;naplneni registru - aktivni rada LED
	movwf	porta		;presun do portu A
	movlw	trisb		;naplneni registru W
	movwf	fsr		;presun do registru FSR - neprima adresa
	movlw	B'00000000'	;port b jako vystupy
	movwf	f0		;presun do registru neprimeho adresovani

	return			;navrat

;*******************************************************************
;hlavni program
;test stisknuteho tlacitka pri startu nebo po RESET

main	call	cteni		;prepnuti portu na cteni tlacitek
	movf	portb,w		;nacteni negovaneho stavu portu B
	movwf	temp1		;hodnota z W do registru temp1
	bcf	bit_z		;vynulovani priznaku nuloveho vysledku
	comf	temp1,f		;uschovani negovaneho stavu portu B do registru temp1
	btfsc	bit_z		;je bit z = 0  , bylo stisknuto tlacitko ?
	goto	eecteni		;ne , skok na cteni EEPROM a zobrazeni
;*******************************************************************
;zapis do pameti

	clrf	eeadr		;v EEPROM nastavena adresa 0
smycka	movf	portb,w		;nacteni negovaneho stavu portu B
	movwf	temp1		;hodnota z W do registru temp1
	bcf	bit_z		;vynulovani priznaku nuloveho vysledku
	comf	temp1,f		;uschovani negovaneho stavu portu B do registru temp1
	btfsc	bit_z		;je bit z = 0  , bylo stisknuto tlacitko ?
	goto	smycka		;ne , skok na zacatek smycky

	movf	portb,w		;stav portu B do registru W
	movwf	temp1		;hodnota z W do registru temp1
	call	zapis		;prepnuti portu na vystup, aktivni rada LED
	movf	temp1,w		;hodnota z W do registru temp1
	movwf	portb		;nastaveni hodnoty portu B
	movlw 	0x2F		;delka cekaci smycky do W
	call 	cekat		;cekaci smycka, hodnota v registru W
	call	cteni		;prepnuti portu na cteni tlacitek
	movf	portb,w		;stav portu B do registru W
	bcf	bit_z		;vynulovani priznaku nuloveho vysledku
	subwf	temp1,f		;odecteni W od temp1, pokud jsou stejne je vysledek 0
	btfss	bit_z		;je bit z = 1  , stale stejne tlacitka stisknute ?
	goto	smycka		;ne , skok na zacatek smycky
	movwf	eedata		;ano, pokracovat v zapisu
		
	bsf	rp0		;prepnuti na banku 1	
	bsf	ee_wren		;povolit zapis do EEPROM

	movlw	0x55		;povolovaci sekvence
	movwf	eecon2
	movlw	0xAA
	movwf	eecon2
	bsf	ee_wr		;spustit zapis

zapsano	btfsc	ee_wr		;pockat na konec zapisu
	goto	zapsano		;zapis probehl
	bcf	ee_wren		;zakazat zapis do EEPROM
	bcf	rp0		;prepnuti na banku 0
	btfsc	eeadr,3		;je nastaven bit 3 registru EEADR
	goto	konec		;ano, zapsano 8 bajtu
	incf	eeadr,f		;ne, zvysit o 1 a zpet na zacatek smycky

potvrz	call	zapis		;prepnuti portu na vystup, aktivni rada LED
	clrf	portb		;vynulovani portu B - LED sviti
	movlw	0x0F		;delka cekaci smycky do W
	call	cekat		;cekaci smycka, hodnota v registru W
	call	cteni		;prepnuti portu na cteni tlacitek
	movf	portb,w		;nacteni negovaneho stavu portu B
	movwf	temp1		;hodnota z W do registru temp1
	bcf	bit_z		;vynulovani priznaku nuloveho vysledku
	comf	temp1,f		;uschovani stavu portu B do registru temp1
	btfsc	bit_z		;je bit z = 0  , bylo stisknuto tlacitko ?
	goto	smycka		;ne , skok na dalsi zapis
	goto	potvrz		;ano, tlacitko je stale stisknute

konec	call	zapis		;prepnuti portu na vystup, aktivni rada LED
blik	clrf	portb		;vynulovani portu B - LED sviti
	movlw	0x05		;delka cekaci smycky do W
	call	cekat		;cekaci smycka, hodnota v registru W
	movlw	0xFF		;nastaveni vsech bitu brany B - LED nesviti
	movwf	portb		;nastaveni hodnoty portu B
	movlw	0x05		;delka cekaci smycky do W
	call	cekat		;cekaci smycka, hodnota v registru W
	goto	blik		;zpet na smycku blikat

;**********************************************************************
;cteni EEPROM

eecteni	call	zapis		;prepnuti portu na vystup, aktivni rada LED
znova	clrf	eeadr		;v EEPROM nastavena adresa 0
dalsi	bsf	rp0		;prepnuti na banku 1
	bsf	ee_rd		;spusteni cteni z EEPROM
	bcf	rp0		;prepnuti na banku 0
	movf	eedata,w	;nactene data z EEPROM do registru W
	movwf	portb		;nastaveni hodnoty portu B
	movlw	0x1F		;delka cekaci smycky do W
	call	cekat		;cekaci smycka, hodnota v registru W
	btfsc	eeadr,3		;je nastaven bit 3 registru EEADR
	goto	znova		;ano, precteno 8 bajtu
	incf	eeadr,f		;ne, zvysit o 1 a zpet na adresu v EEPROM
	goto 	dalsi		;skok na zacatek smycky
	end
