Formát datového typu REAL (číslo s pohyblivou desetinnou čárkou)
čí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
|
0
|
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 |