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
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