Politechnika Lubelska |
Laboratorium podstaw systemów mikroprocesorowych |
|||
|
Ćwiczenie Nr 3 |
|||
Imię i nazwisko: Piotr Jurek , Tadeusz Klukowski |
Semestr 5 |
Grupa ED 5.1 |
Rok akad. 1998/99 |
|
Temat ćwiczenia: Klawiatura przeglądana sekwencyjnie Klawiatura matrycowa.
|
Data 30.11.98 |
Ocena
|
System mkrokontrolera DSM-51 wyposażony jest w dwie klawiatury:
- klawiaturę przeglądaną sekwencyjnie, w której styki każdego klawisza dołączone są do linii bufora wyboru wskaźnika LED o nazwie CSDS i do linii portu P3.5. Odczyt polega na wysłaniu do CSDS danej odpowiadającej wybranemu klawiszowi i sprawdzeniu stanu P3.5.
- klawiaturę matrycową, w której klawisze ułożone są w dwóch kolumnach. Odczyt klawisza polega na odczycie danej z bufora klawiatury (CSKB0 dla pierwszej kolumny lub CSKB1 - dla drugiej)
1) Cel ćwiczenia:
Zapoznanie się z zasadami korzystania z określonego typu klawiatury oraz realizacji programowej nad odczytem wybranych klawiszy.
2) Klawiatura przeglądana sekwencyjnie.
a)odczyt pojedyńczej linii
;************************************************;LEKCJA 7 - KLAWIATURA PRZEGLĄDANA SEKWENCYJNIE
;PRZYKťAD 1 - ODCZYT POJEDYNCZEJ LINII
;************************************************
LED EQU P1.7
KEY EQU P3.5 ;odczyt klawiatury
KEY_COD EQU 00001001B ;wybrane klawisze - 1i4
LJMP START
ORG 100H
START:
MOV R0,#CSDS ;adres wyboru klawisza
MOV A,#KEY_COD
MOVX @R0,A ;wpisz wybrane klawisze
LOOP:
MOV C,KEY ;czytaj stan klawiszy
CPL C ;neguj
MOV LED,C ;zapal diodę TEST gdy
klawisz jest naciśnięty
SJMP LOOP
Działanie tego programu polega na zapaleniu diody TEST w momencie, gdy zostanie naciśnięty klawisz 1 lub 4. Uaktywnienie innych klawiszy sprowadza się do wpisaniu jedynek na odpowiednich pozycjach stałej KEY_COD.
b)eliminacja drgań styków
;************************************************;LEKCJA 7 - KLAWIATURA PRZEGLĄDANA SEKWENCYJNIE;PRZYKťAD 3 - ELIMINACJA DRGAŃ STYKÓW;************************************************
LED EQU P1.7
KEY EQU P3.5 ;odczyt klawiatury
KEY_COD EQU 00001001B ;wybrane klawisze-1i4
LJMP START
ORG 100H
START:
MOV R0,#CSDS ;adres wyboru klawisza
MOV A,#KEY_COD
MOVX @R0,A ;wpisz wybrane klawisze
LOOP_NO:
JNB KEY,LOOP_NO ;czekaj na naciśnięcie
;klawisza
MOV A,#10 ;eliminacja drgaä styków
LCALL DELAY_MS
JNB KEY,LOOP_NO ;czy nadal naciśnięty
CPL LED ;neguj stan diody TEST
;przy naciśnięciu klaw.
LOOP_YES:
JB KEY,LOOP_YES ;czekaj na zwolnienie
;klawisza
MOV A,#10 ;eliminacja drgaä styków
LCALL DELAY_MS
JB KEY,LOOP_YES ;czy klawisz zwolniony
SJMP LOOP_NO ;powrót do pętli czekania
;na klawisz
Eliminacja drgań w powyższym programie realizowana jest poprzez zastosowanie procedury DELAY_MS, która powoduje opóźnienie reakcji programu na naciśnięcie oraz puszczenie klawisza do momentu, gdy drgania zanikną.
c)program który przegląda kolejne klawisze i wyświetla na LCD numer naciśniętego klawisza
1 ;************************************************
2 ;kolejny odczyt wszystkich klawiszy klawiatury
3 ;sekwencyjnej z eliminacją drgaä i wyświetlaniem
4 ;numeru naciśniętego klawisza na LCD
5 ;************************************************
6
7 00B5 KLAW EQU P3.5 ;odczyt klawiatury
8
9 0000: 02 01 00 LJMP START
10 0100: ORG 100H
11 0100: START:
12 0100: 7D 01 MOV R5, #01H ;wybór klawisza
13 0102: 78 30 MOV R0, #CSDS ;adres wyboru klawisza
14 0104: LOOP_K:
15 0104: ED MOV A, R5
16 0105: F2 MOVX @R0, A ;wpisz wybrany klawisz
17 0106: 30 B5 09 JNB KLAW, OBSL_K ;jeśli klaw. naciśnięty to
18 ;skocz do procedury obsługi
19 0109: ED MOV A, R5 ;wybierz nast. klawisz
20 010A: 23 RL A
21 010B: FD MOV R5, A
22 010C: 24 C0 ADD A, #192 ;zacznij od początku jeśli
23 010E: 70 F4 JNZ LOOP_K ;sprawdzone wszystkie klawisze
24 0110: 80 EE SJMP START
25 ;procedura obsługi klawisza
26 0112: OBSL_K:
27 0112: 74 0A MOV A, #10 ;odczekaj 10ms -
28 0114: 12 81 10 LCALL DELAY_MS ;eliminacja drgań styków
29 0117: 20 B5 0E JB KLAW, NIE ;sprawdź klawisz, pomiń dalsze
30 ;instrukcje, jeśli puszczony
31 011A: ED MOV A, R5
32 011B: 7A FF MOV R2, #255
33 011D: LOOP_NR:
34 011D: 0A INC R2 ;zwiększ licznik o jeden
35 011E: 13 RRC A ;obróć akumulator przez bit C
36 011F: 50 FC JNC LOOP_NR ;wyjdź z pętli jeśli C=1
37 0121: 12 81 0C LCALL LCD_CLR
38 0124: EA MOV A, R2 ;wyświetla na LCD nr klawisza
39 0125: 12 81 04 LCALL WRITE_HEX
40 0128: NIE:
41 0128: 22 RET ;wróć
2)Klawiatura matrycowa.
a)odczyt klawiszy 0 .. 7
1 ;************************************************ 2 ;LEKCJA 8 - KLAWIATURA MATRYCOWA 3 ;PRZYKŁAD 2 - ODCZYT KLAWIATURY 0..7
4 ;************************************************
5
6 0000: 02 01 00 LJMP START
7 0100: ORG 100H
8 0100: START:
9
10 0100: 12 81 0C LCALL LCD_CLR
11 0103: 78 21 MOV R0,#CSKB0 ;adres klawiszy 0..7
12
13 0105: LOOP_NO:
14 0105: E2 MOVX A,@R0 ;odczyt stanu klawiszy
15 0106: F4 CPL A
16 0107: 60 FC JZ LOOP_NO ;czy klawisz naciśnięty
17
18 0109: 7A FF MOV R2,#0FFH
19 010B: LOOP_NR: ;przekoduj nr klawisza
20 ;kod 1z8 na cyfrę 0..7
21 ;pętla będzie wykonana 1-8 razy
22 010B: 0A INC R2 ;więc R2 osiągnie wartość 0..7
23 010C: 13 RRC A ;obrót akumulatora przez C
24 ;aż odczytana 1 wsunie się do C
25 010D: 50 FC JNC LOOP_NR
26
27 010F: EA MOV A,R2 ;przekoduj nr klawisza
28 0110: 24 30 ADD A,#30H ;na kody znaków wyśw. LCD
29 0112: 12 81 02 LCALL WRITE_DATA ;wypisz kod klawisza
30
31 0115: LOOP_YES:
32 0115: E2 MOVX A,@R0 ;odczyt stanu klawiszy
33 0116: F4 CPL A
34 0117: 70 FC JNZ LOOP_YES ;czy klawisz zwolniony
35
36 0119: 80 EA SJMP LOOP_NO ;powrót do oczekiwania na naciśnięcie klawisza
zawartość akumulatora oraz R2 po wykonaniu kolejnych instrukcji zaobserwowane w trybie pracy krokowej
Adres Instrukcji |
ACC |
R2 |
105 |
FD |
00 |
106 |
02 |
00 |
107 |
02 |
00 |
109 |
02 |
FF |
10B |
02 |
00 |
10C |
01 |
00 |
10B |
01 |
01 |
10C |
00 |
01 |
10F |
01 |
01 |
110 |
31 |
01 |
b) odczyt klawiszy 8..enter
;************************************************
;LEKCJA 8 - KLAWIATURA MATRYCOWA
;PRZYKťAD 2 - ODCZYT KLAWIATURY 8..ENTER
;************************************************
LJMP START
ORG 100H
START:
LCALL LCD_CLR
MOV R0,#CSKB1 ;adres klawiszy 8..Enter
LOOP_NO:
MOVX A,@R0 ;odczyt stanu klawiszy
CPL A
JZ LOOP_NO ;czy klawisz naciśnięty
MOV R2,#0FFH
LOOP_NR: ;przekoduj nr klawisza
;kod 1z 8 na cyfrę 8..Enter
;pętla będzie wykonana 1-8 razy
INC R2 ;więc R2 osiągnie wartość 8..Enter
RRC A ;obrót akumulatora przez C
;aż odczytana 1 wsunie się do C
JNC LOOP_NR
MOV A,R2 ;przekoduj nr klawisza
ADD A,#30H ;na kody znaków wyświetlacza LCD
LCALL WRITE_DATA ;wypisz kod klawisza
LOOP_YES:
MOVX A,@R0 ;odczyt stanu klawiszy
CPL A
JNZ LOOP_YES ;czy klawisz zwolniony
SJMP LOOP_NO ;powrót do oczekiwania na
naciśnięcie klawisza
1