Autor Wątek: konwersja z liczb hex na bin  (Przeczytany 4066 razy)

mgsm33

  • Nowy u
  • *
  • Wiadomości: 1
    • Zobacz profil
konwersja z liczb hex na bin
« dnia: Grudzień 03, 2013, 16:29:56 »
Witam,
mam program prostego zegara ( pod 8051), w którym dodawanie sekund czy minut polega na komendzie INC. Dane pokazywane są na portach ( P0 sec, P1 min, P2 godz) w formacie binarnym. W zasadzie rozumiem diałanie mechanizmu, natomiast nie ogarniam cześci " konwersja" - z elementami dzielenia przez 100, 10 i zamiany tetrad a akumulatorze.
Kiedy usunąłem część " konwersja" zegar działa, tylko nie liczy od 0 do 9 tylko od 0 do A. Sprawdziłem sobie steep by step w programie Edsim51.
Wstawiam ten kawałek do liczenia + skok "konwersja.  Chodzi mi o wytłumaczenie zasady działania tych bloków. Ucze się asemblera dopiero od 2 tygodni.

Dzieki za wszelką pomoc


petla:
   mov a,r0   ; przepisz rejestr R0 do akumulatora
   lcall konwersja
   mov p0,r5   ; przepisz rejestr R5 do portu P0
   mov a,r1   ; przepisz rejestro R1 do akumulatora
   lcall konwersja
   mov p1,r5   ; przepisz rejestr R5 do portu P1
   mov a,r2   ; przepisz rejestr R2 do akumulatora
   lcall konwersja
   mov p2,r5   ; przepisz rejestr R5 do portu P2
   
   inc r0      ; powiększ warość rejestru R0 o 1


   
   cjne R0,#3cH,nie ; sprawdź czy rejestr R0 ma wartość 60D ( 3CH )
            ;jesli tak
   mov R0,#0h    ; zerujemy rejestr sekund R0
   inc R1       ; powiększ wartość rejestr minut R1 o 1
   mov P0,#0h    ; zerujemy port sekund
   

   cjne R1,#3ch,nie ;sprawdzamy czy rejestr minut R1 ma wartość 60D (3CH)
   inc r2        ; powiększamy rejestr godzin R2  o 1
   mov r1,#0h     ; zerujemy rejestr R1 (minut)
   mov r0,#0h     ; zerujemy rejestr R0 (sekund)
   cjne R2,#18h,nie ; sprawdzamy czy rejestr godzin R2 ma wartość 24D
   mov R0,#0h    ; zerujemy rejestr sekund    
   mov R1,#0h    ;zerujemy rejestr minut
   mov R2,#0h    ;zerujemy rejestr godzin
   

   nie:
      jmp petla   ; jeśli nie, skok do etykiety PETLA   
      ret      ;powrót z procedury
      
   konwersja:

       clr c      ;zerujemy flagę C
                mov b,#100      ;wpisujemy do rejestru B wartość 100D
                div ab      ;dzielimy wartość akumulatora przez 100D
                mov r4,a        ;przepisujemy wartość akumulatora do R4       ;  //save MSB in R0
                clr c      ;zerujemy flagę C
                mov a,b      ; wpisujemy do akumulatora watośc rejestru B
                mov b,#10       ;wpisujemy do rejestru B wartość 10D                           ;/Divide by 10   
                div ab      ;dzielimy wartość akumulatora przez 10
                swap a      ;zamiana połówek adresu (LSB z MSB) w akumulatorze
                mov r5,a   ;przepisz zawartość akumulatora do rejestru R5
                         
                    ; //save the tens place in the Higher nibble
                mov a,b
                orl a,r5   ;suma logiczna A i R5
                mov r5,a        ;przepisz zawartość A do rejestru R5      ;// save the tens place in the Lower nibble
            
                ret      ;powrót z procedury

Nevar

  • Administrator
  • Nowy u
  • *****
  • Wiadomości: 24
    • Zobacz profil
Odp: konwersja z liczb hex na bin
« Odpowiedź #1 dnia: Grudzień 04, 2013, 12:37:03 »
Co prawda nie jestem ekspertem od tego procka, ale działa to podobnie we wszystkich.

Procedura "konwersja" robi normalną zamianę liczby szesnastkowej na dziesietną.
Chodzi jak wiadomo o to, że rejestry są binarne lub szesnastkowe jezeli bierzemy grupy po 4 bity. Konwersja hex to dec to jest zmiana zapisu tak zeby miec kolejne cyfry dziesietne zapisane oddzielnie od siebie. Zwykle jest to potrzebne np jezeli chcesz podac każdą z cyfr na inną część wyświetlacza segmentowego lub po prostu wypisać na ekran w postaci znaków ASCII.
Taki zapis oddzielny cyfr oczywiscie musi się mieścić w zakresie 0-9 bo to normalny zakres dla liczb dziesietnych i szesnastkowych jednocześnie.

Reazlizowane jest to tak:

"konwersja" przyjmuje 1 parametr w rejestrze "a" - to jest liczba ktora sklada sie max z 3 znakow dziesietnych (max: 255)
"konwersja" zwraca
w dolnej czesci R5 (4bity młodsze) ilosc jednosci liczby "a"
w gornej czesci R5 (4bity starsze) ilosc dziesiatek liczby "a"
w R4 ilosc setek liczby "a"

realizowane jest to przez serie dzieleń (np a = 245)
najpierw dzielisz a / 100 -> wynik ląduje w "a", a reszta w "b", "a" ma już liczbę setek wiec leci do R4 ( 245 / 100 => a = 2, b = 45 )
potem dzielisz reszte z poprzedniego dzialania przez 10 żeby otrzymać liczbę dziesiątek
a = b ; do a reszta z poprzedniego dzielenia ( a = 45 )
a / 10 -> wynik ląduje w "a" a reszta w "b", "a" ma liczbe dziesiatek "b" ma liczbe jednosci ( 45 / 10 => a = 4, b = 5 )
dalej już jest tylko upakowanie za pomoca "swapa" i "or" jedności i dziesiątek do jednego rejestru R5
na końcu masz R4 = 0x02, R5 = 0x45
« Ostatnia zmiana: Grudzień 04, 2013, 12:39:16 wysłana przez Nevar »