;Program: Stopky
;****************************************************************************
	LIST P = 16F84,	R = DEC
	#INCLUDE <P16F84.INC>
;----------------------------------------------------------------------------
 __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;****************************************************************************
RAM	EQU	H'0C'
;----------------------------------------------------------------------------
RBF	EQU	RAM
RBF1	EQU	RAM+1
NUM	EQU	RAM+2
NUM1	EQU	RAM+3
TMP	EQU	RAM+4
TM0	EQU	RAM+5
TM1	EQU	RAM+6
TM2	EQU	RAM+7
J_SEK	EQU	RAM+8
D_SEK	EQU	RAM+9
J_MIN	EQU	RAM+10
D_MIN	EQU	RAM+11
ADRTX	EQU	RAM+12
POM	EQU	RAM+13
S_mS	EQU	RAM+14

#define	Q	PORTB,0
#define	RS	PORTB,1	
#define	RW	PORTB,2
#define	E	PORTB,3
#define	BF	RBF,3
#define	ZVUK	PORTB,4
#define	TEST	INTCON,T0IF
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
	ORG	0
	GOTO	START
;****************************************************************************
;PODPROGRAMY
;****************************************************************************
INILCD	CALL	t15mS		;doba 15 milisekund
	BCF	RS
	BCF	RW
	CALL	A_OUT		;port A výstup
	BSF	E
	MOVLW	B'00000011'
	MOVWF	PORTA
	BCF	E
	CALL	t4mS		;doba 4 milisekund
	BSF	E
	MOVLW	B'00000011'
	MOVWF	PORTA
	BCF	E
	CALL	t100uS		;doba 100 mikrosekund
	BSF	E
	MOVLW	B'00000011'
	MOVWF	PORTA
	BCF	E
	CALL	t100uS		;doba 100 mikrosekund
	MOVLW	B'00101000'
	CALL	WRPRI		;4.bitová komunikace a dva řádky
	MOVLW	B'00001000'
	CALL	WRPRI		;displej OFF
	MOVLW	B'00001100'
	CALL	WRPRI		;displej ON, kurzor OFF, blikání OFF
	MOVLW	B'00000110'
	CALL	WRPRI		;inkrementace, normální operace
	RETURN
;----------------------------------------------------------------------------
WRDATA	BSF	RS		;nastavení bitu RS pro zápis dat
	GOTO	$+2
WRPRI	BCF	RS		;nastavení bitů RS a RW pro zápis příkazu
	BCF	RW
	MOVWF	TMP		;číslo příkazu nebo data do registru TMP
	CALL	A_OUT		;portA jako výstup
	SWAPF	TMP,W		;horní 4 bity do registru W
	BSF	E
	MOVWF	PORTA		;zápis 4 horních bitů do displeje
	BCF	E
	MOVFW	TMP		;obsah registru TMP do registru W
	BSF	E
	MOVWF	PORTA		;zápis dolních 4 bitů do displeje
	BCF	E
	CALL	T_BF		;testování bitu BF
	RETURN
;----------------------------------------------------------------------------	

T_BF	BCF	RS		;podprogram testuje konec operace (bit BF)
	BSF	RW
	CALL	A_IN		;portA vstup (po ukončení zase výstup)
	BSF	E
	MOVFW	PORTA
	MOVWF	RBF
	BCF	E
	NOP
	BSF	E
	MOVFW	PORTA
	MOVWF	RBF1
	BCF	E
	BTFSC	BF		;je bit BF=0 ? (0 = konec operace)
	GOTO	$-10		;ne - testuj znova
;----------------------------------------------------------------------------
A_OUT	MOVLW	B'11110000'	;pin A0/A3 výstup, pin A4 vstup
	GOTO	$+2
A_IN	MOVLW	B'11111111'	;pin A0/A7 vstup
	BSF	STATUS,RP0	;banka 1
	MOVWF	TRISA		;nastavení portu A
	BCF	STATUS,RP0	;banka 0
	RETURN
;****************************************************************************
t15mS	MOVLW	49		;doba 15 milisekund
	GOTO	$+2
t4mS	MOVLW	14		;doba 4 milisekund
	MOVWF	TM1
	MOVLW	255
	MOVWF	TM2
	DECFSZ	TM2,F
	GOTO	$-1
	DECFSZ	TM1,F
	GOTO	$-5
	RETURN
;----------------------------------------------------------------------------
t100uS	MOVLW	83		;doba 100 mikrosekund
	MOVWF	TM1
	DECFSZ	TM1,F
	GOTO	$-1
	RETURN
;****************************************************************************
PIP	MOVLW	30		;pípnutí při stisku klávesy
	MOVWF	TM2
	BSF	ZVUK
	CALL	PIP1
	BCF	ZVUK
	CALL	PIP1
	DECFSZ	TM2,F
	GOTO	$-5
	RETURN
;----------------------------------------------------------
PIP1	MOVLW	100
	MOVWF	TM0
	MOVLW	150
	MOVWF	TM1
	DECFSZ	TM1,F
	GOTO	$-1
	DECFSZ	TM0,F
	GOTO	$-1
	RETURN
;****************************************************************************
TEXT	MOVWF	ADRTX		;provádí zápis textu na vybranou adresu
	CALL	KOD
	MOVWF	POM
	MOVF	POM,F
	BTFSC	STATUS,Z
	RETURN
	CALL	WRDATA
	INCF	ADRTX,F
	MOVFW	ADRTX
	GOTO	$-8
;****************************************************************************
ZOBR	MOVLW	132
	CALL	WRPRI		;nastavení adresy DDRAM
	MOVFW	D_MIN
	CALL	WRDATA		;tisk desítek minut
	MOVFW	J_MIN
	CALL	WRDATA		;tisk jednotek minut
	MOVLW	58
	CALL	WRDATA		;tisk ":"
	MOVFW	D_SEK
	CALL	WRDATA		;tisk desítek sekund
	MOVFW	J_SEK
	CALL	WRDATA		;tisk jednotek sekund
	MOVLW	44
	CALL	WRDATA		;tisk ","
	MOVFW	S_mS
	CALL	WRDATA		;tisk stovek milisekund
	RETURN

;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;PROGRAM
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
START	BSF	STATUS,RP0	;banka1
	MOVLW	B'11100001'
	MOVWF	TRISB		;nastavení portu B
	MOVLW	B'11000111'
	MOVWF	OPTION_REG	;načítat TMR0 z vnitřních hodin,dělící poměr 1 : 256
	BCF	STATUS,RP0	;banka 0
	MOVLW	48
	MOVWF	D_MIN		;vynulování desítek minut
	MOVWF	J_MIN		;vynulovíní jednotek minut
	MOVWF	D_SEK		;vynulování desítek sekund
	MOVWF	J_SEK		;vynulování jednotek sekund
	MOVWF	S_mS		;vynulování stovek milisekund

	CALL	INILCD		;inicializace displeje
	MOVLW	1
	CALL	WRPRI		;reset displeje

	CALL	ZOBR		;zobrazení na displej

	MOVLW	1
	MOVWF	PORTA
	BTFSS	Q		;je stisknuto tlačítko TL2?
	GOTO	$-1		;ne,tak čekej

	MOVLW	197
	CALL	WRPRI		;adresa DDRAM
	CLRW			;adresa textu
	CALL	TEXT		;tisk "START"

	CALL	PIP		;pípnutí

ZDE	CLRF	TMR0		;vynulování registru TMR0
	BCF	TEST		;vynulování bitu T0IF

	CALL	ZOBR		;zobrazení na displej

	INCF	S_mS,F		;stovky milisekund + 1
	MOVFW	S_mS
	XORLW	58
	BTFSS	STATUS,Z	;dosáhly stovky milisekund čísla 10?
	GOTO	CAS		;ne,jdi na CAS
	MOVLW	48		;ano
	MOVWF	S_mS		;vynuluj stovky milisekund

	INCF	J_SEK,F		;jednotky sekund + 1
	MOVFW	J_SEK
	XORLW	58
	BTFSS	STATUS,Z	;dosáhly jednotky sekund čísla 10?
	GOTO	CAS		;ne,jdi na CAS
	MOVLW	48		;ano
	MOVWF	J_SEK		;vynuluj jednotky sekund

	INCF	D_SEK,F		;desítky sekund + 1
	MOVFW	D_SEK
	XORLW	54
	BTFSS	STATUS,Z	;dosáhly desítky sekund čísla 6?
	GOTO	CAS		;ne,jdi na CAS
	MOVLW	48		;ano
	MOVWF	D_SEK		;vynuluj desítky sekund

	INCF	J_MIN,F		;jednotky minut + 1
	MOVFW	J_MIN
	XORLW	58
	BTFSS	STATUS,Z	;dosáhly jednotky minut čísla 10?
	GOTO	CAS		;ne,jdi na CAS
	MOVLW	48		;ano
	MOVWF	J_MIN		;vynuluj jednotky minut

	INCF	D_MIN,F		;desítky minut + 1
	MOVFW	D_MIN
	XORLW	58
	BTFSS	STATUS,Z	;dosáhly desítky minut čísla 10?
	GOTO	CAS		;ne,jdi na CAS
	MOVLW	48		;ano
	MOVWF	D_MIN		;vynuluj desítky minut

CAS	BTFSS	TEST		;nastalo přetečení registru TMR0?
	GOTO	CAS		;ne,tak čekej

	CLRF	PORTA
	BTFSC	Q		;je stisknuto tlačítko TL1?
	GOTO	KONEC		;ano,jdi na KONEC

	MOVLW	106		;časová smyčka 34,458 mS
	MOVWF	TM1
	MOVLW	107
	MOVWF	TM2
	DECFSZ	TM2,F
	GOTO	$-1
	DECFSZ	TM1,F
	GOTO	$-5
	NOP
	NOP

	GOTO	ZDE		;jdi na návěští ZDE
;**************************************************************************

KONEC	MOVLW	197
	CALL	WRPRI		;nastavení adresy DDRAM
	MOVLW	6		;nastavení adresy textu
	CALL	TEXT		;tisk "STOP"

	CALL	PIP		;pípnutí

	GOTO	$-0		;věčná smyčka
;**************************************************************************

	ORG	768		;adresa programové paměti
KOD	MOVLW	3
	MOVWF	PCLATH		;třetí stránka programové paměti
	MOVFW	ADRTX
	ADDWF	PCL,F		;číslo adresy textu + registr PCL
	RETLW	'S'		;0
	RETLW	'T'		;1
	RETLW	'A'		;2
	RETLW	'R'		;3
	RETLW	'T'		;4
	RETLW	0		;5
	RETLW	'S'		;6
	RETLW	'T'		;7
	RETLW	'O'		;8
	RETLW	'P'		;9
	RETLW	' '		;10
	RETLW	0		;11	
;*************************************************************

	END
