;Program: Měření délky impulsu MKO
;*********************************
	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
TMP	EQU	RAM+3
TM1	EQU	RAM+4
TM2	EQU	RAM+5
HX_L	EQU	RAM+6
HX_H	EQU	RAM+7
DL_L	EQU	RAM+8
DL_H	EQU	RAM+9
JEDN	EQU	RAM+10
DES	EQU	RAM+11
STA	EQU	RAM+12
TIS	EQU	RAM+13
DTIS	EQU	RAM+14
POM	EQU	RAM+15

#define	Q	PORTB,0
#define	RS	PORTB,1	
#define	RW	PORTB,2
#define	E	PORTB,3
#define	BF	RBF,3
#define	B6	PORTB,6
#define	B7	PORTB,7
;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
;****************************************************************************

PREVOD	MOVLW	H'10'		;dělitel=10000
	MOVWF	DL_L
	MOVLW	H'27'
	MOVWF	DL_H
	CALL	DELENI		;dělení 10000
	MOVWF	DTIS		;zápis desetitisíců
	MOVLW	H'E8'		;dělitel=1000
	MOVWF	DL_L
	MOVLW	H'3'
	MOVWF	DL_H
	CALL	DELENI		;dělení 1000
	MOVWF	TIS		;zápis tisíců
	MOVLW	H'64'		;dělitel=100
	MOVWF	DL_L
	CLRF	DL_H
	CALL	DELENI		;dělení 100
	MOVWF	STA		;zápis stovek
	MOVLW	H'A'		;dělitel=10
	MOVWF	DL_L
	CLRF	DL_H
	CALL	DELENI		;děleni 10
	MOVWF	DES		;zápis desítek
	MOVLW	48
	ADDWF	HX_L,W
	MOVWF	JEDN		;zápis jednotek
	RETURN
;----------------------------------------------------------------------------
DELENI	CLRF	NUM		;HX_H,HX_L dělí DL_H,DL_L
	MOVFW	DL_L		;a výsledek je uložen
	SUBWF	HX_L,W		;do registru W + 48
	BTFSS	STATUS,C
	GOTO	$+11
	MOVWF	POM
	MOVFW	DL_H
	SUBWF	HX_H,W	
	BTFSS	STATUS,C
	GOTO	$+12
	MOVWF	HX_H
	MOVFW	POM
	MOVWF	HX_L
	INCF	NUM,F
	GOTO	$-13
	MOVWF	POM
	INCF	DL_H,W
	SUBWF	HX_H,W
	BTFSS	STATUS,C
	GOTO	$+2
	GOTO	$-10
	MOVLW	48
	ADDWF	NUM,W
	RETURN

;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;PROGRAM
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
START	BSF	STATUS,RP0	;banka 1
	MOVLW	B'10110001'
	MOVWF	TRISB		;nastavení portu B
	BCF	STATUS,RP0	;banka 0
	BSF	B6		;pin B6 = 1

	CALL	INILCD		;inicializace displeje
	MOVLW	1
	CALL	WRPRI		;reset displeje
	BTFSC	B7		;test impulsu
	GOTO	$-1

	CLRF	HX_L		;vynulování registru
	CLRF	HX_H		;vynulování registru

	MOVLW	42
	CALL	WRDATA		;tisk "*"
	CLRF	PORTA		;nula na port A
	BTFSS	Q		;je stisknuto tačítko ENTER?
	GOTO	$-1		;ne,tak čekej

	BCF	B6		;pin B6 = 0 (záporný impuls)
	NOP			;časová prodleva
	BSF	B6		;pin B6 = 1

ZNOVU	BTFSS	B7		;je konec impulsu?
	GOTO	KONEC		;ano,jdi na KONEC
	INCF	HX_L,F		;registr HX_L + 1
	BTFSS	STATUS,Z	;je HX_L = 0?
	GOTO	SEM		;ne,jdi SEM
	INCF	HX_H,F		;registr HX_H + 1
	BTFSC	STATUS,Z	;je HX_H = 0?
	GOTO	CHYBA		;ano,jdi na CHYBA
	GOTO	ZNOVU		;ne,jdi na ZNOVU
SEM	NOP			;časové vyrovnání
	NOP
	GOTO	ZNOVU		;jdi na ZNOVU

KONEC	CALL	PREVOD		;proveď převod

	MOVFW	DTIS
	CALL	WRDATA		;tisk desetitisíců
	MOVFW	TIS
	CALL	WRDATA		;tisk tisíců
	MOVFW	STA
	CALL	WRDATA		;tisk stovek
	MOVLW	44
	CALL	WRDATA		;tisk čárky
	MOVFW	DES
	CALL	WRDATA		;tisk desítek
	MOVFW	JEDN
	CALL	WRDATA		;tisk jednotek
	MOVLW	32
	CALL	WRDATA		;tisk mezery
	MOVLW	109
	CALL	WRDATA		;tisk "m"
	MOVLW	83
	CALL	WRDATA		;tisk "S"

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

CHYBA	MOVLW	1
	CALL	WRPRI		;reset displeje
	MOVLW	63
	CALL	WRDATA		;tisk "?"

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

	END

