background image

CWICZENIE 6 

 
KLAWIATURY MATRYCOWE. KLAWIATURY 
SEKWENCYJNE. 

 

Wstep 

 

 

Jednym z podstawowych srodków komunikacji systemu mikroprocesorowego 

z uzytkownikiem jest klawiatura. Najbardziej rozpowszechnione sposoby podlaczenia 
klawiatury do mikrokontrolera polegaja na wykorzystaniu w tym celu portów. Porty jako 
uklady we/wy zapewniaja komunikacje dwukierunkowa. W mikrokontrolerze do odczytu 
danej z portu wykorzystuje sie mozliwosc zmiany stanu z 1 na 0 poprzez sygnal zewnetrzny. 
Jak z tego wynika porty sluzace do odczytu musza byc kazdorazowo ustawione w stan 1. 
Ograniczona  liczba linii w porcie nie pozwala na najprostsze rozwiazanie tzn. przypisanie 
jednego klawisza klawiatury do jednej linii w porcie. W celu powiekszenia rozmiaru 
klawiatury stosuje sie dwa popularne rozwiazania: 
- klawiature sekwencyjna - poprzez zewnetrzny bufor podlaczony do szyny mikrokontrolera 
sterowana jest jedna linia w porcie. W systemie DSM51 zorganizowana jest  klawiatura 
zlozona z szesciu przycisków [

], [Esc], [

], [

], [

], [

]. Do obslugi wybrano linie P3.5 

sterowana buforem CSDS.  
- klawiature matrycowa - w tego typu klawiaturze nastepuje podzial na kolumny i wiersze 
zapewniajace poszczególnym klawiszom indywidualne wspólrzedne po których mozna je 
rozpoznac . W systemie DSM51 klawiatura matrycowa podlaczona jest za pomoca portów 
zewnetrznych oraz    linii adresowych A0 i A1. Role

 

kolumn spelniaja tutaj linie adresowe  

A0 i A1 natomiast wierszy linie danego portu zewnetrznego. Porty zewnetrzne znajduja sie 
pod adresami 21H oraz 22H i zostaly oznaczone jako CSKB0 i CSKB1. Klawiatura 
matrycowa sklada sie z 16 klawiszy: 0, 1, 2, 3, 4, 5, 6, 7 podlaczonych do portu CSKBO 
(adres 21H) oraz 8, 9, [

], [

], [

], [

], Esc, Enter [

] podlaczonych do portu CSKB1 

(adres 22H). 
 Schematy elektryczne klawiatur zamieszczono w dodatku do tej instrukcji 
 

W cwiczeniu nalezy zapoznac sie z zasadami korzystania z okreslonego typu 

klawiatury oraz realizacjami programowymi nad odczytem wybranych klawiszy. 
 

 

 
ZADANIE 1  
 

 

 

W zadaniu 1 nalezy zaobserwowac sposób odczytu danej pojawiajacej sie 

w momencie nacisniecia uaktywnionego klawisza.  Nalezy rozpoznac adres bufora CSDS 
sterujacego klawiatura sekwencyjna

 
 

LED  EQU  P1.7 
KEY  EQU  P3.5 

 

 

 

;odczyt klawiatury 

 
;Stale uzywane w programie 
KEY_COD EQU 

00001001B 

 

;wybrane klawisze – 1 i 4 

 
 

LJMP  START 

 

ORG  100H 

START: 

background image

 
 

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 diode TEST gdy 

 

 

 

 

 

 

;klawisz  jest nacisniety 

 
 

SJMP  LOOP 

 

Wykonaj program w trybie krokowym. Zmodyfikuj podany przyklad tak by uaktywnic inne 
klawisze klawiatury sekwencyjnej. 
 
 
ZADANIE 2 

 

W zadaniu drugim zaprezentowano program eliminujacy drgania styków klawiatury 

mogace wprowadzac  bledy w odczycie. Zastosowano tu petle opóznienia czasowego, 
w trakcie której powinien ustabilizowac sie stan linii P3.5 Nalezy porównac  

 

 

LED  EQU  P1.7 
KEY  EQU  P3.5 

 

 

 

;odczyt klawiatury 

 
;Stale uzywane w programie 
KEY_COD EQU 

00001001B 

 

;wybrane klawisze-1 i 4 

 
 

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 nacisniecie 

 

 

 

 

 

 

;klawisza 

 

MOV  A,#10   

 

 

;eliminacja drgan styków 

 

LCALL 

DELAY_MS 

 

JNB 

KEY,LOOP_NO 

 

;czy nadal nacisniety 

 
 

CPL  LED   

 

 

;neguj stan diody TEST 

 

 

 

 

 

 

;przy nacisnieciu klaw. 

 
LOOP_YES: 
 

JB 

KEY,LOOP_YES  

 

;czekaj na zwolnienie 

 

 

 

 

 

 

;klawisza 

background image

 

MOV  A,#10   

 

 

 ;eliminacja drgan styków  

 

LCALL 

DELAY_MS 

 

JB 

KEY,LOOP_YES  

 

;czy klawisz zwolniony 

 
 

SJMP  LOOP_NO 

 

 

;powrót do petli czekania 

 

 

 

 

 

 

;na klawisz 

 
 

ZADANIE 3 

 
Do samodzielnego wykonania. 
Zmodyfikuj przyklad z zadania 2 tak by  w petli programowej kolejno przegladac 

w interwale czasowym 20 ms kolejne stany klawiszy.  Nalezy rozpoznawac numer 
nacisnietego klawisza a nastepnie wyswietlac go na wyswietlaczu LCD korzystajac 
z odpowiednich podprogramów.  

 
 

ZADANIE 4 

 

Podany przyklad zawiera trzy petle programowe: LOOP_NO, LOOP_NR oraz 

LOOP_YES. Pierwsza petla sluzy do ciaglego odczyt u danych z portu CSKB0. W momencie 
nacisniecia jednego z przycisków 0  - 7 poprzez wykorzystanie instrukcji JZ (skocz jesli 
wartosc akumulatora =0) nastepuje przejscie do petli nastepnej - LOOP_NR. Petla ta sluzy do 
rozpoznania numeru nacisnietego klawisza. Nalezy zwrócic uwage na instrukcje RRC A. 
Instrukcja ta sluzy do obrotu w prawo zawartosci akumulatora poprzez bit C. W trybie pracy 
krokowej nalezy zaobserwowac i zanotowac kolejne wartosci akumulatora w trakcie 
wykonywania instrukcji RRC A dla kilku róznych przycisków. W chwili zdekodowania 
numeru przycisku (gdy bit C =0) i wyswietleniu informacji o tym na wyswietlaczu LCD 
program przechodzi do trzeciej petli LOOP_YES. W petli tej rozpoznawane jest czy nadal 
pozostaje nacisniety klawisz klawiatury. Jesli wszystkie przyciski zostana zwolnione program 
powraca do petli LOOP_NO. 

 
 

 

 

LJMP   

START 

 

ORG   

100H 

START: 
 
 

LCALL 

 

LCD_CLR 

 

MOV   

R0,#CSKB0    

 

;adres klawiszy 0..7 

 

 

LOOP_NO: 
 

MOVX 

 

A,@R0  

 

;odczyt stanu klawiszy 

 

CPL   

 

JZ 

 

LOOP_NO 

 

  

;czy klawisz nacisniety 

 
 

MOV   

R2,#0FFH 

LOOP_NR:   

 

 

 

 

;przekoduj nr klawisza 

 

 

 

 

 

 

 

;kod 1z 8 na cyfre 0..7 

 

 

 

 

 

 

 

;petla bedzie wykonana 1-8 razy 

 

INC 

 

R2 

 

 

 

;wiec R2 osiagnie wartosc 0..7 

background image

 

RRC   

 

 

 

;obrót akumulatora przez C 

 

 

 

 

 

 

 

;az odczytana 1 wsunie sie do C 

 

JNC 

 

LOOP_NR 

 
 

MOV   

A,R2    

 

 

;przekoduj nr klawisza 

 

ADD   

A,#30H 

 

 

;na kody znaków wysw. LCD 

 

LCALL 

 

WRITE_DATA 

;wypisz kod klawisza 

 

 

LOOP_YES: 
 

MOVX 

 

A,@R0  

 

;odczyt stanu klawiszy 

 

CPL   

 

JNZ 

 

LOOP_YES    

 

;czy klawisz zwolniony 

 

 

 

SJMP   

LOOP_NO 

 

 

;powrót do oczekiwania na 

 

 

 

 

 

 

 

;nacisniecie klawisza 

 
Wykonaj program w trybie krokowym. Rozpoznaj adresy buforów sterujacych pierwsza 

grupa klawiszy 0 - 7. Zmodyfikuj program dla drugiej sekcji tak by wysterowac klawisze 8 - 
Enter. 

 
 

ZADANIE 5 

 
Zmodyfikuj program z zadania 4 tak by wyeliminowac drgania styków klawiatury. 

Zaproponuj algorytm programu dla obslugi calej klawiatury.