;***************************************************************
;*          		    BLIK1-22.ASM	               *
;***************************************************************
;*							       *	
;*     Autor:	BazyPv                                         *
;*       Web:	http://bazypv.webpark.cz                       *
;*    E-mail:	bazypv@seznam.cz                               *
;*   Program:	Bezici svetlo - 3 efekty                       *
;*                                                             *  
;*     Popis:	Ovladani 8LED na portu B + 1tlac. na portu A   *
;*  Procesor:	16F84					       *
;* Nastaveni:	RC, WDT-off        			       *
;*  Zapojeni:                                                  *
;*                         ------\/------                      *
;*                        -|RA2      RA1|-                     *
;*                        -|RA3      RA0|- TLAC(+5V,47k|T,ZEM) *
;*                        -|RA4/RTC.OSC1|- RC(+5V,15k|120p,ZEM)*
;*RESET(+5V,4k7|TLAC,ZEM) -|MCLR    OSC2|-                     *
;*                    ZEM -|VSS      VDD|- +5V                 *
;*         LED(470,k +5V) -|RB0/INT  RB7|- LED(470,k +5V)      *
;*         LED(470,k +5V) -|RB1      RB6|- LED(470,k +5V)      *
;*         LED(470,k +5V) -|RB2      RB5|- LED(470,k +5V)      *
;*         LED(470,k +5V) -|RB3      RB4|- LED(470,k +5V)      *
;*                         --------------                      *
;***************************************************************
	ERRORLEVEL -302
	LIST P=16F84,R=DEC
  	include <p16f84.inc>

	__CONFIG	_CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC


c1 equ h'20'		;premenné pre cykly
c2 equ h'21'
ADDR equ 0x00

	#DEFINE TLAC0 PORTB,0
	#DEFINE TEST1 PORTB,1

        ORG 0

        BSF STATUS,5
        MOVLW B'00000000'   	; Nastavenie portu A  na vystupy
        MOVWF TRISA
        BCF STATUS,5

        BSF STATUS,5
        MOVLW B'00000011'   	; Nastavenie portu B na RB2/7 vystupy a RB0/1 na vsupy
        MOVWF TRISB
        BCF STATUS,5


;inicializace uC
;***************************************************************
START
	CALL CTI_EE
	NOP   ;XXX   		;PO NAVRATU Z CTI_EE JE HODNOTA V W (HODNOTA 1-5)
	ADDWF PCL,F     	;K PLC SE PRICTE HODNOTA ULOZENA V EE (1-5)
	NOP      		;PODLE NI SE UDELA POZADOVANY SKOK NA EFEKTx
	GOTO EFEKT1
	GOTO EFEKT2
	GOTO EFEKT3
	GOTO EFEKT4
	GOTO EFEKT5
;***************************************************************

EFEKT1	MOVLW .1		; efekt1 priradená 1
	MOVWF EEDATA
	MOVLW ADDR
	MOVWF EEADR
	CALL PIS_EE		; hodnota 1 sa zapíše do EE
EFEKT_1	MOVLW B'00001111'	; presuň čísla do W registru
        MOVWF PORTB		; presuň čísla do portu B
	BTFSS TEST1		; testuj tlačidlo TEST1
	CALL TEST		; ak je stlačené(na vstupe log.0) tak vyvolaj podprogram, ak nie(na vstupe log.1) tak preskoč(NOP)
        CALL CAKAJ		; vyvolaj podprogram
	CLRF PORTA		; vynuluj port A
	BTFSS TLAC0		; testuj tlačidlo TLAC0
	GOTO EFEKT_2		; ak je stlačené(log.0) tak preskoč na riadok EFEKT2, ak nie(log.1) tak preskoč

	MOVLW B'11111111'	; presuň čísla do W registru
        MOVWF PORTB		; presuň čísla do portu B
	BTFSS TEST1		; testuj tlačidlo TEST1
	CALL TEST		; ak je stlačené(na vstupe log.0) tak vyvolaj podprogram, ak nie(na vstupe log.1) tak preskoč(NOP)
        CALL CAKAJ		; vyvolaj podprogram
	CLRF PORTA		; vynuluj port A
	BTFSS TLAC0		; testuj tlačidlo TLAC0
	GOTO EFEKT_2		; ak je stlačené(log.0) tak preskoč na riadok EFEKT2, ak nie(log.1) tak preskoč

	MOVLW B'00001111'	; presuň čísla do W registru
        MOVWF PORTB		; presuň čísla do portu B
	BTFSS TEST1		; testuj tlačidlo TEST1
	CALL TEST		; ak je stlačené(na vstupe log.0) tak vyvolaj podprogram, ak nie(na vstupe log.1) tak preskoč(NOP)
        CALL CAKAJ		; vyvolaj podprogram
	CLRF PORTA		; vynuluj port A
	BTFSS TLAC0		; testuj tlačidlo TLAC0
	GOTO EFEKT_2		; ak je stlačené(log.0) tak preskoč na riadok EFEKT2, ak nie(log.1) tak preskoč

	MOVLW B'11111111'	; presuň čísla do W registru
        MOVWF PORTB		; presuň čísla do portu B
	BTFSS TEST1		; testuj tlačidlo TEST1
	CALL TEST		; ak je stlačené(na vstupe log.0) tak vyvolaj podprogram, ak nie(na vstupe log.1) tak preskoč(NOP)
        CALL CAKAJ		; vyvolaj podprogram
	CLRF PORTA		; vynuluj port A
	BTFSS TLAC0		; testuj tlačidlo TLAC0
	GOTO EFEKT_2		; ak je stlačené(log.0) tak preskoč na riadok EFEKT2, ak nie(log.1) tak preskoč

        GOTO EFEKT_1

;***************************************************************

EFEKT2	MOVLW .2		; efekt2 priradená 2
	CALL PIS_EE		; hodnota 2 sa zapíše do EE
EFEKT_2	MOVLW B'10011111'	; presuň čísla do W registru
        MOVWF PORTB		; presuň čísla do portu B
	BTFSS TEST1		; testuj tlačidlo TEST1
	CALL TEST		; ak je stlačené(na vstupe log.0) tak vyvolaj podprogram, ak nie(na vstupe log.1) tak preskoč(NOP)
        CALL CAKAJ		; vyvolaj podprogram
	CLRF PORTA		; vynuluj port A
	BTFSS TLAC0		; testuj tlačidlo TLAC0
	GOTO EFEKT_3		; ak je stlačené(log.0) tak preskoč na riadok EFEKT2, ak nie(log.1) tak preskoč

	MOVLW B'01101111'	; presuň čísla do W registru
        MOVWF PORTB		; presuň čísla do portu B
	BTFSS TEST1		; testuj tlačidlo TEST1
	CALL TEST		; ak je stlačené(na vstupe log.0) tak vyvolaj podprogram, ak nie(na vstupe log.1) tak preskoč(NOP)
        CALL CAKAJ		; vyvolaj podprogram
	CLRF PORTA		; vynuluj port A
	BTFSS TLAC0		; testuj tlačidlo TLAC0
	GOTO EFEKT_3		; ak je stlačené(log.0) tak preskoč na riadok EFEKT2, ak nie(log.1) tak preskoč

	MOVLW B'10011111'	; presuň čísla do W registru
        MOVWF PORTB		; presuň čísla do portu B
	BTFSS TEST1		; testuj tlačidlo TEST1
	CALL TEST		; ak je stlačené(na vstupe log.0) tak vyvolaj podprogram, ak nie(na vstupe log.1) tak preskoč(NOP)
        CALL CAKAJ		; vyvolaj podprogram
	CLRF PORTA		; vynuluj port A
	BTFSS TLAC0		; testuj tlačidlo TLAC0
	GOTO EFEKT_3		; ak je stlačené(log.0) tak preskoč na riadok EFEKT2, ak nie(log.1) tak preskoč

	MOVLW B'01101111'	; presuň čísla do W registru
        MOVWF PORTB		; presuň čísla do portu B
	BTFSS TEST1		; testuj tlačidlo TEST1
	CALL TEST		; ak je stlačené(na vstupe log.0) tak vyvolaj podprogram, ak nie(na vstupe log.1) tak preskoč(NOP)
        CALL CAKAJ		; vyvolaj podprogram
	CLRF PORTA		; vynuluj port A
	BTFSS TLAC0		; testuj tlačidlo TLAC0
	GOTO EFEKT_3		; ak je stlačené(log.0) tak preskoč na riadok EFEKT2, ak nie(log.1) tak preskoč

        GOTO EFEKT_2

;***************************************************************

EFEKT3  MOVLW .3
	CALL PIS_EE
EFEKT_3	MOVLW B'01111111'	; presuň čísla do W registru
        MOVWF PORTB		; presuň čísla do portu B
	BTFSS TEST1		; testuj tlačidlo TEST1
	CALL TEST		; ak je stlačené(na vstupe log.0) tak vyvolaj podprogram, ak nie(na vstupe log.1) tak preskoč(NOP)
        CALL CAKAJ		; vyvolaj podprogram
	CLRF PORTA		; vynuluj port A
	BTFSS TLAC0		; testuj tlačidlo TLAC0
	GOTO EFEKT_1		; ak je stlačené(log.0) tak preskoč na riadok EFEKT2, ak nie(log.1) tak preskoč

	MOVLW B'101111111'	; presuň čísla do W registru
        MOVWF PORTB		; presuň čísla do portu B
	BTFSS TEST1		; testuj tlačidlo TEST1
	CALL TEST		; ak je stlačené(na vstupe log.0) tak vyvolaj podprogram, ak nie(na vstupe log.1) tak preskoč(NOP)
        CALL CAKAJ		; vyvolaj podprogram
	CLRF PORTA		; vynuluj port A
	BTFSS TLAC0		; testuj tlačidlo TLAC0
	GOTO EFEKT_1		; ak je stlačené(log.0) tak preskoč na riadok EFEKT2, ak nie(log.1) tak preskoč

	MOVLW B'11011111'	; presuň čísla do W registru
        MOVWF PORTB		; presuň čísla do portu B
	BTFSS TEST1		; testuj tlačidlo TEST1
	CALL TEST		; ak je stlačené(na vstupe log.0) tak vyvolaj podprogram, ak nie(na vstupe log.1) tak preskoč(NOP)
        CALL CAKAJ		; vyvolaj podprogram
	CLRF PORTA		; vynuluj port A
	BTFSS TLAC0		; testuj tlačidlo TLAC0
	GOTO EFEKT_1		; ak je stlačené(log.0) tak preskoč na riadok EFEKT2, ak nie(log.1) tak preskoč

	MOVLW B'11101111'	; presuň čísla do W registru
        MOVWF PORTB		; presuň čísla do portu B
	BTFSS TEST1		; testuj tlačidlo TEST1
	CALL TEST		; ak je stlačené(na vstupe log.0) tak vyvolaj podprogram, ak nie(na vstupe log.1) tak preskoč(NOP)
        CALL CAKAJ		; vyvolaj podprogram
	CLRF PORTA		; vynuluj port A
	BTFSS TLAC0		; testuj tlačidlo TLAC0
	GOTO EFEKT_1		; ak je stlačené(log.0) tak preskoč na riadok EFEKT2, ak nie(log.1) tak preskoč

        GOTO EFEKT_3

;***************************************************************

EFEKT4	MOVLW B'01111111'   
        MOVWF PORTB
        CALL CAKAJ4  

        MOVLW B'10111111'
        MOVWF PORTB
        CALL CAKAJ4

	MOVLW B'11011111'   
        MOVWF PORTB
        CALL CAKAJ4  

        MOVLW B'11101111'
        MOVWF PORTB
        CALL CAKAJ4

	MOVLW B'11011111'   
        MOVWF PORTB
        CALL CAKAJ4  

        MOVLW B'10111111'
        MOVWF PORTB
        CALL CAKAJ4
	
	GOTO EFEKT4

;***************************************************************

EFEKT5	MOVLW B'00111111'   	;*-*---*-*---
        MOVWF PORTB
        CALL CAKAJ5  

        MOVLW B'11111111'
        MOVWF PORTB
        CALL CAKAJ5

	MOVLW B'00111111'   
        MOVWF PORTB
        CALL CAKAJ5  

        MOVLW B'11111111'
	MOVWF PORTB
        CALL CAKAJ5

        MOVLW B'11111111'
	MOVWF PORTB
        CALL CAKAJ5
   
        MOVLW B'11111111'
	MOVWF PORTB
        CALL CAKAJ5

        MOVLW B'11001111'
	MOVWF PORTB
        CALL CAKAJ5

        MOVLW B'11111111'
	MOVWF PORTB
        CALL CAKAJ5

        MOVLW B'11001111'
	MOVWF PORTB
        CALL CAKAJ5

        MOVLW B'11111111'
	MOVWF PORTB
        CALL CAKAJ5

        MOVLW B'11111111'
	MOVWF PORTB
        CALL CAKAJ5
   
        MOVLW B'11111111'
	MOVWF PORTB
        CALL CAKAJ5


	GOTO EFEKT5

;***************************************************************

EFEKT6	MOVLW B'00001111'   	
        MOVWF PORTB
        CALL CAKAJ6  

        MOVLW B'11111111'
        MOVWF PORTB
        CALL CAKAJ6

	MOVLW B'00001111'   
        MOVWF PORTB
        CALL CAKAJ6  

        MOVLW B'11111111'
	MOVWF PORTB
        CALL CAKAJ6

        MOVLW B'11111111'
	MOVWF PORTB
        CALL CAKAJ6
   
        MOVLW B'11111111'
	MOVWF PORTB
        CALL CAKAJ6

	MOVLW B'00001111'   	
        MOVWF PORTB
        CALL CAKAJ6  

        MOVLW B'11111111'
        MOVWF PORTB
        CALL CAKAJ6

	MOVLW B'00001111'   
        MOVWF PORTB
        CALL CAKAJ6 

        MOVLW B'11111111'
	MOVWF PORTB
        CALL CAKAJ6

        MOVLW B'11111111'
	MOVWF PORTB
        CALL CAKAJ6
   
        MOVLW B'11111111'
	MOVWF PORTB
        CALL CAKAJ6

	GOTO EFEKT6

;***************************************************************


	;Podprogramy-časovanie

CAKAJ	MOVLW h'FF'		;podprogram čakanie
	MOVWF c2		;trvá asi 0,2s
wait2	MOVLW h'FF'
	MOVWF c1
wait1	DECFSZ c1,1
	GOTO wait1
	DECFSZ c2,1
	GOTO wait2

        RETURN

CAKAJ2	MOVLW h'FF'		;podprogram čakanie
	MOVWF c2		;trvá asi 0,2s
wait22	MOVLW h'FF'
	MOVWF c1
wait12	DECFSZ c1,1
	GOTO wait12
	DECFSZ c2,1
	GOTO wait22

        RETURN

CAKAJ3	MOVLW h'FF'		;podprogram čakanie
	MOVWF c2		;trvá asi 0,2s
wait23	MOVLW h'FF'
	MOVWF c1
wait13	DECFSZ c1,1
	GOTO wait13
	DECFSZ c2,1
	GOTO wait23

        RETURN

CAKAJ4	MOVLW h'FF'		;podprogram čakanie
	MOVWF c2		;trvá asi 0,2s
wait24	MOVLW h'FF'
	MOVWF c1
wait14	DECFSZ c1,1
	GOTO wait14
	DECFSZ c2,1
	GOTO wait24

        RETURN

CAKAJ5	MOVLW h'FF'		;podprogram čakanie
	MOVWF c2		;trvá asi 0,2s
wait25	MOVLW h'FF'
	MOVWF c1
wait15	DECFSZ c1,1
	GOTO wait15
	DECFSZ c2,1
	GOTO wait25

        RETURN

CAKAJ6	MOVLW h'FF'		;podprogram čakanie
	MOVWF c2		;trvá asi 0,2s
wait26	MOVLW h'FF'
	MOVWF c1
wait16	DECFSZ c1,1
	GOTO wait16
	DECFSZ c2,1
	GOTO wait26

        RETURN
;***************************************************************
	;podprogram testovanie

TEST	MOVWF FSR
	SWAPF FSR,W
	MOVWF PORTA

	RETURN	
;***************************************************************
PIS_EE	BSF STATUS, RP0		;banka 1
	BCF INTCON, GIE		;zákaz prerušenia
	BSF EECON1, WREN	;povolenie zápisu do dátové EEPROM
	MOVLW 55h		;povinná sekvecnia!!!!!!!!!
	MOVWF EECON2		;55h musí byť zapísané ho EECON2
	MOVLW .170		;pre zahájenie sekvecnie zápisu
	MOVWF EECON2		;zápis AAh
	BSF EECON1, WR		;nastav bit WR- odštartuje sekvenciu zápisu
	NOP
	NOP
	BTFSC EECON1, WR	;CAKAJ NA DOKONCENIE ZAPISU
	GOTO $-1
	BCF STATUS, RP0

	RETURN
;***************************************************************
CTI_EE	BCF STATUS, RP0		;banka 0
	MOVLW ADDR		;adresa bunky EEPROM ktorú chceme čítať
	MOVWF EEADR		;chceme čítať
	BSF STATUS, RP0		;banka1
	BSF EECON1, RD		;odštartuj čítanie dát z EEPROM
	BCF STATUS, RP0		;banka 0
	MOVF EEDATA, W		;W=EEDATA ze EEPROM

	RETURN
;***************************************************************

	END			;koniec programu

