79_80.pdf

(62 KB) Pobierz
Biblioteki procedur standardowych EP4/97
Biblioteki procedur standardowych
K U R S
Biblioteki
mikroprocesorowych
procedur standardowych
I tak dotarlimy do wy¿szego
poziomu przetwarzania danych, ja-
kim s¹ wszelkiego rodzaju konwer-
sje kodów. Procedury konwersji
korzystaj¹ z czterech podstawo-
wych dzia³añ arytmetycznych,
wczeniej opisanych. Bêdziemy tu
skrupulatnie korzystaæ z procedur,
które zosta³y ju¿ opublikowane.
Procedura konwersji 2-cyfrowej
liczby BCD na 1-bajtow¹ liczbê
binarn¹ przedstawiona zosta³a na
list.1 . Zamianê realizuje siê po-
przez wielokrotne dodawanie licz-
by 10, gdy pozycja dziesi¹tek
liczby BCD jest niezerowa i na
koniec dodanie liczby jednostek.
Przeniesienie wcale tu nie wyst¹-
pi, bo kod binarny jest bardziej
pojemny od kodu BCD. Dla nas,
ludzi, kod binarny jest z kolei
mniej wygodny w interpretacji.
W kolejnych procedurach kon-
wersji wielobajtowych liczb BCD
na binarne oparto siê na dwóch
sposobach. Jednym z nich jest, jak
w przyk³adzie wy¿ej, wielokrotne
dodawanie wagi danej pozycji,
czyli 1, 10, 100, 1000 itd. ( list.
2 , list. 3 ). Drugim sposobem jest
wykorzystanie znanego z matema-
tyki wzoru Hornera, który mówi,
¿e ka¿d¹ liczbê dziesiêtn¹ (i nie
tylko) mo¿na przedstawiæ w posta-
ci wielokrotnego iloczynu jej pod-
stawy:
a n . 10 n +a n-1 . 10 n-1 +...+
a 2 . 10 2 +a 1 . 10+a 0 =((..((a n . 10+a n-1 )
10+a n-2 ) . 10+...) . 10+a 1 ) . 10+a 0
Na przyk³ad liczbê 12345 za-
piszemy jako:
(((1 . 10+2) . 10+3) . 10+4) . 10+5.
Drugi sposób znacznie upraszcza
d³ugoæ programu, ale z kolei spo-
Listing 2.
;PODPROGRAM KONWERSJI 3-BAJTOWEJ LICZBY BCD
;NA LICZBÊ 3-BAJTOW¥ NB
; WEJCIE
; DPTR-ADRES NAJSTARSZEGO BAJTU
; LICZBY BCD W XRAM
; R0 - ADRES NAJM£ODSZEGO BAJTU
; LICZBY NB W IRAM
BCD3_NB3:
MOVX A,@DPTR
ANL A,#0FH
JZ BCD3NB34
MOV R5,A
MOV R2,#00H
MOV R3,#00H
MOV R4,#64H
BCD3NB41:
MOV R6,R0REG
MOV R2,#3
CLR A
MOV R0,R6REG
LCALL ADD_3B
DJNZ R5,BCD3NB41
BCD3NB37:
BCD3NB34:
MOV @R0,A
DEC R0
DJNZ R2,BCD3NB37
MOVX A,@DPTR
SWAP A
ANL A,#0FH
JZ BCD3NB31
MOV R5,A
MOV R2,#01H
MOV R3,#86H
MOV R4,#0A0H
INC DPTR
MOVX A,@DPTR
SWAP A
ANL A,#0FH
JZ BCD3NB35
MOV R5,A
MOV R2,#00H
MOV R3,#00H
MOV R4,#0AH
BCD3NB42:
MOV R0,R6REG
LCALL ADD_3B
DJNZ R5,BCD3NB42
BCD3NB38:
MOV R0,R6REG
LCALL ADD_3B
DJNZ R5,BCD3NB38
BCD3NB35:
MOVX A,@DPTR
ANL A,#0FH
JZ BCD3NB36
MOV R2,#0H
MOV R3,#0H
MOV R4,A
MOV R0,R6REG
LCALL ADD_3B
BCD3NB31:
Listing 1.
;PODPROGRAM 1-BAJTOWEJ KONWERSJI BCD->BIN
;WEJCIE:
; R0 - SK¥D
; R1 - DOK¥D
BCD1BIN:
MOV @R1,#0
MOV A,@R0
SWAP A
ANL A,#0FH
JZ BCD1BIN1
MOV R2,A
CLR C
BCD1BIN2:
MOV A,@R1
ADDC A,#10
MOV @R1,A
DJNZ R2,BCD1BIN2
BCD1BIN1:
MOV A,@R0
ANL A,#0FH
ADD A,@R1
MOV @R1,A
RET
MOVX A,@DPTR
ANL A,#0FH
JZ BCD3NB32
MOV R5,A
MOV R2,#00H
MOV R3,#27H
MOV R4,#10H
BCD3NB36:
BCD3NB39:
RET
;PODPROGRAM 3-BAJTOWEGO DODAWANIA
; R2:R3:R4 - PIERWSZY SK£ADNIK
; R0 - ADRES NAJM£ODSZEGO BAJTU
; DRUGIEGO SK£ADNIKA I SUMY W IRAM
ADD_3B:
MOV R0,R6REG
LCALL ADD_3B
DJNZ R5,BCD3NB39
BCD3NB32:
INC DPTR
MOVX A,@DPTR
SWAP A
ANL A,#0FH
JZ BCD3NB33
MOV R5,A
MOV R2,#00H
MOV R3,#03H
MOV R4,#0E8H
CLR C
MOV A,@R0
ADD A,R4
MOV @R0,A
DEC R0
MOV A,@R0
ADDC A,R3
MOV @R0,A
DEC R0
MOV A,@R0
ADDC A,R2
MOV @R0,A
RET
BCD3NB40:
MOV R0,R6REG
LCALL ADD_3B
DJNZ R5,BCD3NB40
BCD3NB33:
Elektronika Praktyczna 4/97
79
Kolejny odcinek prezentacji
procedur dla procesorów
rodziny MCS-51 powiêcamy
przybli¿eniu rozwi¹zañ
u³atwiaj¹cych konwersjê liczb
zapisanych w ró¿nych
standardach.
Prezentowane procedury
dostêpne s¹ w sieci Internet
pod adresem
www.atm.com.pl/ ~ avt/ep
(link Nasze konto FTP).
30467790.001.png
Biblioteki procedur standardowych
Listing 3
Konwersja odwrotna, czyli za-
miana liczby binarnej na ci¹g liczb
BCD polega z kolei na wielokrot-
nym dzieleniu liczby binarnej
przez 10 i wychwytywaniu reszty
z dzielenia jako w³anie cyfr BCD.
Pierwsz¹ cyfr¹ jest najm³odsza
cyfra liczby BCD, za ostatni¹ -
najstarsza. Chcia³oby siê, ¿eby ko-
lejnoæ cyfr by³a odwrotna, co
by³oby zgodne z naszym przyzwy-
czajeniem do zapisywania liczb,
jednak jest to niemo¿liwe: w celu
uzyskania najstarszej cyfry trzeba
wykonaæ najwiêcej dzieleñ przez
10, czyli jakby wykonaæ jedno
dzielenie przez 10 n . Ta metoda zo-
sta³a zastosowana w kolejnej procedu-
rze, której listingu nie zmiecimy
ze wzglêdu na jej du¿¹ objêtoæ.
Poniewa¿ dzielenie to nic in-
nego jak wielokrotne odejmowa-
nie, innym sposobem jest oczywi-
cie zliczanie odejmowañ okrelo-
nej wagi, a¿ do momentu wykrycia
przepe³nienia. Rozpoczynamy od
pozycji z wag¹ najwiêksz¹ i od
liczby odejmujemy tê wagê tak
d³ugo, a¿ wynik bêdzie mniejszy
od wagi. Iloæ wykonanych ode-
jmowañ z wynikiem dodatnim da
nam cyfrê najstarsz¹. Od pozosta-
³ej reszty odejmujemy wagê kolej-
nej, m³odszej pozycji itd. Postêpu-
jemy tak d³ugo a¿ dojdziemy do
pozycji jednostek. Procedura reali-
zuj¹ca podany algorytm dostêpna
jest w sieci Internet.
Kolejn¹ procedur¹, która mo¿e
byæ przydatna jest procedura kon-
wersji liczby zapisanej w kodzie AS-
CII na liczbê BCD. Taka procedura
zosta³a przedstawiona na list. 4 .
Nie wymaga ona szerszego komen-
tarza, wystarczy tylko zauwa¿yæ
wy¿ej wspomniane ró¿nice.
Miros³aw Lach, AVT
Uwaga! Do tej czêci "kursu"
w Internecie dostêpne jest siedem
plików ród³owych.
; PODPROGRAM KONWERSJI LICZBY 4-BAJTOWEJ BCD
; NA 4-BAJTOW¥ NB
; WEJCIE: R0-ADRES NAJSTARSZEGO BAJTU
; LICZBY BCD
; R1-ADRES NAJM£ODSZEGO BAJTU
; LICZBY NB
; U¯YWA OBSZARU BUFOR+8:BUFOR+11 JAKO
; ROBOCZEGO,ALE GO CHRONI
KONW8BCD4B:
INC R0
MOV A,@R0
SWAP A
ANL A,#0FH
JZ K8B6
MOV R3,A
MOV BUFOR+8,#00H
MOV BUFOR+9,#00H
MOV BUFOR+10,#03H;10^3
MOV BUFOR+11,#0E8H
LCALL ADD4BUF
push bufor+8
push bufor+9
push bufor+10
push bufor+11
PUSH R1REG
MOV R2,#4
CLR A
K8B6:
MOV A,@R0
ANL A,#0FH
JZ K8B7
MOV R3,A
MOV BUFOR+8,#00H
MOV BUFOR+9,#00H
MOV BUFOR+10,#00H;10^2
MOV BUFOR+11,#64H
LCALL ADD4BUF
K8B9:
MOV @R1,A
DEC R1
DJNZ R2,K8B9
POP R1REG
MOV A,@R0
SWAP A
ANL A,#0FH
JZ K8B2
MOV R3,A
MOV BUFOR+8,#00H;10^7=10 000 000
MOV BUFOR+9,#98H
MOV BUFOR+10,#96H
MOV BUFOR+11,#80H
LCALL ADD4BUF
K8B7:
INC R0
MOV A,@R0
SWAP A
ANL A,#0FH
JZ K8B8
MOV R3,A
MOV BUFOR+8,#00H
MOV BUFOR+9,#00H
MOV BUFOR+10,#00H
MOV BUFOR+11,#0AH;10^1
LCALL ADD4BUF
K8B2:
MOV A,@R0
ANL A,#0FH
JZ K8B3
MOV R3,A
MOV BUFOR+8,#00H
MOV BUFOR+9,#0FH;10^6
MOV BUFOR+10,#42H
MOV BUFOR+11,#40H
LCALL ADD4BUF
K8B8:
MOV A,@R0
ANL A,#0FH
MOV BUFOR+8,#00H
MOV BUFOR+9,#00H
MOV BUFOR+10,#00H
MOV BUFOR+11,A
MOV R3,#1
LCALL ADD4BUF
pop bufor+11
pop bufor+10
pop bufor+9
pop bufor+8
ret
; PODPROGRAM DODAWANIA 4 BAJTÓW
; W PODPROGRAMIE KONWERSJI
; LICZBY 4-BAJTOWEJ BCD NA 4-BAJTOW¥ BCD
ADD4BUF:
K8B3:
INC R0
MOV A,@R0
SWAP A
ANL A,#0FH
JZ K8B4
MOV R3,A
MOV BUFOR+8,#00H
MOV BUFOR+9,#01H;10^5
MOV BUFOR+10,#86H
MOV BUFOR+11,#0A0H
LCALL ADD4BUF
PUSH R0REG
PUSH R1REG
mov r0,r1reg
K8B4:
MOV A,@R0
ANL A,#0FH
JZ K8B5
MOV R3,A
MOV BUFOR+8,#00H
MOV BUFOR+9,#00H;10^4
MOV BUFOR+10,#27H
MOV BUFOR+11,#10H
LCALL ADD4BUF
ADD4B1:
PUSH R0REG
MOV R1,#BUFOR+11
MOV R2,#4
LCALL AD
POP R0REG
DJNZ R3,ADD4B1
POP R1REG
POP R0REG
RET
K8B5:
walnia jego wykonanie, trzeba bo-
wiem traciæ czas na aktualizacjê
parametrów sterowania pêtlami,
wywo³ywanie podprogramów itp.
Na list. 1 liczba jest pobierana
z komórki pamiêci wewnêtrznej
o adresie zapisanym w rejestrze R0,
a wynik konwersji jest zapisywany
do komórki pamiêci wewnêtrznej
o adresie zapisanym w rejestrze R1.
Oczywicie adresy te musz¹ byæ
ró¿ne ze wzglêdu na dwukrotne
odwo³ywanie siê do tej samej
komórki pamiêci.
Za pomoc¹ procedury z list.
2 dokonywana jest konwersja dzie-
siêtnej liczby 6-cyfrowej zapisanej
jako liczba BCD, czyli mieszcz¹cej
siê w trzech bajtach. Dla odmiany
procedura ta pobiera przetwarzan¹
liczbê z pamiêci zewnêtrznej, st¹d
obecnoæ wskanika DPTR. Kon-
wersja zaczyna siê od najstarszej
cyfry, czyli od pozycji o wadze 10 5
i koñczy siê na pozycji o wadze
10 0 . Wynik konwersji jest zapisany
w pamiêci wewnêtrznej procesora
w trzech kolejnych komórkach
o adresach od [R0-2] do [R0], przy
czym R0 oznacza zawartoæ rejes-
tru R0, zapis [x] oznacza adres
komórki zapisany w rejestrze x.
Za pomoc¹ procedury z listingu
3 dokonywana jest konwersja dzie-
siêtnej liczby 8-cyfrowej zapisanej
jako liczba BCD, czyli zajmuj¹cej
cztery bajty. Dane wejciowe jak
i wynik dzia³ania procedury s¹
umieszczane w pamiêci wewnêtrz-
nej procesora.
Za pomoc¹ kolejnej procedury
mo¿na dokonaæ konwersji dziesiêtnej
liczby 5-cyfrowej zapisanej w kodzie
ASCII, mieszcz¹ca siê w piêciu baj-
tach. Ró¿nica pomiêdzy zapisem BCD
a zapisem w kodzie ASCII jest tylko
taka, ¿e zapis BCD wykorzystuje
cztery bity na zapis jednej cyfry, za
w kodzie ASCII cyfry s¹ kodowane
jako liczby od 30H do 39H. W przy-
padku kodu ASCII wystarczy wiêc
wymaskowaæ cztery starsze bity po
to, aby dostaæ kod BCD w m³odszej
tetradzie.
Listing 4
;PODPROGRAM SK£ADANIA ZNAKOW ASCII W LICZBÊ BCD
;WEJCIE:
; R0 - ADRES PRAWEGO ZNAKU
; R1 - ADRES NAJM£ODSZEGO BAJTU
; R5 - LICZBA ZNAKÓW
ASCII_BCD:
MOV A,@R0
ANL A,#0FH
MOV @R1,A
DEC R0
DJNZ R5,ASCBCD1
RET
ASCBCD1:
MOV A,@R0
ANL A,#0FH
SWAP A
ORL A,@R1
MOV @R1,A
DEC R0
DEC R1
DJNZ R5,ASCII_BCD
RET
80
Elektronika Praktyczna 4/97
30467790.002.png
Zgłoś jeśli naruszono regulamin