;Stazeno z www.HW.cz 
;	Autorem tohoto SW je Jiri Recek -  j_recek@del.cz
;	uprava proti nedokonalemu nulovani s indikaci OK2TEJ

$MOD2051
; Program pro LC meter

kurzof	equ	0Ch		; Prikaz pro displej

CAL	bit	P1.4
CX	bit	P1.3

OSCOUT	bit	P3.5

LCD_E	bit	P3.4
LCD_RS	bit	P1.2
D4_R1	bit	P3.3
D5_R2	bit	P3.2
D6_R3	bit	P3.1
D7_R4	bit	P3.0

citca	data	14	; dělení kmitočtu pro časovače
citc1s	data	15	; deleni pro 1Hz

MeziVysledek1	data	18	; 6 bytů
; 19..23
MeziVysledek2	data	24	; 6 bytů
; 25..29

; Bitová oblast

Sign		bit	3	; Znamínko
nulovano	bit	4	; priznak OK nulovani
zmereno		bit	6	; frekvence přečtena
zkalibrovano	bit	7

RozCas	data	39	; roz?íř?ní časovače
frekvb	data	40	; 3byty změřená frekvence

M1real	data	44	; mezivýsledek pro výpočty
M2real	data	48	; mezivýsledek pro výpočty
M3real	data	52	; mezivýsledek pro výpočty
F2real	data	56	; frekvence po změření

; Kalibrační konstanty:
F1real	data	60	; frekvence naprázdno

C2real	data	64	; kapacita kalibračního kondenzátoru
C1real	data	72	; kapacita kondenzátoru C1
L1real	data	76	; Indukčnost cívky L1

kalnum	data	80	; pocet pruchodu pri kalibraci (1. neni pouzitelny)

; *********** začátek programu

; Reset
	org	0h
	AJMP	start

; Přeru?ení od časovače 0
	org	0Bh
	ajmp	intt0

; Přeru?ení od časovače 1
	org	1Bh
	inc	RozCas
	reti

	org	30h

start:
	CLR	EA
	MOV	SP,#88
	acall	init		; inicializace po zapnutí

; ***** Začátek cyklu
;  program bě?í stále dokola.

cykl:

	; zapamatovat frekvenci kalibrační,
	;  pokud je stisknuto tlačítko S2
	mov	c,CAL		; tlačítko S2
	cpl	c
	anl	c,/zkalibrovano	; Pouze jednou v okam?iku sepnutí
	jnc	cykl03

	clr	nulovano
	mov	kalnum,#0
	mov	r0,#F2real		; Zkopírovat hodnotu
	mov	r1,#F1real
	acall	movreal
cykl03:

	mov	c,CAL
	cpl	c
	orl	c,zkalibrovano
	mov	zkalibrovano,c	; zapamatovat stav tlačítka

	; Bitík je nahozen v programu přeru?ení
	;  po změření frekvence.
	jnb	zmereno,cykl01

	acall	frekvence	; převod frekvence do F2real

	jb	CAL,cykl02
	acall	kalibrace	; Výpočet kalibračních hodnot

	mov	a,kalnum
	jz	cykl04
	setb	nulovano

cykl04:	inc	kalnum		; zrus priznak spatne kalibrace pri 2. pruchodu


cykl02:			;  při zmačknutém tlačítku S2

	mov	c,CAL
	cpl	c
	mov	zkalibrovano,c

	acall	mereni	; Výpočet změřené hodnoty

	clr	zmereno	; příznak vynulovat.
cykl01:

	acall	Zobraz	; Zobrazování na displeji

	AJMP	cykl
; *********************************** Konec cyklu

; *********************************** 
kalibrace:	; Výpočet kapacity kondenzátoru C1
		;  a indukčnosti L1
	; L1=1
	mov	L1real,#0
	mov	L1real+1,#0
	mov	L1real+2,#80h
	mov	L1real+3,#3Fh

	; M2=1
	mov	M2real,#0
	mov	M2real+1,#0
	mov	M2real+2,#80h
	mov	M2real+3,#3Fh

	; L1=L1/F1
	mov	r0,#L1real
	mov	r1,#F1real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#L1real	;  výsledek ulo?it do L1
	acall	movreal

	; M1=F1/L1
	mov	r0,#F1real
	mov	r1,#L1real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#M1real
	acall	movreal

	; M2=M2/F2
	mov	r0,#M2real
	mov	r1,#F2real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#M2real
	acall	movreal

	; M2=F2/M2
	mov	r0,#F2real
	mov	r1,#M2real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#M2real
	acall	movreal

	; C1=M2
	mov	r0,#M2real
	mov	r1,#C1real
	acall	movreal

	; M2=-M2
	xrl	M2real+3,#80h

	; M1=M1+M2
	mov	r0,#M1real
	mov	r1,#M2real
	acall	addreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#M1real
	acall	movreal

	; C1=C1/M1
	mov	r0,#C1real
	mov	r1,#M1real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#C1real
	acall	movreal

	; M1=1
	mov	M1real,#0
	mov	M1real+1,#0
	mov	M1real+2,#80h
	mov	M1real+3,#3Fh

	; M1=M1/C2
	mov	r0,#M1real
	mov	r1,#C2real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#M1real
	acall	movreal

	; C1=C1/M1
	mov	r0,#C1real
	mov	r1,#M1real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#C1real
	acall	movreal

	; L1=L1/F1
	mov	r0,#L1real
	mov	r1,#F1real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#L1real
	acall	movreal

	; M1=4PI^2
	mov	M1real,#0E6h
	mov	M1real+1,#0E9h
	mov	M1real+2,#1Dh
	mov	M1real+3,#42h

	; L1=L1/M1
	mov	r0,#L1real
	mov	r1,#M1real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#L1real
	acall	movreal

	; L1=L1/C1
	mov	r0,#L1real
	mov	r1,#C1real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#L1real
	acall	movreal

	ret

; *********************************** 
mereni:	; Výpočet změřené hodnoty
	; M1real=1
	mov	M1real,#0
	mov	M1real+1,#0
	mov	M1real+2,#80h
	mov	M1real+3,#3Fh

	; M2real=1
	mov	M2real,#0
	mov	M2real+1,#0
	mov	M2real+2,#80h
	mov	M2real+3,#3Fh

	; M1real=1/F1
	mov	r0,#M1real
	mov	r1,#F1real
	acall	divreal
	mov	r0,#4		; výsledek
	mov	r1,#M1real	; do M1real
	acall	movreal

	; M1real=F1real/M1real
	mov	r0,#F1real
	mov	r1,#M1real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#M1real
	acall	movreal

	; M1real=M1real/F2real
	mov	r0,#M1real
	mov	r1,#F2real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#M1real
	acall	movreal

	; M1real=M1real/F2real
	mov	r0,#M1real
	mov	r1,#F2real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#M1real
	acall	movreal

	; M2real=M2real/C1real
	mov	r0,#M2real
	mov	r1,#C1real		; Pokud je měření kapacity
	jnb	CX,mereni01
	mov	r1,#L1real		; Pokud je měření indukčnosti
mereni01:
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#M2real
	acall	movreal

	; M1real=M1real/M2real
	mov	r0,#M1real
	mov	r1,#M2real
	acall	divreal
	mov	r0,#4		; adresa výsledku
	mov	r1,#M1real
	acall	movreal

	; M1real=M1real-C1real
	xrl	C1real+3,#80h	; znaménko minus
	xrl	L1real+3,#80h	; znaménko minus
	mov	r0,#M1real
	mov	r1,#C1real		; Pokud je měření kapacity
	jnb	CX,mereni02
	mov	r1,#L1real		; Pokud je měření indukčnosti
mereni02:
	acall	addreal
	xrl	C1real+3,#80h
	xrl	L1real+3,#80h
	mov	r0,#4		; adresa výsledku
	mov	r1,#M1real
	acall	movreal

	ret

; *********************************** 
movreal:	; kopie čtyř bytů
	; @r0 - odkud
	; @r1 - kam

	mov	r2,#4
	push	acc
movreal01:
	mov	a,@r0
	mov	@r1,a
	inc	r0
	inc	r1
	djnz	r2,movreal01

	mov	r2,#4
movreal02:
	dec	r0
	dec	r1
	djnz	r2,movreal02

	pop	acc

	ret

; *********************************** 
frekvence:	; převod frekvence do real

	mov	r0,#2
frekvence1:
	clr	c
	mov	a,F2real
	rlc	a
	mov	F2real,a
	mov	frekvb,a
	mov	a,F2real+1
	rlc	a
	mov	F2real+1,a
	mov	frekvb+1,a
	mov	a,F2real+2
	rlc	a
	mov	F2real+2,a
	mov	frekvb+2,a
	djnz	r0,frekvence1

	mov	r0,#F2real
	clr	a
	mov	F2real+3,a
	acall	dtr		; double word to real

	; Korekce kmitočtu krystalu
	mov	M2real+3,#03Fh	; 0.999831331
	mov	M2real+2,#07Fh
	mov	M2real+1,#0F4h
	mov	M2real,#0F2h

	mov	r0,#F2real
	mov	r1,#M2real
	acall	divreal
	mov	r0,#4
	mov	r1,#F2real
	acall	movreal

	ret
	
; ***********************************
dtr:		; převod double word to real
	; @r0 - adresa čísla

	mov	r1,#31+127	; exponent
	clr	a
	mov	r2,#4
dtr00:
	orl	a,@r0
	inc	r0
	djnz	r2,dtr00

	jnz	dtr02
	; Hodnota je nulová
	mov	r2,#4
dtr01:
	dec	r0
	mov	@r0,a
	djnz	r2,dtr01
	ajmp	dtr03		; konec
dtr02:

dtr04:	; posunutí
	dec	r0
	mov	a,@r0
	jb	acc.7,dtr05
	dec	r1		; sní?it exponent
	mov	r2,#4
	clr	c

	dec	r0
	dec	r0
	dec	r0
dtr06:
	mov	a,@r0
	rlc	a
	mov	@r0,a
	inc	r0
	djnz	r2,dtr06
	ajmp	dtr04

dtr05:
	mov	a,r1		; exponent
	clr	c		; SIGN - kladný
	rrc	a
	xch	a,@r0
	dec	r0
	mov	acc.7,c	; nejni??í bit exponentu
	xch	a,@r0
	dec	r0
	xch	a,@r0
	dec	r0
	mov	@r0,a		; hotovo - real 32 bit
	
dtr03:
	ret

; ***********************************
divreal:	; Dělení reálných čísel
	; @r0 - dělenec
	; @r1 - dělitel
	;  výsledek je v r4 a? r7

	; přesun dělence do mezivýsledku
	mov	MeziVysledek1,#0
	mov	MeziVysledek1+1,#0
	mov	MeziVysledek1+2,#0
	mov	MeziVysledek1+3,@r0
	inc	r0
	mov	MeziVysledek1+4,@r0
	inc	r0
	mov	MeziVysledek1+5,@r0
	orl	MeziVysledek1+5,#80H	; nastavit jedničku

	; přesun dělitele do druhého mezivýsledku
	mov	MeziVysledek2,#0
	mov	MeziVysledek2+1,#0
	mov	MeziVysledek2+2,#0
	mov	MeziVysledek2+3,@r1
	inc	r1
	mov	MeziVysledek2+4,@r1
	inc	r1
	mov	MeziVysledek2+5,@r1
	orl	MeziVysledek2+5,#80H	; nastavit jedničku

	; úschova adres
	mov	a,r0
	push	acc
	mov	a,r1
	push	acc

	mov	r3,#24
divreal00:

	; Odečtení
	mov	r0,#Mezivysledek1
	mov	r1,#Mezivysledek2
	mov	r2,#6			; 6 bytů
	clr	c
divreal01:
	mov	a,@r0
	subb	a,@r1
	mov	@r0,a
	inc	r0
	inc	r1
	djnz	r2,divreal01

	; schovat výsledek
	mov	f0,c
	cpl	c
	mov	a,r4
	rlc	a
	mov	r4,a
	mov	a,r5
	rlc	a
	mov	r5,a
	mov	a,r6
	rlc	a
	mov	r6,a

	jnb	f0,divreal05
	; Přičtení
	mov	r0,#Mezivysledek1
	mov	r1,#Mezivysledek2
	mov	r2,#6			; 6 bytů
	clr	c
divreal03:
	mov	a,@r0
	addc	a,@r1
	mov	@r0,a
	inc	r0
	inc	r1
	djnz	r2,divreal03
divreal05:

	; Posunutí dělitele
	mov	r1,#Mezivysledek2+5
	mov	r2,#6			; 6 bytů
	clr	c
divreal06:
	mov	a,@r1
	rrc	a
	mov	@r1,a
	dec	r1
	djnz	r2,divreal06

	djnz	r3,divreal00

	; obnova adres
	pop	acc
	mov	r1,a
	pop	acc
	mov	r0,a

	; Výpočet exponentu
	mov	a,@r1
	inc	r1
	rlc	a
	mov	a,@r1
	rlc	a
	mov	b,a
	mov	a,@r0
	inc	r0
	rlc	a
	mov	a,@r0
	rlc	a
	clr	c
	subb	a,b
	add	a,#127
	mov	r7,a
	mov	a,r6
	jb	acc.7,divreal07
	clr	c
	mov	a,r4
	rlc	a
	mov	r4,a
	mov	a,r5
	rlc	a
	mov	r5,a
	mov	a,r6
	rlc	a
	mov	r6,a
	dec	r7
divreal07:
	clr	c		; Posunutí exponentu
	mov	a,r7
	rrc	a
	mov	r7,a
	mov	a,r6
	mov	acc.7,c
	mov	r6,a

	; znaménko
	mov	a,@r0
	xrl	a,@r1
	anl	a,#80H
	orl	a,r7
	mov	r7,a

	ret

; ***********************************
AddReal:	; Sečítání reálných čísel
	; @r0 a @r1
	;  výsledek je v r4 a? r7

	; Kontrola znaménka
	inc	r0
	inc	r1
	inc	r0
	inc	r1
	inc	r0
	inc	r1
	mov	a,@r0
	xrl	a,@r1
	rlc	a
	mov	f0,c		; f0=1 - bude se odečítat
	mov	a,@r0
	jnb	acc.7,addreal00a
	; Přehodit čísla
	xch	a,r0		; r0 <-> r1
	xch	a,r1
	xch	a,r0
addreal00a:
	; přesun 1. čísla do mezivýsledku
	mov	MeziVysledek1+5,@r0	; pro znaménko
	dec	r0
	mov	a,@r0
	rlc	a
	inc	r0
	mov	a,@r0
	rlc	a
	mov	MeziVysledek1+4,a		; pro exponent
	dec	r0
	mov	MeziVysledek1+3,@r0
	jz	addreal00b
	orl	MeziVysledek1+3,#80H	; nastavit jedničku
addreal00b:
	dec	r0
	mov	MeziVysledek1+2,@r0
	dec	r0
	mov	MeziVysledek1+1,@r0
	mov	MeziVysledek1,#0
	; přesun 2. čísla do mezivýsledku
	mov	MeziVysledek2+5,@r1	; pro znaménko
	dec	r1
	mov	a,@r1
	rlc	a
	inc	r1
	mov	a,@r1
	rlc	a
	mov	MeziVysledek2+4,a		; pro exponent
	dec	r1
	mov	MeziVysledek2+3,@r1
	jz	addreal00c
	orl	MeziVysledek2+3,#80H	; nastavit jedničku
addreal00c:
	dec	r1
	mov	MeziVysledek2+2,@r1
	dec	r1
	mov	MeziVysledek2+1,@r1
	mov	MeziVysledek2,#0

addreal00:
	; Srovnat řádově podle exponentu
	mov	r0,#MeziVysledek1+4
	mov	r1,#MeziVysledek2+4
	clr	c
	mov	a,@r1
	jz	addreal02
	mov	a,@r0
	jz	addreal02
	subb	a,@r1
	jz	addreal02
	jnc	addreal01
	; Přehodit čísla
	xch	a,r0		; r0 <-> r1
	xch	a,r1
	xch	a,r0
addreal01:
	inc	@r1		; exponent zvý?it
	mov	r2,#4
	clr	c
addreal03:
	dec	r1
	mov	a,@r1
	rrc	a
	mov	@r1,a
	djnz	r2,addreal03	; čtyři byty
	ajmp	addreal00

addreal02:
	; Kontrola, jestli je první číslo nulové
	mov	a,@r0
	jnz	addreal04
	mov	a,@r1
	mov	@r0,a
addreal04:

	; Operace
	mov	r0,#MeziVysledek1
	mov	r1,#MeziVysledek2
	mov	r2,#4		; Čtyři byty
	clr	c
	jb	f0,addreal05	; Pokud je 1, bude se odčítat
addreal07:
	; Přičtení
	mov	a,@r0
	addc	a,@r1
	mov	@r0,a
	inc	r0
	inc	r1
	djnz	r2,addreal07
	jnc	addreal06
	inc	@r0
	mov	a,@r0
	mov	r2,#4
addreal08:
	dec	r0
	mov	a,@r0
	rrc	a
	mov	@r0,a
	djnz	r2,addreal08
	ajmp	addreal06
addreal05:
	; Odečtení
	mov	a,@r0
	subb	a,@r1
	mov	@r0,a
	inc	r0
	inc	r1
	djnz	r2,addreal05
	jnc	addreal09
	; Vy?lo záporné číslo
	mov	r2,#4
	mov	a,r0
	add	a,#256-4
	mov	r0,a
addreal10:	; dvojkový komplement
	mov	a,@r0
	cpl	a
	addc	a,#0
	mov	@r0,a
	inc	r0
	djnz	r2,addreal10
	xrl	MeziVysledek1+5,#80H	; změnit znaménko
addreal09:	; kontrola nulovosti
	mov	r2,#4
	clr	a
addreal11:
	dec	r0
	orl	a,@r0
	djnz	r2,addreal11
	jnz	addreal12
	mov	MeziVysledek1+4,a		; vynulovat exponent
	ajmp	addreal06
addreal12:	; Posunutí exponentu
	mov	a,MeziVysledek1+3
	rlc	a
	jc	addreal06
	mov	r0,#MeziVysledek1
	mov	r2,#4
	clr	c
addreal13:
	mov	a,@r0
	rlc	a
	mov	@r0,a
	inc	r0
	djnz	r2,addreal13
	dec	@r0		; sní?it exponent
	ajmp	addreal12
addreal06:
	; Ulo?ení výsledku do r4..r7
	mov	a,MeziVysledek1+5
	anl	a,#80H	; jen znaménko
	mov	r7,a
	mov	a,MeziVysledek1+4
	clr	c
	rrc	a
	orl	a,r7
	mov	r7,a
	mov	a,MeziVysledek1+3
	mov	acc.7,c
	mov	r6,a
	mov	r5,MeziVysledek1+2
	mov	r4,MeziVysledek1+1

	ret

; ***********************************
; Nastaveni kurzoru
NasKurzor:
	clr	LCD_RS	; RS - registr select - LCD displej
	acall	ChOut
	setb	LCD_RS	; RS - registr select - LCD displej

	ret

; ***********************************
; Ovládání zobrazování

Zobraz:	;
	MOV	A,#080H	; Kurzor na 1. řádek, 1. znak
	acall	NasKurzor

	mov	a,#'C'	; Pokud je měření kapacity

	jnb	CX,Zobraza
	mov	a,#'L'	; Pokud je měření indukčnosti
Zobraza:
	acall	ChOut
	mov	a,#'x'
	acall	ChOut
	mov	a,#'='
	acall	ChOut

; Převádění na rozumné zobrazení
	mov	dptr,#TabZobr
	; V b bude exponent desítkovej
	mov	b,#0		; Nejmen?í zobrazení pro kondy
	jnb	CX,Zobrazg1
	mov	b,#5		; Nejmen?í zobrazení pro cívky
Zobrazg1:

; Výběr konstanty pro převod z tabulky
	mov	a,b
	clr	c
	subb	a,#21
	jnc	Zobrazg2	; Konec tabulky
	mov	a,b
	rl	a		; krát 4
	rl	a		;  (1 hodnota = 4 byty)
	mov	M2real,a
	inc	a
	mov	M2real+3,a
	inc	a
	mov	M2real+2,a
	inc	a

	movc	a,@a+dptr
	xch	a,M2real
	movc	a,@a+dptr
	xch	a,M2real+3
	movc	a,@a+dptr
	xch	a,M2real+2
	movc	a,@a+dptr
	mov	M2real+1,a
	inc	b

	; Porovnají se exponenty a podle toho se vybírá
	;  dal?í konstanta a nebo se nechá vyzvednutá

	mov	a,M1real+2		; exponent výsledku
	rlc	a
	mov	a,M1real+3
	rlc	a
	jz	Zobrazg2		; Pokud je nula

	mov	r0,a
	mov	a,M2real+2		; exponent dělitele
	rlc	a
	mov	a,M2real+3
	rlc	a
	xch	a,r0
	clr	c
	subb	a,r0
	add	a,#256-14-1		; 2^14 = 16384 - rozli?ení
	jc	Zobrazg1
Zobrazg2:
	push	b

	; M3=M1/M2
	mov	r0,#M1real
	mov	r1,#M2real
	acall	divreal
	mov	r0,#4
	mov	r1,#M3real
	acall	movreal

; Převedení na BCD
	mov	r0,#M3real
	mov	r1,#MeziVysledek1
	acall	realbcd

	mov	c,f0
	mov	Sign,c

	pop	b
	mov	a,#3
	xch	a,b
	div	ab
	mov	r0,b		; Posice desetinné tečky

	; Podle exponentu předpona
	mov	dptr,#TabPredp
	mov	r1,#MeziVysledek1+10
	movc	a,@a+dptr
	mov	@r1,a

	dec	r1
	mov	@r1,#' '
	jnb	Sign,Zobrazh1
	mov	@r1,#'-'
Zobrazh1:

	dec	r1
	mov	a,MeziVysledek1+3	; 10^7
	swap	a
	anl	a,#0Fh
	add	a,#'0'
	mov	@r1,a

	dec	r1
	mov	a,MeziVysledek1+3	; 10^6
	anl	a,#0Fh
	add	a,#'0'
	mov	@r1,a

	dec	r1
	mov	a,MeziVysledek1+2	; 10^5
	swap	a
	anl	a,#0Fh
	add	a,#'0'
	mov	@r1,a

	dec	r1
	mov	a,MeziVysledek1+2	; 10^4
	anl	a,#0Fh
	add	a,#'0'
	mov	@r1,a

	dec	r1
	mov	a,MeziVysledek1+1	; 10^3
	swap	a
	anl	a,#0Fh
	add	a,#'0'
	mov	@r1,a

	dec	r1
	mov	a,r0			; Posice desetinné tečky
	jnz	Zobrazh3
	mov	@r1,#'.'
	dec	r1
Zobrazh3:
	mov	a,MeziVysledek1+1	; 10^2
	anl	a,#0Fh
	add	a,#'0'
	mov	@r1,a

	dec	r1
	mov	a,r0			; Posice desetinné tečky
	add	a,#256-1
	jnz	Zobrazh4
	mov	@r1,#'.'
	dec	r1
Zobrazh4:
	mov	a,MeziVysledek1	; 10^1
	swap	a
	anl	a,#0Fh
	add	a,#'0'
	mov	@r1,a

	dec	r1
	mov	a,r0			; Posice desetinné tečky
	add	a,#256-2
	jnz	Zobrazh5
	mov	@r1,#'.'
	dec	r1
Zobrazh5:
	mov	a,MeziVysledek1	; 10^0
	anl	a,#0Fh
	add	a,#'0'
	mov	@r1,a

	mov	a,MeziVysledek1+9
	acall	ChOut

	mov	a,MeziVysledek1+8
	add	a,#256-'0'
	jz	Zobrazi1
	mov	a,MeziVysledek1+8
	acall	ChOut
	ajmp	Zobrazi3
Zobrazi1:

	mov	a,MeziVysledek1+7
	add	a,#256-'0'
	jz	Zobrazi2
Zobrazi3:
	mov	a,MeziVysledek1+7
	acall	ChOut
	ajmp	Zobrazi5
Zobrazi2:

	mov	a,MeziVysledek1+6
	add	a,#256-'0'
	jz	Zobrazi4
Zobrazi5:
	mov	a,MeziVysledek1+6
	acall	ChOut
	ajmp	Zobrazi7
Zobrazi4:

	mov	a,MeziVysledek1+5
	add	a,#256-'0'
	mov	r0,#' '
	jz	Zobrazi6
Zobrazi7:
	mov	r0,MeziVysledek1+5
Zobrazi6:
	mov	a,r0
	acall	ChOut

	mov	a,MeziVysledek1+4
	acall	ChOut

	mov	a,MeziVysledek1+3
	acall	ChOut

	mov	a,MeziVysledek1+2
	acall	ChOut

	mov	a,MeziVysledek1+1
	acall	ChOut

	mov	a,MeziVysledek1
	acall	ChOut


	mov	a,#' '
	acall	ChOut
	mov	a,MeziVysledek1+10
	acall	ChOut
	jb	cx,Zobraza2
	mov	a,#'F'
	acall	ChOut
	ajmp	Zobraza3
Zobraza2:
	mov	a,#'H'
	acall	ChOut
Zobraza3:
	mov	a,#' '
	acall	ChOut
	mov	a,#' '
	acall	ChOut
	mov	a,#' '
	acall	ChOut

	mov	r0,#frekvb
	mov	r1,#MeziVysledek1
	acall	bin_bcd

; Na druhém řádku je zobrazena aktuální frekvence.

	MOV	A,#0C0H	; Kurzor na 2. řádek, 1. znak
	acall	NasKurzor

	mov	a,MeziVysledek1+2
	acall	prthex
	mov	a,MeziVysledek1+1
	acall	prthex
	mov	a,MeziVysledek1
	acall	prthex

	mov	a,#' '
	acall	ChOut
	mov	a,#'H'
	acall	ChOut
	mov	a,#'z'
	acall	ChOut
	mov	a,#' '
	acall	ChOut

	mov	a,#' '
	acall	ChOut
	mov	a,#' '
	acall	ChOut
	jb	nulovano,zobret		; zobrazi pozadavek na nulovani
	mov	a,#'!'
	acall	ChOut
	mov	a,#'N'
	acall	ChOut
	mov	a,#'u'
	acall	ChOut
	mov	a,#'l'
	ajmp	ChOut

zobret:	mov	a,#' '
	acall	ChOut
	mov	a,#' '
	acall	ChOut
	mov	a,#' '
	acall	ChOut
	mov	a,#' '
	acall	ChOut
	ret

; ********************************************
TabZobr:	; Tabulka pro násobení
	; 0  10^-14 (setiny piko)
	db	028h,034h,024h,0DCh
	; 1  10^-13 (desetiny piko)
	db	029h,0E1h,02Eh,013h
	; 2  10^-12 (piko)
	db	02Bh,08Ch,0BCh,0CCh
	; 3  10^-11 (setiny nano)
	db	02Dh,02Fh,0EBh,0FFh
	; 4  10^-10 (desetiny nano)
	db	02Eh,0DBh,0E6h,0FFh
	; 5  10^-9 (nano)
	db	030h,089h,070h,05Fh
	; 6  10^-8 (setiny mikro)
	db	032h,02Bh,0CCh,077h
	; 7  10^-7 (desetiny mikro)
	db	033h,0D6h,0BFh,095h
	; 8  10^-6 (mikro)
	db	035h,086h,037h,0BDh
	; 9  10^-5 (setiny mili)
	db	037h,027h,0C5h,0ACh
	; 10 10^-4 (desetiny mili)
	db	038h,0D1h,0B7h,017h
	; 11 10^-3 (mili)
	db	03Ah,083h,012h,06Fh
	; 12 10^-2 (setiny)
	db	03Ch,023h,0D7h,00Ah
	; 13 10^-1 (desetiny)
	db	03Dh,0CCh,0CCh,0CDh
	; 14 10^0 (jednotky)
	db	03Fh,080h,000h,000h
	; 15 10^1 (setiny kila)
	db	041h,020h,000h,000h
	; 16 10^2 (desetiny kila)
	db	042h,0C8h,000h,000h
	; 17 10^3 (kila)
	db	044h,07Ah,000h,000h
	; 18 10^4 (setiny mega)
	db	046h,01Ch,040h,000h
	; 19 10^5 (desetiny mega)
	db	047h,0C3h,050h,000h
	; 20 10^6 (mega)
	db	049h,074h,024h,000h

TabPredp:	; Podle exponentu předpona
	db	'p','n',0,'m'
	db	' ','k','M','G'

; ***********************
; pro inicializaci displeje
InitDispl:
	rlc	a
	mov	D7_R4,C
	rlc	a
	mov	D6_R3,C
	rlc	a
	mov	D5_R2,C
	rlc	a
	mov	D4_R1,C
InitDispl1:
	MOV	A,#120
	acall	Delay		; Prodleva
	djnz	r1,InitDispl1
	SETB	LCD_E		; zápis do displeje
	nop
	CLR	LCD_E

	ret

; *********************
; Převod bin - bcd @r0 -> @r1

bin_bcd:
	mov	a,@r0
	mov	r3,a
	inc	r0
	mov	a,@r0
	mov	r4,a
	inc	r0
	mov	a,@r0
	mov	r5,a
	dec	r0
	dec	r0

	mov	r2,#23
	ajmp	RealBcdS

; *********************
; Převod real - bcd @r0 -> @r1

realbcd:
	; Mantisa do r3..5
	mov	b,r0		; Schovat adresu
	mov	a,@r0
	mov	r3,a
	inc	r0
	mov	a,@r0
	mov	r4,a
	inc	r0
	mov	a,@r0
	mov	r6,a
	orl	a,#80h
	mov	r5,a
	inc	r0

	; Exponent do r2
	mov	a,r6
	rlc	a
	mov	a,@r0
	rlc	a
	mov	f0,c		; Znaménko
	add	a,#256-127
	mov	r2,a
	mov	r0,b

RealBcdS:
	; Vynulovat - nachystat výsledek
	mov	b,r1		; schovat adresu výsledku
	mov	r6,#4
	clr	a
realbcd1:
	mov	@r1,a
	inc	r1
	djnz	r6,realbcd1
	mov	r1,b		; Vyzvednout adresu výsledku

realbcdc:
	mov	a,r2
	rlc	a		; Pokud je exponent men?í ne? nula
	jc	realbcdk	;  tak konec.
	; posun bitu do CY
	mov	a,r3
	rlc	a
	mov	r3,a
	mov	a,r4
	rlc	a
	mov	r4,a
	mov	a,r5
	rlc	a
	mov	r5,a

; Přičtení ve výsledku
	mov	b,r1
	mov	r6,#4
realbcdd:
	mov	a,@r1
	addc	a,acc
	da	a
	mov	@r1,a
	inc	r1
	djnz	r6,realbcdd
	mov	r1,b
	dec	r2
	ajmp	realbcdc
realbcdk:

	ret

; ************************
; inicializace

init:
	clr	c

	MOV	citca,#48

	; Inicializace displeje
	CLR	LCD_E
	CLR	LCD_RS	; RS - registr select - LCD displej
;	CLR	LCD_RW

	mov	a,#30h
	mov	r1,#20	; casova prodleva
	acall	InitDispl

	mov	a,#30h
	mov	r1,#5		; casova prodleva
	acall	InitDispl

	mov	a,#30h
	mov	r1,#1		; casova prodleva
	acall	InitDispl

	mov	a,#20h
	mov	r1,#1		; časová prodleva
	acall	InitDispl

	MOV	TMOD,#01010010b
	CLR	A
	MOV	IE,A
	MOV	IP,A
	MOV	TL0,a
	MOV	TH0,#256-64	; přeru?ení 14400 Hz

	SETB	ET0		; povolit přeru?ení T0
	SETB	ET1		; povolit přeru?ení T1
	setb	pt1		; vy??í priorita T1

	SETB	EA		; povolit přeru?ení

	SETB	TR0		; zapnuti casovace
	SETB	TR1		; zapnuti citace

	MOV	A,#120
	acall	Delay		; Prodleva
	MOV	A,#28H	; Nastavit LCD na 2 řádky
	acall	ChOut
	MOV	A,#120
	acall	Delay		; Prodleva
	MOV	A,#kurzof	; LCD on, Cursor off, Blink off
	acall	ChOut
	MOV	A,#06H	; inkrement, S=0
	acall	ChOut

	; Naloudovat znak mikro
	mov	a,#40h		; 
	acall	NasKurzor		; 
	mov	a,#00000000b	; §   §
	acall	ChOut			; §   §
	mov	a,#00000000b	; §   §
	acall	ChOut			; §  §§
	mov	a,#00010001b	; §§§ §
	acall	ChOut			; §
	mov	a,#00010001b
	acall	ChOut
	mov	a,#00010001b
	acall	ChOut
	mov	a,#00010011b
	acall	ChOut
	mov	a,#00011101b
	acall	ChOut
	mov	a,#00010000b
	acall	ChOut

        MOV     A,#80H  ; Kurzor na 1. řádek, 1. znak
        acall   NasKurzor

	clr	nulovano

; Nastavení hodnot:
	; C2= 1005pF
	mov	C2real,#4Bh
	mov	C2real+1,#20h
	mov	C2real+2,#8Ah
	mov	C2real+3,#30h

	ret

; ************* Přeru?ení od časovače T0
	; Přeru?ení jednou za 64 cyklů, to je
	;  11059200 / 12 / 64 = 14400 Hz.

intt0:
	DJNZ	citca,IntT02
	MOV	citca,#36
	DJNZ	citc1s,IntT02
	MOV	citc1s,#100

	push	acc
	push	psw

	clr	a
	xch	a,tl1		; 
	mov	F2real,a	; ulo?ení změřené frekvence
	clr	a
	xch	a,th1
	mov	F2real+1,a
	clr	a
	xch	a,RozCas
	mov	F2real+2,a
	setb	zmereno

	pop	psw
	pop	acc

IntT02:

	RETI

; *********** Zobrazení hex bytu
prthex:
	clr	f0
	MOV	R3,#2		; Ka?dý byte dvakrát
prthex2:
	push	acc
	ANL	A,#0F0H	; Jednu půlku
	SWAP	A
	ADD	A,#'0'	; z BCD na ASCII
	PUSH	ACC
	CLR	C
	SUBB	A,#':'
	POP	ACC
	JC	prthex1
	ADD	A,#7		; Pokud je více ne? 9
prthex1:
	acall	ChOut
	jnb	f0,prthex3
	mov	a,r3
	jb	acc.0,prthex3
	mov	a,#'.'
	acall	ChOut
prthex3:
	pop	acc		; Je?tě druhou půlku
	SWAP	A
	DJNZ	R3,prthex2

	ret

; ************** Výstup znaku na LCD po 4 bitech
ChOut:
        PUSH    ACC
        MOV     A,#5
        acall   Delay
        POP     ACC
        rlc     a
        mov     D7_R4,C
        rlc     a
        mov     D6_R3,C
        rlc     a
        mov     D5_R2,C
        rlc     a
        mov     D4_R1,C
        nop
        SETB    LCD_E
        nop
        CLR     LCD_E
        rlc     a
        mov     D7_R4,C
        rlc     a
        mov     D6_R3,C
        rlc     a
        mov     D5_R2,C
        rlc     a
        mov     D4_R1,C
        nop
        SETB    LCD_E
        nop
        CLR     LCD_E
        RET

; Časová prodleva 10 cyklů krát hodnota v ACC, co? je
;  při 12Mhz 10 mikrosekund.
Delay:
        PUSH    ACC
        MOV     A,#02H
        MOV     A,#01H
Delay1:
        DJNZ    ACC,Delay1
        POP     ACC
        DJNZ    ACC,Delay
        RET

	end
