; S_ora_prog2.asm Elkészült: 
; Készítette: Kiss László
; Utolsó módosítás: 2011.10.31
; Óra program. Az óra megszakítás használatával működik. 
; Számláló: 38
; Ver:0.5 
; MCU: 16F887

 LIST  P=16F887 ;PROCESSZOR DEFINICIO 
 #INCLUDE <C:\Program Files (x86)\Microchip\MPASM Suite\P16F887.INC> ;A SZUKSEGES INCLUDE FAJL 
      ERRORLEVEL 0,-302        ; elnyomja a bank-váltás üzeneteit
	__CONFIG _CONFIG1, (_LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _MCLRE_OFF & _WDT_OFF & _HS_OSC)
	__CONFIG _CONFIG2, (_WRT_OFF)

	
	CBLOCK 0X20
	
	ORA_SZ
	PERC_SZ
	MASODP_SZ
	TIZED_SZ
	ORA_A
	PERC_A
	TIZED_A
	OTPERC_SZ
	OTPERC_A
	
	T_SOR
	T_OSZLOP
	T_ORA_SOR
	
	SIGNAL									; Általános jelzőbájt. 
											; 0. bit: nappal/éjszaka
											; 1. bit: délelőtt/délután
											; 2. bit: másodperc változás
											; 3. bit: perc változás
											; 4. bit: 5 perc változás
											; 5. bit: óra változás
											; 6. bit: 12 óra átlépése
											;
	PM_SOR
	PM_OSZLOP
	ORA_SOR
	PERC_SOR
	OTPERC_SOR
	ORA_OSZLOP
	PERC_OSZLOP
	OTPERC_OSZLOP
	
	T1,T2,T3,T4
	ENDC

	CBLOCK 0X70
	WSAVE
	SSAVE
	ENDC
	
#DEFINE	SORPORT 	PORTD
#DEFINE OSZLOPPORT	PORTC
	
	ORG 0X00
	
	GOTO	S_INI
;================================================ Megszakítás programrész =======================================================
	ORG 0X04

	MOVWF	WSAVE
	SWAPF	WSAVE,F
	SWAPF	STATUS,W
	MOVWF	SSAVE
	BCF		PIR1,TMR2IF	
S_ORA_SZAMOL
	DECFSZ	TIZED_SZ,F			; csökkentem a tizedmásodperc számlálót
	GOTO	INT_LOAD			; ha még nem 0, vissza a főprogramba
	MOVF	TIZED_A,W			; visszatöltöm a kezdeti értéket,
	MOVWF	TIZED_SZ			; és végigcsinálom a többi számlálóval is.
	BSF		SIGNAL,2
	
	DECFSZ	MASODP_SZ,F			; csökkentem a másodperc számlálót
	GOTO	INT_LOAD
	MOVF	PERC_A,W
	MOVWF	MASODP_SZ
	BSF		SIGNAL,3
	
	DECFSZ	PERC_SZ,F			; csökkentem a perc számlálót
	GOTO	INT_LOAD
	MOVF	PERC_A,W
	MOVWF	PERC_SZ
	BSF		SIGNAL,5
	
	DECFSZ	ORA_SZ,F			; csökkentem az óra számlálót
	GOTO	INT_LOAD
	MOVF	ORA_A,W
	MOVWF	ORA_SZ
	MOVLW	B'00000010'
	XORWF	SIGNAL,F

INT_LOAD
	SWAPF	SSAVE,W
	MOVWF	STATUS
	SWAPF	WSAVE,W
	RETFIE
;================================================ Valós időben futó program =====================================================
	
S_INI

	CLRF	PORTC
	CLRF	PORTD
	BSF		STATUS,RP0
	CLRF	TRISD
	CLRF	TRISC
	MOVLW	.249
	MOVWF	PR2					; ~4 ms
	BSF		PIE1,TMR2IE	
	BCF		STATUS,RP0
INI_TIMER_VAR	
	MOVLW	.5					; fejlesztéskor 5 !!!!!!!!!!!!!!!!!!!!
	MOVWF	PERC_A
	MOVWF	PERC_SZ
	MOVLW	.3					; fejlesztéskor 3 !!!!!!!!!!!!!!!!!!!
	MOVWF	MASODP_SZ
	MOVLW	.250				; 250*4 ms = 1 sec 
	MOVWF	TIZED_A				; 
	MOVWF	TIZED_SZ
	MOVLW	.5
	MOVWF	OTPERC_A
	MOVWF	OTPERC_SZ
	MOVLW	.12
	MOVWF	ORA_A
	MOVWF	ORA_SZ
INI_KIJELZO_VAR	
	MOVLW	B'00000010'
	MOVWF	SIGNAL				;
	MOVWF	ORA_SOR				; Az óra sora (12)
	MOVWF	PM_SOR				; A délután jelző sora
	MOVLW	B'00001000'			
	MOVWF	ORA_OSZLOP			; Az óra oszlopa (12)
	MOVLW	B'00000001'			
	MOVWF	OTPERC_OSZLOP			
	MOVWF	PERC_OSZLOP
	MOVLW	B'10000000'
	MOVWF	PM_OSZLOP
	MOVLW	B'00000100'
	MOVWF	OTPERC_SOR
	CLRF	PERC_SOR
ORA_INDUL
	MOVLW	B'00100110'			;1:16 előosztó, 1:5 utóosztó
	MOVWF	T2CON
	BSF		INTCON,PEIE
	BSF		INTCON,GIE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
S_MAIN	
	BTFSC	SIGNAL,2			; ha a jelzőbit be van kapcsolva
	GOTO	VILLANT				; akkor eltelt egy másodperc, villogtatom az órát
	GOTO	PERCEK				; ha nem telt el egy másodperc, akkor tovább a percekhez
VILLANT
	MOVF	ORA_SOR,W			; megnézem, hogy a sor be van-e kapcsolva
	BTFSS	STATUS,Z
	GOTO	KIKAPCS				; ha be, akkor kikapcsolom.
	MOVF	T_ORA_SOR,W			; ha nincs bekapcsolva, akkor a T_ORA_SOR-ból visszatöltöm a sor értékét
	MOVWF	ORA_SOR
	BCF		SIGNAL,2			; törlöm a jelzőbitet
	GOTO	PERCEK
	
KIKAPCS	
	MOVF	ORA_SOR,W			; kikapcsolás előtt
	MOVWF	T_ORA_SOR			; elmentem a sor értékét, a bekapcsoláshoz
	XORWF	ORA_SOR,F
	BCF		SIGNAL,2
;..............................................................................	
PERCEK
	BTFSC	SIGNAL,3			; A percek változásának vizsgálata
	CALL	S_PERC_LEP			; Ha változott, léptetem az oszlop bitet.
	MOVF	PERC_OSZLOP,W
	MOVWF	T_OSZLOP
	MOVF	PERC_SOR,W
	MOVWF	T_SOR
	CALL	S_KIIR
;..............................................................................
	BTFSC	SIGNAL,4			; Az ötpercek változásának vizsgálata.
	CALL	S_OTPERC_LEP
	MOVF	OTPERC_OSZLOP,W
	MOVWF	T_OSZLOP
	MOVF	OTPERC_SOR,W
	MOVWF	T_SOR
	CALL	S_KIIR
;..............................................................................	
	BTFSC	SIGNAL,5			; Órák változásának vizsgálata
	CALL	S_ORA_LEP
	MOVF	ORA_OSZLOP,W
	MOVWF	T_OSZLOP
	MOVF	ORA_SOR,W
	MOVWF	T_SOR
	CALL	S_KIIR
;..............................................................................
	BTFSS	SIGNAL,1			; A délelőtt-délután jelző váltása
	GOTO	DELELOTT
	BSF		PM_SOR,1
KESZ	
	MOVF	PM_SOR,W
	MOVWF	T_SOR
	MOVF	PM_OSZLOP,W
	MOVWF	T_OSZLOP
	CALL	S_KIIR
	GOTO	S_MAIN
DELELOTT
	BCF		PM_SOR,1
	GOTO	KESZ

; Szubrutinok -------------------------------------------------------------------------------------------------------------------
	
S_PERC_LEP

	MOVF	PERC_SOR,W			; A W-be hívom a változót
	BTFSC	STATUS,Z			; megnézem, hogy 0-e 
	BTFSS	PERC_OSZLOP,0		; ha ki van kapcsolva a sor, megnézem a 0. bitet
	GOTO	FORGAT
	BSF		PERC_SOR,3			; ide ugrik, ha a sor=ki, oszlop=0 (Forgatás előtt)
	BCF		SIGNAL,3
	RETURN
FORGAT	
	RLF		PERC_OSZLOP,W
	RLF		PERC_OSZLOP,F
	BTFSC	PERC_OSZLOP,4
	GOTO	TORLES
	BCF		SIGNAL,3
	RETURN
TORLES	
	CLRF	PERC_OSZLOP			; ide ugrik, ha a sor=be, oszlop=4 (Forgatás után)
	BSF		PERC_OSZLOP,0
	BCF		PERC_SOR,3
	BSF		SIGNAL,4
	BCF		SIGNAL,3
	RETURN
;..............................................................................	
	
S_OTPERC_LEP
	MOVLW	B'00001100'
	BTFSC	OTPERC_OSZLOP,7
	XORWF	OTPERC_SOR,F
	RLF		OTPERC_OSZLOP,W
	RLF		OTPERC_OSZLOP,F
	BTFSS	OTPERC_SOR,3
	GOTO	SIGNAL_CLEAR
	BTFSC	OTPERC_OSZLOP,0
	GOTO	TORLES2
	GOTO	SIGNAL_CLEAR
TORLES2
	CLRF	OTPERC_OSZLOP
	BSF		OTPERC_OSZLOP,4
SIGNAL_CLEAR	
	BCF		SIGNAL,4
	RETURN
;..............................................................................
	
S_ORA_LEP

;	MOVLW	.6					; A nappal-éjszaka állítása 
;	XORWF	ORA_SZ,W
;	BTFSC	STATUS,Z
;	CALL	S_TOGLE_SIGNAL

	BTFSS	ORA_OSZLOP,3
	GOTO	HETES
	BTFSC	T_ORA_SOR,1
	GOTO	VALTAS
HETES	
	BTFSC	ORA_OSZLOP,7		; Megnézem, a 7. bitnél áll-e az óra
	GOTO	VALTAS
FOROG
	RLF		ORA_OSZLOP,W
	RLF		ORA_OSZLOP,F
	BCF		SIGNAL,5
	RETURN
	
VALTAS	
	MOVLW	B'00000001'
	MOVWF	ORA_OSZLOP
	MOVLW	B'00000011'
	XORWF	T_ORA_SOR,F
	MOVF	T_ORA_SOR,W
	MOVWF	ORA_SOR
	BCF		SIGNAL,5
	RETURN
;..............................................................................

S_TOGLE_SIGNAL
	MOVLW	B'00000001'
	XORWF	SIGNAL,F
	RETURN
	
S_KIIR
	CLRF	SORPORT
	CLRF	OSZLOPPORT
;	BTFSC	SIGNAL,0			; ellenőrzöm, hogy az este-reggel bit be van-e állítva
;	SWAPF	T_SOR,F				; ha igen, akkor megcserélem a két nibble-t (piros-zöld váltás)
	MOVF	T_OSZLOP,W
	MOVWF	OSZLOPPORT
	MOVF	T_SOR,W
	MOVWF	SORPORT
	CALL	S_KESLELTET_1MS
	RETURN
	
	INCLUDE VÁRAKOZIK.INC
	END
;================================================================================================================================
	
Percek léptetése kész
Órák léptetése kész
Ötpercek léptetése kész.
Pm kijelzés megoldva.
A teszt folyamán jól működött valós időben.
Nappal, este váltás kész
Óra villogtatása kész.

Megoldandó:
A FELVILLANÁS MEGOLDVA ???
A felvillanások továbbra is léteznek, ezért kiveszem a megszakítás tiltó sorokat.

A várakozási időt változtatom.
Nincs hatással

	
	
A másodperc jelző led minden páros másodpercben kigyullad, és minden páratlanban elalszik.
A perc led a másodperc led sötét állapotában gyújt be.

PORTC: oszlop 1-8
PORTD: sor zöld 0-3 sor piros 4-7


1	2	3	4	5	6	7	8	0	4
9	10	11	12				pm	1	5
0	5	10	15	20	25	30	35	2	6
+1	+2	+3	+4	40	45	50	55	3	7
0	1	2	3	4	5	6	7		

