SPRAWOZDANIE Z LABORATORIUM

PODSTAW TECHNIKI MIKROPROCESOROWEJ

Ocena:

bienieck

-termin-

-data-

1. Cel zajęć

Wykonany na laboratoriach program miał za zadanie obsługiwać 16. klawiszową klawiaturę matrycową podłączoną do zestawu ZD537 złączem JP1 (Rys. 1.). Klawiatura obsługiwana jest metodą skaningową. Metoda ta wymaga wysterowania linii portu P5 (P5.4 ÷ P5.7) wartością zera logicznego, a następnie odczytaniu bitów P7

(P7.3 ÷ P7.0).

Rys. 1. Schemat klawiatury do zestawu ZD537

2. Kod źródłowy

P5 EQU 0F8H

;stworzenie symbolu P5 i nadanie mu konkretnej wartości

P7 EQU 0DBH

;stworzenie symbolu P7 i nadanie mu konkretnej wartości

;gdzie 0F8H i 0DBH są adresami kolejno portów P5 oraz P7

LJMP START

;długi bezwarunkowy skok do etykiety START

ORG 0100H

;miejsce w pamięci od którego zacznie być alokowany nasz program

START:

;===============================================================================

MOV R6, #0000$0000B

;zerujemy R6

PETLA_POCZATEK:

;SCZYTYWANIE AKTUALNIE WCIŚNIĘTEGO KLAWISZA

;………………………………………….. WIERSZ 1…………………………………………..

MOV P5, #0111$1111B ;uruchomienie wiersza 1.

MOV B, P5

;umieszczenie zawartości P5 w B (potrzebne do uzyskania kodu skaningowego)

MOV A, P7 ;sczytuje uruchomiony (wciśnięty) numer kolumny

CPL A

;neguje zawartość A (potrzebne do uzyskania kodu skaningowego)

XRL A,B ;operacja XOR na negowanym P7 i P5 (uzyskania kodu skaningowego) MOV R7, A

A

;umieszczenie kodu skaningowego w R7

;……………………………………………………….…………………………………………..

1

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;ZAMIANA KODU SKANINGOWEGO NA WŁAŚCIWY KOD KLAWISZA

CJNE R7, #0111$0111B, DALEJ1 ;porównanie kodu skaningowego zapisanego w R7 z wartością dla pierwszego MOV R6, #0000$0001B

;klawisza; jeżeli się zgadza to umieszcza w R6 właściwą wartość przypisaną

;klawiszowi w zapisie HEX i skacze do etykiety KONIEC (jeżeli się nie zgadza

JMP KONIEC

;to skacze do etykiety DALEJ1 gdzie porównuje dalej)

DALEJ1:

;(umieszczone poniżej porównania działają analogicznie do pierwszego)

CJNE R7, #0111$1011B, DALEJ2

MOV R6, #0000$0010B

JMP KONIEC

DALEJ2:

CJNE R7, #0111$1101B, DALEJ3

MOV R6, #0000$0011B

JMP KONIEC

DALEJ3:

CJNE R7, #0111$1110B,DALEJ4

MOV R6, #0000$1010B

JMP KONIEC

DALEJ4:

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;………………………………………….. WIERSZ 2…………………………………………..

;(procedura sczytania wciśniętego klawisza i uzyskania kodu skaningowego

;analogiczna do tej pokazanej dla wiersza 1.)

MOV P5, #1011$1111B

;uruchomienie wiersza 2.

MOV B, P5

MOV A, P7

CPL A

XRL A,B

MOV R7, A

;……………………………………………………….…………………………………………..

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CJNE R7, #1011$0111B,DALEJ5

MOV R6, #0000$0100B

JMP KONIEC

DALEJ5:

CJNE R7, #1011$1011B,DALEJ6

MOV R6, #0000$0101B

JMP KONIEC

DALEJ6:

CJNE R7, #1011$1101B,DALEJ7

MOV R6, #0000$0110B

JMP KONIEC

DALEJ7:

CJNE R7, #1011$1110B,DALEJ8

MOV R6, #0000$1011B

JMP KONIEC

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;~~~~~~~~~~~~~~~~~~~~~~~~

PETLA_POSREDNIA:

;jest to pośrednia część skoku JZ z końca programu

JMP PETLA_POCZATEK

;należało wykonać przeskok stopniowo ponieważ przekroczono zasięg skoku JZ

;~~~~~~~~~~~~~~~~~~~~~~~~

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;………………………………………….. WIERSZ 3…………………………………………..

;(procedura sczytania wciśniętego klawisza i uzyskania kodu skaningowego

;analogiczna do tej pokazanej dla wiersza 1.)

DALEJ8:

MOV P5, #1101$1111B

;uruchomienie wiersza 3.

MOV B, P5

MOV A, P7

CPL A

XRL A,B

MOV R7, A

;……………………………………………………….…………………………………………..

2

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CJNE R7, #1101$0111B,DALEJ9

MOV R6, #0000$0111B

JMP KONIEC

DALEJ9:

CJNE R7, #1101$1011B,DALEJ10

MOV R6, #0000$1000B

JMP KONIEC

DALEJ10:

CJNE R7, #1101$1101B,DALEJ11

MOV R6, #0000$1001B

JMP KONIEC

DALEJ11:

CJNE R7, #1101$1110B,DALEJ12

MOV R6, #0000$1100B

JMP KONIEC

DALEJ12:

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;………………………………………….. WIERSZ 4…………………………………………..

;(procedura sczytania wciśniętego klawisza i uzyskania kodu skaningowego

;analogiczna do tej pokazanej dla wiersza 1.)

MOV P5, #1110$1111B

;uruchomienie wiersza 4.

MOV B, P5

MOV A, P7

CPL A

XRL A,B

MOV R7, A

;……………………………………………………….…………………………………………..

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CJNE R7, #1110$0111B,DALEJ13

MOV R6, #0000$1111B

JMP KONIEC

DALEJ13:

CJNE R7, #1110$1011B,DALEJ14

MOV R6, #0000$0000B

JMP KONIEC

DALEJ14:

CJNE R7, #1110$1101B,DALEJ15

MOV R6, #0000$1110B

JMP KONIEC

DALEJ15:

CJNE R7, #1110$1110B,KONIEC

MOV R6, #0000$1101B

KONIEC:

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;……………………………………………………….…………………………………………..

MOV A, P1

;umieszczenie w akumulatorze zawartości P1 (diody)

SUBB A, R6

R

;różnica zawartości akumulatora i R6 (sprawdzenie czy w R6 jest to samo co na P1) JZ

J PETLA_POSREDNIA

;gdy zawartość A jest równa 0 to skaczemy na początek (trzeba skoczyć stopniowo)

;gdy klawisz jest puszczony to zawartość R7 nie ulega zmianie więc diody nie gasną

;WYŚWIETLENIE CYFRY Z KLAWISZA NA DIODACH

;……………………………………………………….…………………………………………..

MOV A, R6

R

;umieszczenie w akumulatorze wartości wciśniętego klawisza

CPL A

;negacja zawartości A (bo zapalamy zerem)

MOV R5, A

MOV P1, R5

R

;zaświecenie diod odpowiadających liczbie zawartej w R6

;……………………………………………………….…………………………………………..

;===============================================================================

JMP PETLA_POCZATEK

;nieskończona pętla programu

END START

3

3. Działanie programu

Poniżej przedstawiono zasadę działa programu na konkretnym przykładzie tj. jak zachowa się zestaw ZD537 gdy po uruchomieniu programu wciśnie się klawisz 7.

1. Uruchomiony zostaje pierwszy wiersz przez umieszczenie pod adresem portu P5 wartości 0111 1111.

2. Po uruchomieniu wiersza pierwszego zostaje sczytana wartość bajtu znajdującego się pod adresem portu P7, odpowiedzialnego za kolumny. Jako że jest wciśnięty klawisz „7" będący w trzecim wierszu to zostaje sczytana wartość 1111 1111 odpowiadająca stanowi w którym żaden klawisz nie został wciśnięty.

3. Wartości z P5 i P7 zostają przechwycone do akumulatorów, a następnie zostają wykonane na nich operacje logiczne mające na celu uzyskanie kodu skaningowego.

a. Zawartość P7 zostaje poddana negacji i umieszczona do A, zatem w A będzie wartość 0000 0000, b. Zawartość P5 zostaje umieszczona w B, więc w B jest wartość 0111 1111,

c. Wykonanie alternatywy wykluczającej dla A i B daje w wyniku wartość 0111 1111 i ta wartość jest umieszczona w rejestrze R7.

4. Teraz następuje blok zamiany kodu skaningowego klawisza na właściwy kod klawisza (czyli ten który widnieje na klawiszu). Jako że nie uzyskano w pierwszym wierszu kodu skaningowego żadnego klawisza (bo nie został wciśnięty klawisz w tym wierszu) to sprawdzany zostaje wiersz drugi (opis bloku zamiany kodu skaningowego w dalszej części).

5. Wiersz drugi jest sprawdzany analogicznie jak wiersz pierwszy z tą różnicą, że w akumulatorze B pojawi się wartość 1011 1111 (wpisana również pod adres portu P5) odpowiedzialna za włączenie wiersza drugiego. Operacja XOR w tym momencie da wynik 1011 1111 co również nie jest kodem skaningowym żadnego klawisza (bo nie został wciśnięty klawisz w wierszu drugim).

6. Uruchomiony zostaje wiersz trzeci przez umieszczenie pod adresem portu P5 wartości 1101 1111. W

wierszu trzecim znajduje się wciśnięty klawisz 7., zatem z adresu portu P7 zostaje sczytana wartość 1111

0111.

7. W akumulatorze A jest teraz wartość 1111 0111, oraz w akumulatorze B wartość 1101 1111.

8. Po wykonaniu operacji z punktu 3 otrzymujemy wartość 1101 0111 i jest to kod skaningowy klawisza 7.

Kod ten umieszczony jest w rejestrze R7.

9. Teraz następuje blok zamiany kodu skaningowego, który zostanie wykonany poprawnie gdyż został

wciśnięty klawisz i uzyskano poprawny kod skaningowy.

10. Porównanie CJNE zawartości R7 i wartości 1101 0111 spowoduje umieszczenie w rejestrze R6 liczby 0000 0111 odpowiadającej liczbie 7DEC. Po wykonaniu tej operacji nie potrzeba wykonywać sprawdzania kolejnych wierszy więc wykonywany jest skok w miejsce gdzie kończą się bloki sprawdzające wiersze oraz zamieniające kod skaningowy na NKB.

11. Teraz wykonywana jest operacja mająca na celu sprawdzanie czy został zmieniony stan rejestru R6. Jeżeli tak to zostają zapalone diody wyświetlające bieżącą zawartość R6, jeżeli nie to wykonywany jest skok na początek bloków sprawdzających wiersze. Skok ten należy wykonać stopniowo gdyż skok warunkowy JZ

ma ograniczony zasięg. W zaistniałym przypadku w R6 jest wartość 0000 0111, a w A jest wartość 0000

0000. Różnica A i R6 nie da w wyniku 0 więc nie zostaje wykonana pętla JZ. Następnie zapalane są diody przez umieszczenie pod adres portu P1 liczby 0000 0111 (w następnym przejściu różnica da w wyniku 0

bo w A będzie to co w P1 więc nie będzie wykonywana operacja umieszczania wartości rejestru R6 pod adres portu P1, tylko będzie wykonywana pętla sprawdzająca czy został wciśnięty inny klawisz).

12. Gdy puści się klawisz stan rejestru R6 nie ulega zmianie do czasu wciśnięcia kolejnego klawisza. Jest tak dla tego, że gdy nie jest wciśnięty żaden klawisz to w R7 jest wartość xxxx 1111 co nie jest kodem skaningowym klawisza..

13. Pętle te działają w nieskończoność i zmieniają zawartość adresu portu P1 odpowiedzialnego za diody zgodnie z tym który klawisz na klawiaturze został wciśnięty.

14.

Podsumowanie i wnioski

Opisana wyżej metoda obsługi klawiatury nie sprawiała problemów. Nie licząc początkowych problemów ze zrozumieniem działania klawiatury, wykonanie ćwiczenia nie było zbyt skomplikowane.

Problemem z którym nie mogliśmy sobie najdłużej poradzić był warunkowy skok JZ dla którego pojawiał

się komunikat „target out of range”. Zła interpretacja tej informacji pokierowała nas w złym kierunku.

Ostatecznie jednak rozwiązanie tego problemu również było bardzo proste, co opisałem wyżej. Zasada działania klawiatury matrycowej okazała się zdecydowanie prostsza niż wydawało się na początku i z pewnością wiedza na ten temat przyda się w przyszłości.

4