8594


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.



Wyszukiwarka

Podobne podstrony:
8594
8594
8594
8594
8594
8594 [crosti ru] mono

więcej podobnych podstron