Jste zde

LC-metr s 89C2051- popis programu

Originální článek o konstrukci : LC-metru
s 89C2051

Formát datového typu REAL (číslo s pohyblivou desetinnou čárkou)

Číslo s pohyblivou desetinnou čárkou, respektive dvojkovou čárkou, je uloženo ve čtyřech bytech. Je vyjádřeno jako

číslo = (-1) ^ S * 1 + m* 2 ^ (e – 127).

S je znaménko 1 bit,
e je exponent 8 bit,
m je mantisa 23 bit.

Následující tabulka ukazuje rozmístění jednotlivých bitů v 32 bitovém slově.

Číslo bitu
Hodnota
Znaménko S
31 
 
Exponent e
30 
2 ^ 7 
... 
... 
... 
Exponent e
24 
2 ^ 1 
Exponent e
23 
2 ^ 0 
Mantisa m
22 
2 ^ –1 
... 
... 
... 
Mantisa m
1
2 ^ –22 
Mantisa m
2 ^ –23 

Exponent může nabývat hodnot 1 až 254, ofset exponentu je 127. Ofset je použitý pro záporný exponent. S ofsetem může tedy exponent nabývat hodnot –126 až 127.

Znaménko má pro záporné číslo hodnotu 1, pro kladné číslo hodnotu 0.

Rozsah hodnot:

Nejmenší číslo = 1.0 * 2 ^ (-126) = 1.175495 E-38 a
Největší číslo = 2 – 2 ^ (-23) * 2 ^ 127 = 3.402823 E+38
Číslo nula je vyjádřeno jako e = m = 0,
Nekonečno je vyjádřeno jako e = 255 a m = 0.

Příklady:

10.0

Hexadecimální tvar čísla real je 41200000H, to je binárně 01000001 00100000 00000000 00000000, to je S=0, e=130, m=2^(-2), takže 1+0.25 * 2^(130-127)= 1.25*8=10

4p2=39.47841760436

Hexadecimální tvar čísla real je 421DE9E6H, to je binárně 01000010 00011101 11101001 11100110, to je S=0, e=132, m= 1960422*2^(-23), takže 1+ 0,2337005138397 * 2^(132-127)= 1.2337005138397*32= 39.47841644287

 

PROGRAM PRO uP


 
;Stazeno z www.HW.cz 
;        Autorem tohoto SW je Jiri Recek -  j_recek@del.cz
            $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
            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	68	; kapacita kalibračního kondenzátoru
            C1real	data	72	; kapacita kondenzátoru C1
            L1real	data	76	; Indukčnost cívky L1
            ; *********** 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
            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
            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
            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
            ; 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
            ; ********* Print - Adresa textu v DPTR, počet znaků v ACC
            Print:
            PUSH    ACC
            CLR     A
            MOVC    A,@A+DPTR
            acall   ChOut
            INC     DPTR
            POP     ACC
            DJNZ    ACC,Print
            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
            
;Stazeno z www.HW.cz 
;        Autorem tohoto SW je Jiri Recek -  j_recek@del.cz 

DOWNLOAD 

Hodnocení článku: