Krzysztof Wesołowski Programowanie, elektronika, automatyka – doświadczenia i projekty

5lis/09

Konwersje BIN/BCD w ASM 8051

Kilka prostych procedur napisanych dla znajomych z innego kierunku:

Listing:
  1. ;poniższy kod można podmienić na prezentujący inna z załączonych procedurę.
  2.  
  3. mov R0,#0x14 ;przykladowa liczba do konwersji
  4. mov R1,#0x38 ;druga czesc liczby
  5.  
  6. lcall BCD2BIN2BYTES ;procedura konwertujaca
  7.  
  8. FINISH: ;petla zapobieajaca wykonywaniu dalszej części programu.
  9.     LJMP FINISH


Konwersja 2 bajtowa:

Listing:
  1. BCD2BIN2BYTES:
  2.     ;liczba jest w R0 i R1
  3.     ;bardziej znaczacy w R0, mniej w R1
  4.     ;wynik również tam umieścimy.
  5.     mov A,R0
  6.     lcall BCD2BIN1BYTE ;konwertujemy pierwszy
  7.     mov B, #100
  8.     MUL AB         ; wynik został pomnożony razy 100
  9.     mov R2, B
  10.     mov R3, A      ; wynik mnożenia zachowany
  11.  
  12.     mov A, R1
  13.     lcall BCD2BIN1BYTE ; konwersja mniej znaczącej części
  14.     CLR C             ; dodawania z przeniesieniem
  15.     ADDC A, R3
  16.     mov R3, A
  17.     mov A, R2
  18.     ADDC A, #0
  19.     mov R0,A
  20.     mov A,R3
  21.     mov R1, A
  22. RET
Listing:
  1. BIN2BCD1BYTE: ;konwersja BIN2BCD na jednym bajcie - pochodzi z datasheetu - proste i zrozumiałe
  2.     mov B, #10
  3.     DIV AB
  4.     SWAP A
  5.     ADD A, B
  6. RET
  7.  
  8. BCD2BIN1BYTE: ; i w druga stronę
  9.     mov R7, A
  10.     ANL A,#0xF0   ; zostawiamy tylko cyfrę dziesiątek
  11.     SWAP A
  12.     mov B, #10
  13.     MUL AB
  14.     XCH A, R7       ; zamiana miejscami
  15.     ANL A, #0x0F  ; cyfra jedności
  16.     ADD A, R7
  17. RET

Komentarze wyjaśniają mniej typowe rzeczy, zaś działanie pozostałych sprowadza się praktycznie do opisu działania instrukcji. W razie niezrozumienia jakiegoś szczegółów można zapytać na mailu komentarzu.

Komentarze (2) Trackbacks (0)
  1. Czy ten program był kiedykolwiek przetestowany? W temacie jest info BIN/BCD natomiast w nazwie procesury w programie BCD2BIN2BYTES więc wygląda na to że raczej konwersja odwrotna z kodu BCD na binarny a nie jak w temacie.
    To co rzekomo pochodzi z datasheetu

    BIN2BCD1BYTE: ;konwersja BIN2BCD na jednym bajcie – pochodzi z datasheetu – proste i zrozumiałe
    mov B, #10
    DIV AB
    SWAP A
    ADD A, B
    RET

    to może jakiś trik który by należało sprawdzić ale tylko na jednym bajcie gdzie tutaj jest faktycznie w całym programie konwersja dwóch bajtów binarnych na BCD?

  2. Nie ma takiej konwersji, nie została nigdzie obiecana :)

    Jak nazwy procedur wskazują jest konwersja 1 bajtowa BCD -> BIN, 1 bajtowa BIN -> BCD, oraz dwu bajtowa BCD -> BIN.

    Jeżeli konwersja z datasheetu wygląda na „trik” i jest niezrozumiałą można obejrzeć proces konwersji w symulatorze 8051.


Trackbacks are disabled.