MIKROP3B.DOC

(11 KB) Pobierz
POLITECHNIKA LUBELSKA

 

POLITECHNIKA LUBELSKA

KATEDRA ELEKTRONIKI

 

 

 

 

 

 

LABORATORIUM PODSTAW SYSTEMÓW MIKROPROCESOROWYCH

 

 

 

 

 

 

 

 

 

SPRAWOZDANIE Z ĆWICZENIA NR. 3B

 

 

 

 

 

“OPERACJE ARYTMETYCZNE.”

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Wykonali:   Remigiusz Gwiazda     ED 5.4

                     Paweł Luty                 ED 5.4

 

 

 

Cel ćwiczenia:

Celem ćwiczenia było zapoznanie się z ze sposobami wykonywania podstawowych operacji arytmetycznych oraz konwersji formatów stosowanych w mikroprocesorach rodziny 8051.

 

 

 

Zadanie 1.

W zadaniu został uruchomiony program dodający liczby zapisane w kodzie U2:

 

                 LJMP START

                 ORG 100H

 

START:     LCALL LCD_CLR

                    CLR A

                    CLR C

                    SUBB A,#1

                  MOV R0,A

                  LCALL WRITE_HEX

                  MOV A,R0

                  ADD A,#1

                  LCALL WRITE_HEX

                   SJMP $

 

a)  Modyfikacja powyższego programu polegająca na tym, że dodaje on liczbę  -10 do wartośći pobranej z klawiatury:

 

        LJMP    START

        ORG     100H

START:

 

        LCALL   LCD_CLR

LOOP:

        CLR     A                                ;zeruj A

        CLR     C                                ;zeruj C

        SUBB    A,#10                       ;A <- 0-10 = -10

        MOV     R0,A                       ;zapamiętaj w R0

        LCALL   WAIT_KEY

        ADD     A,R0                         ;dodaj liczbę z klawiatury do -10

        LCALL   WRITE_HEX          ;wyświetl wynik

        LJMP    LOOP

 

Powyższy program najpierw zapisuje do akumulatora liczbe -10 poprzez odjecie liczby 10 od 0, a następnie po zachowaniu tej liczby w R0 dodaje ją do drugiej liczby pobranej z klawiatury. Wskaźnik C jest zerowany ponieważ instrukcja SUBB używa tego wskaźnika i gdyby był ustawiony to wynik odejmowania byłby zły.

 

b)  Reprezentacja danych w postaci U2 umożliwia co prawda zapisywanie  liczb ujemnych , ale ma swoje wady.  Mianowicie poprzez zastosowanie tego zapisu zakres używanych liczb zmniejsza się dwukrotnie, np. jeżeli w naturalnym kodzie binarnym można zapisać na jednym bajcie liczbę z zakresu 0-255, to w kodzie U2 można zapisać liczbę z zakresu -128-127. Aby więc nie popełnić błędu podczas programowania należy pamiętać w jakiej postaci dane są zapisane tzn. jak ma traktować je dany program.

 

Zadanie 2.

Przeanalizowany został następujący program sumujący liczby w postaci BCD:

                   LJMP START

                   ORG 100H

START:      LCALL LCD_CLR

                   LCALL WAIT_KEY

                   MOV B,#10

                   DIV AB

                   SWAP A

                   ADD A,B

                   MOV R0,A

                   LCALL WRITE_HEX

                   MOV A,#’+’

                   LCALL WRITE_DATA

                   LCALL WAIT_KEY

                   MOV B,#10

                   DIV AB

                   SWAP A

                   ADD A,B

                   MOV R1,A

                   LCALL WRITE_HEX

                   MOV A,#’=‘

                   LCALL WRITE_DATA

                   MOV A,R0

                   ADD A,R1

                   DA A

                   LCALL WRITE_HEX

                   SJMP $

 

a) Podczas wykonywania programu rejestry po wykonywaniu instrukcji DIV w akumulatorze pojawia się wynik dzielenia ,a w rejestrze B reszta z dzielenia. Dla liczb 0-9 zawsze więc będzie to 0 w ACC, a w B wpisana liczba.Pozostałe instrukcje modyfikuja obydwa rejestry w sposób nie wymagający komentarza.

 

b) Modyfikacja programu polegająca na tym ,że program mnoży liczby w postaci BCD:

 

              LJMP    START

              ORG     100H

START:

 

        LCALL   LCD_CLR

 

        LCALL   WAIT_KEY        ;pobierz pierwszy czynnik

        ACALL   TOBCD                    ;zamień na BCD

        MOV     R0,A                     ;zapamiętaj w R0 (BCD)

        LCALL   WRITE_HEX        ;wypisz na LCD

 

       MOV     A,#'*'                     ;znak mnożenia

        LCALL   WRITE_DATA    ;wyświetl jako znak

 

        LCALL   WAIT_KEY        ;pobierz drugi czynnik

        ACALL   TOBCD                    :zamień na BCD

        MOV     R1,A                     ;zapamiętaj w R1 (BCD)

        LCALL   WRITE_HEX       ;wypisz na LCD

 

        MOV     A,#'='                    ;znak równości

        LCALL   WRITE_DATA    ;wyświetl jako znak

 

        MOV     A,R0                    ;pierwszy czynnik do A

        MOV     B,R1                   ;dodaj drugi czynnik

        MUL     AB                       ;mnóż

                            

        ACALL   TOBCD                  ;zamień na BCD

        LCALL   WRITE_HEX       ;wypisz wynik na LCD

        LCALL   WAIT_KEY

        LJMP    START

 

TOBCD:                                      ;podprogram zamiany na BCD

        MOV B,#10

        DIV AB

        SWAP A

        ADD A,B

        RET

 

Powyższ program działa w sposób bardzo podobny do poprzedniego przykładu. Pobiera obydwa czynniki z klawiatury i od razu zamienia je na kod BCD za pomocą podprogramu TOBCD. Podprogram ten ma strukturę taką samą jak część kodu w poprzednim przykładzie. W miedzyczasie obydwa czynniki są zapamiętywane w rejestrach, a na końcu wykonuje się ich mnożenie po czym znów zamienia się na BCD. Program działa tylko dla liczb 0-9 co jest zrozumiałe ,gdyż nie można zapisać w postaci BCD dwucyfrowej liczby na jednym półbajcie.

 

 

Zadanie 3.

Program dokonujący konwersji z BCD do BIN:

 

BCD      EQU 20H                           ; komórka zawierająca daną w kodzie BCD

BIN      EQU 21H                            ; komórka zawierająca daną w kodzie NB (wynik wykonania       

                                                         ;  programu)

               LJMP START

               ORG 100H

START:  LCALL LCD_CLR

               MOV BCD,#00111001B    ; przykładowo konwersja będzie dokonana na liczbie 39

               MOV A,BCD

               LCALL WRITE_HEX

               MOV R0,#BCD                 ; do R0 adres komórki z daną wejsciową

               MOV R1,#BIN                  ; do R1 adres komórki z daną wyjsciową

               ACALL BCD2BIN            ; zamień na postać binarną

               MOV A,#'='

               LCALL WRITE_DATA

               MOV A,BIN

              LCALL WRITE_HEX

              SJMP $

 

BCD2BIN:

                MOV @R1,#0                ; wyczyść komórkę BIN

                MOV A,@R0                 ; BCD do ACC

                SWAP A                        ; zamień połówki

                ANL A,#0FH                 ; wyzeruj mniej znaczącą cyfrę

                JZ BCD2BIN1               ; jeśli starsza cyfra jest zerem to skocz dalej

                MOV R2,A                    ;  w R2 ilość powtórzeń                           

                CLR C

BCD2BIN2:

                MOV A,@R1                ; BIN do ACC

                ADDC A,#10                  

                MOV @R1,A                ; wynik do BIN

                DJNZ R2,BCD2BIN2    ; dodawaj 10 tyle razy ,ile wynosi starsza cyfra

BCD2BIN1:

                MOV A,@R0                ;BCD do ACC

                ANL A,#0FH                 ; wyzeruj starszą cyfrę

                ADD A,@R1                  ; dodaj do BIN

                MOV @R1,A                 ; wynik do BIN

                RET

Zasada działania programu jest bardzo prosta. Program pobiera daną w postaci BCD , a następnie wydziela z niej starszą cyfrę i sprawdza czy jest ona różna od 0. Jeśli tak to dodaje do siebie tyle razy liczbę 10 ile wynosi starsza cyfra danej wejściowej . Natomiast jeśli starsza cyfra jest zerem to program bezpośrednio zajmuje się tylko młodsza cyfrą i zapisuje ją do komórki BIN jako wynik.

 

 

Zgłoś jeśli naruszono regulamin