Vous êtes sur la page 1sur 4

Elektronika Praktyczna 3/2005

88
K C I K B A S C O M O W Y
Obsuga elementw stykowych:
przyciski, klawiatury, impulsatory,
cz 1
Z wikszoci budowanych systemw mikroprocesorowych naley
si komunikowa. A dokadniej mwic naley mie moliwo
zmiany jego parametrw pracy lub moliwo wprowadzania do
niego nowych danych. Komunikacja z systemem mikroprocesorowym
moe odbywa si w rny sposb. Ale najczciej do zmiany jego
parametrw pracy i danych su przyciski lub klawiatury. O tym
jak je obsugiwa za pomoc Bascoma piszemy w artykule.
Rys. 1.
Rys. 2.
Wymienione elementy s czsto
stosowane w systemach mikroproce-
sorowych, gdzie umoliwiaj atw
zmian parametrw lub wprowadzenie
danych do systemu. Obsuga przez
mikrokontroler przyciskw czy klawia-
tur nie jest trudna, ale przy wykorzy-
stywaniu tego typu elementw naley
mie na uwadze, e styki przyciskw
podczas ich naciskania drgaj przez
pewien czas, a nie daj - jak mona
by si spodziewa - stabilnego stanu.
Tego typu drgania mog powodowa
bdn prac systemu mikroproce-
sorowego. Nie ma z tym wikszego
problemu, gdy drgania stykw mo-
na w bardzo prosty sposb usun
programowo poprzez zastosowanie
opnienia. Poniewa z rnego typu
przyciskami czy klawiaturami wyst-
puje wiele kopotw przy prbie ich
obsugi, wic w artykule zostan
przedstawione przykady obsugi: od
pojedynczych przyciskw (z przypisa-
n jedn lub dwoma funkcjami) po-
przez klawiatury matrycowe (wane
ze wzgldu na koszty klawiatury AT)
a do czsto wykorzystywanych im-
pulsatorw, ktrych uycie upraszcza
znacznie obsug urzdzenia, a bez
wtpienia mona je zaliczy do ele-
mentw stykowych.
Pojedyncze przyciski
W przypadku niewielkiej liczby
przyciskw wystpujcych w syste-
mie mikroprocesorowym (poniej 6)
mona je doczy bezporednio do
linii portw mikrokontrolera. W przy-
padku wykorzystywania wikszej licz-
by przyciskw lepszym rozwizaniem
s klawiatury matrycowe (przyciski
poczone w matryc), gdy do ich
obsugi jest potrzebna mniejsza licz-
ba linii mikrokontrolera. Na rys. 1
przedstawiono schemat z doczonym
do mikrokontrolera jednym przyci-
skiem. Diody LED D1 i D2 zastoso-
wane zostay jako elementy sygnali-
zujce dziaanie przycisku S1. Mikro-
kontroler powinien reagowa na na-
cinicie przycisku S1, czyli na stan
niski na jego linii PB0. Aby przycisk
poprawnie pracowa linia ta musi zo-
sta skonfigurowana jako wejciowa z
wczonym rezystorem podcigajcym.
Mona take zastosowa zewntrzny
rezystor podcigajcy. W przypadku
gdyby na wejcie mikrokontrolera
po przyciniciu przycisku by poda-
wany stan wysoki (druga kocwka
przycisku doczana do linii zasila-
jcej, a nie do masy) naley lini
mikrokontrolera PB0 ustawi jako
wejciow, przy czym naley zasto-
sowa zewntrzny rezystor cigajcy
do masy. Nie naley wcza we-
wntrznego rezystora podcigajcego.
W Bascom AVR do obsugi pojedyn-
czych przyciskw mona wykorzysta
dedykowan instrukcj Debounce. Na
list. 1 przedstawiono przykadowy
program, ktry po kadym nacini-
ciu przycisku S1 gasi i zapala diod
D1. Pierwszym parametrem instrukcji
Debounce jest linia portu wejcio-
wego, do ktrej podczony zosta
przycisk. Aliasowi S1 w programie
przypisano bit 0 rejestru wejciowe-
go Pinb. Poprzez ustawienie bitu 0
rejestru Portb wczony zosta rezy-
stor podcigajcy do linii PB0. linii
sterujcej diod LED D1 take zosta
przypisany alias Led1. Aliasy niewt-
pliwie upraszczaj odwoywanie si
np. do rejestrw mikrokontrolera oraz
uatwiaj analiz programu. Drugi
parametr instrukcji Debounce okrela
na jaki stan przycisku ma odbywa
si reakcja. W przykadzie po naci-
niciu przycisku podawany jest stan
0, czyli drugim parametrem jest war-
to 0. W wymienionym przypadku z
przyciskiem podczonym do linii za-
silajcej byaby to warto 1. Nastp-
nym parametrem instrukcji Debounce
jest etykieta, do ktrej nastpi skok
po przyciniciu przycisku. Zamiast
do etykiety moe to by take skok
do podprogramu (z czego skorzysta-
no w przykadzie), ale naley wtedy
dodatkowo zawrze w instrukcji De-
bounce parametr SUB. W przykadzie
po naciniciu przycisku S1 nast-
pi skok do podprogramu Obs_s1, w
ktrej zmieniany jest na przeciwny
stan linii sterujcej diod LED. Czy-
li po kadym naciniciu przycisku
S1 dioda bdzie zapalana i gaszona.
Instrukcja Debounce nie wstrzymuje
dziaania programu i sama dba o eli-
minacje drga stykw przycisku. Czas
potrzebny na eliminacj drga stykw,
z ktrego korzysta Debounce mona
okreli za pomoc instrukcji Config
Debounce. W programie czas opnie-
89
Elektronika Praktyczna 3/2005
K C I K B A S C O M O W Y
Fot. 3.
List. 1.
Program obslugi jednego przycisku S1 za po-
moca instrukcji Debounce
Przycisk S1 umozliwia waczenie i wyaczenie
diody LED
$regle = m8def.dat
informuje kompilator o pliku
dyrektyw mikrokontrolera
$crystal = 8000000
informuje kompilator o
czstotliwosci oscylatora taktujcego mikro-
kontroler
Cong Pinb.0 = Input
linia PB0 jako wejsciowa
Cong Pinb.1 = Output
linia PB1 jako wyjsciowa
Cong Debounce = 30
okrecla czas opoznienia (30
ms) instrukcji debounce, kiedy nie bdzie
uyta ta opcja,

domylnym opnieniem jest
25 ms
Led1 Alias Portb.1
przypisanie nazwie Portb.1
nazwy Led1
S1 Alias Pinb.0
przypisanie nazwie Pinb.0
nazwy S1
Set Portb.0
dolaczenie do linii PB0 rezy-
stora podciagajacego
Do

poczatek nieskoczonej petli Do-Loop
nieskoczona ptla Do...Loop
Debounce S1 , 0 , Obs_s1 , Sub
jeli nacisniety przycisk S1,
to skok do podprogramu Obs_s1
Loop
End
koniec programu
Obs_s1:
podprogram Obs_s1
Toggle Led1
zmiana na przeciwny stanu
wyjscia sterujacego dioda LED D1
Return
powrot z podprogramu
List. 2.
Program obslugi jednego przycisku S1 za po-
moca instrukcji Debounce
Krotkie przycisniecie S1 umozliwia waczenie
i wyaczenie diody LED1
natomiast przycisniecie przycisku S1 na czas
ok 2 sekund umozliwia
wlaczenie lub wylaczenie diody LED2
$regle = m8def.dat
informuje kompilator o pliku
dyrektyw mikrokontrolera
$crystal = 8000000
informuje kompilator o
czstotliwosci oscylatora taktujcego mikro-
kontroler
Cong Pinb.0 = Input
linia PB0 jako wejsciowa
Cong Pinb.1 = Output
linia PB1 jako wyjsciowa
Cong Pinb.2 = Output
linia PB2 jako wyjsciowa
Dim Opozn As Byte
pomocnicza zmienna zliczajaca
opoznienia
Led1 Alias Portb.1
przypisanie nazwie Portb.1
nazwy Led1
Led2 Alias Portb.2
przypisanie nazwie Portb.2
nazwy Led2
S1 Alias Pinb.0
przypisanie nazwie Pinb.0
nazwy S1
Set Portb.0
dolaczenie do linii PB0 rezy-
stora podciagajacego
Do

poczatek nieskoczonej petli Do-Loop
nieskoczona ptla Do...Loop
Debounce S1 , 0 , Obs_s1 , Sub
jeli nacisniety przycisk S1,
to skok do podprogramu Obs_s1
Loop
End
koniec programu
Obs_s1:
podprogram Obs_s1
Opozn = 0
zerowanie zmiennej liczacej
opoznienia
Do
poczatek petli Do-loop
Waitms 10
opoznienie 10 ms
Incr Opozn
zwiekszenie o jeden wartosci
zmiennej opoznienia
Loop Until Opozn = 200 Or S1 = 1
jesli S1 puszczony lub zmien-
na opozn osiagnie wartosc 200 to opusc petle
If Opozn = 200 Then
jesli opozn=200 (200*10 ms)=2
sekundy to
Toggle Led2
zmiana na przeciwny stanu
wyjscia sterujacego dioda LED D2
Else
w przeciwnym razie
Toggle Led1
zmiana na przeciwny stanu
wyjscia sterujacego dioda LED D1
End If
Return
powrot z podprogramu
nia zosta okrelony na 30 ms, cho
domylnie wynosi 25 ms, co take
jest wystarczajce. Gdyby przy takim
opnieniu daway zna drgania sty-
kw mona to opnienie zwikszy.
Jeli by byo potrzebne wstrzymywa-
nie programu a do nacinicia przy-
cisku, to przed instrukcj Debounce
mona wykorzysta instrukcje wstrzy-
mujc Bitwait. W programie kady
pojedynczy przycisk mona obsuy
za pomoc instrukcji Debounce, ale
mona take to zrobi z wykorzy-
staniem instrukcji warunkowych (If...
Then) pamitajc o potrzebie elimi-
nacji drga stykw. Jest take moli-
we przypisanie do jednego przycisku
wielu funkcji, ktre bd rozpozna-
wane przykadowo po czasie jego
nacinicia. Zgodnie ze schematem
z rys. 1 niech krtkie przycinicie
przycisku naprzemiennie zapala diod
D1, a dusze (ok. 2 sekundy) niech
naprzemiennie zapala diod D2. Pro-
gram realizujcy taki dwufunkcyjny
przycisk S1 przedstawiono na list. 2.
Diodzie D2 take przypisany zosta
alias Led2. Tu do obsugi przycisku
S1 take zostaa wykorzystana in-
strukcja Debounce, ktrej czas op-
nienia eliminacj drga stykw wy-
nosi domylnie 25 ms. Po wykryciu
nacinicia przycisku nastpuje skok
do podprogramu Obs_s1, w ktrym
liczony jest czas przycinicia przy-
cisku poprzez zmienn Opozn. Czas
nacinicia przycisku liczony jest
w ptli Do...Loop poprzez zliczanie
przez zmienn Opozn opnie o
czasie 10 ms do czasu, a przycisk
S1 zostanie puszczony lub zmienna
Opozn osignie warto 200, co b-
dzie oznaczao, e przycisk zosta
przycinity na czas ok. 2 sekund
(10 ms 200). Nastpnie jest spraw-
dzany warunek i jeli Opozn wynosi
200 to stan diody D2jest zmieniany
na przeciwny, a jeli mniej (przycisk
zosta przycinity na krcej ni 2
sekundy) zmieniany jest na przeciw-
ny stan diody D1. Naley zauway,
e dioda D1 bdzie zmieniaa swj
stan dopiero po puszczeniu przyci-
sku, a dioda D2 po przytrzymaniu
nacinitego przycisku przez czas co
najmniej 2 sekund. Do jednego przy-
cisku na przedstawionym przykadzie
mona take przypisa wiksz liczb
funkcji, ktre bd rozpoznawane po
czasie nacinicia. Mona take przy-
pisywa przyciskowi inne funkcje w
zalenoci od liczby jego nacini
w danym czasie, tak jak to ma miej-
sce np. w myszkach komputerowych.
Podwjne przycinicie przycisku
moe na przykad realizowa inn
funkcj. Dziaanie tego typu mona
zrealizowa w podprogramie wywoy-
wanym przez instrukcj Debounce, w
ktrej naley czeka na nastpne na-
cinicie tego przycisku przez okre-
lony czas. Czyli naley wykry jego
puszczenie i ponowne nacinicie w
zadanym czasie.
Klawiatury matrycowe
W przypadku jeli w systemie
wystpuje wicej ni 6 przyciskw,
czenie ich wprost do indywidu-
alnej linii mikrokontrolera staje si
rozwizaniem nieoptymalnym. W tym
przypadku swoj zalet ujawniaj kla-
wiatury matrycowe, ktre do swo-
jego dziaania potrzebuj mniej linii
mikrokontrolera, ale s trudniejsze
w obsudze. Bascom AVR do obsu-
gi klawiatur matrycowych (w ktrej
przyciski poczono w matryc, po-
dobnie jak si czy wywietlacze
pracujce w trybie multipleksowym)
ma dedykowan funkcj Getkbd(), kt-
ra nie wstrzymuje dziaania programu
i umoliwia obsug klawiatur 4x4
lub 4x6, czyli klawiatury 16-przyci-
skowej i 24-przyciskowej. Ale moe
to by take klawiatura matrycowa o
mniejszej liczbie przyciskw. Nie zo-
stan wtedy wykorzystane wszystkie
linie danego portu mikrokontrolera,
gdy funkcja Getkbd() na swoje cele
rezerwuje cay 8-bitowy port, z kt-
rego poowa pracuje jako wejcie, a
polowa jako wyjcie, co przedstawio-
no na rys. 2.
W przykadzie wykorzystana zostaa
klawiatura STD3407 o matrycy 3x4 (12
Elektronika Praktyczna 3/2005
90
K C I K B A S C O M O W Y
Rys. 4.
Rys. 5.
przyciskw), ktrej wygld przedstawio-
no na rys. 3. Na rys. 4 przedstawiono
sposb podczenia do mikrokontrole-
ra tego typu klawiatury, ktr mona
obsuy za pomoc funkcji Getkbd().
Poniewa funkcja Getkbd() wykorzystuje
do swego dziaania cay port mikrokon-
trolera, niewykorzystana zostaa jedna
linia PD3. Na list. 3 zosta przedsta-
wiony program obsugujcy tak klawia-
tur, i ktrej kody nacinitych przyci-
skw s wywietlane na wywietlaczu
LCD. Przy czym s to kody przekon-
wertowane, bowiem kod nacinitego
przycisku nie musi odpowiada znako-
wi przypisanemu danemu klawiszowi.
Po przekodowaniu odczytanych kodw,
przyciskowi 1 bdzie odpowiada kod
1, przyciskowi 2 kod 2 itp. Aby mc
skorzysta z funkcji Getkbd() naley
skonfigurowa port z ktrego bdzie
ona korzysta przy odczycie klawiatu-
ry (port do ktrego zostaa przyczona
klawiatura) za pomoc instrukcji Config
Kbd. W przykadzie klawiatura zostaa
doczona do portu PD, przy czym pa-
rametr Debounce okrela czas odczytu
pomidzy kolejnymi odczytami stanu
klawisza, ktry ustalono na 20 ms.
Opcjonalny parametr Delay okrela
czas opnienia w milisekundach jaki
zostanie wprowadzony po wykryciu
nacinitego przycisku. W przykadzie
czas ten zosta okrelony na 100 ms.
Dodatkowo mona poda w tej instruk-
cji parametry ROWS, ROWS5 i ROW-
S6, ktre okrelaj linie portu dodatko-
wych dwch wierszy klawiatury przy
obsudze klawiatur 4x6. W przykadzie
funkcja Getkbd(), gdy nie zosta naci-
niety aden przycisk zwraca warto
16 (przy matrycy 4x6 byaby to war-
to 24). Po kadym odebraniu kodu
klawisza jest on przekodowywany na
podstawie tablicy Tab_klw. Po odebra-
niu kodu klawisza okrela on pozycje
staej, ktra zostaje pobrana z tablicy
i jest nowym kodem nacinietego przy-
cisku. Nowy kod klawisza jest pobie-
rany za pomoc funkcji Lookup i za-
pisywany w zmiennej Konw_klaw. Dla
przykadu po naciniciu przycisku
1 zostanie odebrany kod 6, czyli z
tablicy zostanie odczytana warto 1,
ktra nastpnie zostaje wywietlona na
LCD jako kod nacinitego klawisza.
W przypadku wikszej matrycy przyci-
skw, jeli wartoci odczytach klawiszy
bd z przedziau od 0 do 255, tego
typu tablica, moe by nieekonomiczna
ze wzgldu na to, e odczytany kod
klawisza reprezentuje pozycje nowego
kodu w tablicy. Inny sposb przeko-
dowania kodw przyciskw zostanie
przedstawiony w nastpnym przyka-
dzie i polega na znalezieniu w tabli-
cy danego kodu (czyli tablica kodw
bdzie wielkoci odpowiadajcej iloci
przyciskw matrycy). Odczyt przy-
ciskw za pomoc funkcji Getkbd()
mona take umieci w przerwaniu
zgaszanym co pewien czas od timera.
Naley wtedy do minimum zmniejszy
opnienie Delay w instrukcji Con-
fig Kbd. W przypadku wikszych lub
mniejszych matryc klawiatur mona
stworzy wasne procedury ich obsugi.
Dla przykadu zostanie przedstawiona
obsuga klawiatury 8x4 w przerwa-
niu zgaszanym przez Timer0 co ok.
20 ms. Obsuga klawiatury w przerwa-
niu ma spore zalety, gdy odbywa si
w tle dziaania programu gwnego, w
ktrym naley tylko sprawdza czy nie
odebrano nowego kodu nacinitego
klawisza. Schemat doczenia klawiatu-
ry 8x4 do mikrokontrolera przedstawio-
no na rys. 5. Na list. 4 przedstawiono
program obsugujcy klawiatur matry-
cow 8x4. Oczywicie tego typu zada-
nie mona rozwiza na wiele innych
sposobw, a w przykadzie jest tylko
jeden z nich. Port PD zosta skonfi-
gurowany jako wyjciowy, natomiast
port PB jako wejciowy z rezystorami
podcigajcymi, ktre s niezbdne do
dziaania tego typu klawiatury. Obsu-
ga klawiatury odbywa si w dwch
etapach - kod nacinitego klawisza
otrzymuje si dopiero po obsueniu
dwch przerwa Mult_kl od Timer0.
Czyli nastpuj dwa sprawdzenia na-
cinitego przycisku z opnieniem
20 ms, co eliminuje drgania stykw.
Jeli pierwsze sprawdzenie bdzie iden-
tyczne z drugim to zostaje obliczony i
zwrcony kod nacinitego przycisku.
A dokadnie, po wywoaniu przerwa-
nia zostaj skanowane kolejno wiersze
klawiatury (instrukcja Rotate zacza po
kadym jej wywoaniu kolejny wiersz
klawiatury poddawany skanowaniu) i
jeli odczytana warto kolumny b-
dzie rna od 15 (4 bardziej znaczce
bity portu wejciowego PB s masko-
wane) nastpuje wczeniejsze opuszcze-
nie ptli For, gdy wykryto nacinicie
przycisku. Warto zmiennej I wskazuje
na numer wiersza, w ktrym wykryto
nacinicie przycisku. Odczytana war-
to z kolumn matrycy jest zapisy-
wana w pierwszym elemencie tablicy
Temp. Jeli J nie jest jeszcze rwne
2, nastpuje opuszczenie procedury
obsugi przerwania i przy nastpnym
przerwaniu zostaje znw skanowana
klawiatura. I jeli J bdzie rwne 2
oraz wartoci komrek dwuelemento-
wej tablicy Temp bd sobie rwne, i
bdzie to oznacza, e na pewno jest
nacinity dany klawisz a nie jest to
zakcenie. Nastpnie zostaje obliczony
kod klawisza na podstawie odczytanej
wartoci z kolumn i wartoci zmien-
nej I ktra jest zmienna licznikowa
ptli For. Czyli zostanie uwzgldniony
w kodzie klawisza numer skanowanego
91
Elektronika Praktyczna 3/2005
K C I K B A S C O M O W Y
List. 3.
Program obslugi klawiatury matrycowej 4x3 z
wykorzystaniem dedykowanych
instrukcji getkbd()
Na wyswietlaczu przedstawione zostaja kody
nacisnietych klawiszy,
ktore zostaja wczesniej przekodowane na od-
powiadajace im kody
tzn klawisz o znaku 1 bedzie posiadal kod
1 a nie przykladowo 13
$regle = m8def.dat
informuje kompilator o pliku
dyrektyw mikrokontrolera
$crystal = 8000000
informuje kompilator o
czestotliwosci oscylatora taktujacego mikro-
kontroler
Cong Lcd = 16 * 2
konguracja typu wyswietlacza
LCD
Cong Lcdpin = Pin , Db4 = Portc.3 , Db5 =
Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E
= Portc.4 , Rs = Portc.5 konguracja
linii komunikacyjnych z wyswietlaczem
Cong Kbd = Portd , Debounce = 20 , Delay =
100 konguracja portu sterujace-
go klawiatura oraz potrzebnych opoznien
Dim Klawisz As Byte
zmienna do ktorej zapisywany
jest kod klawisza
Dim Konw_klaw As Byte
zmienna do ktorej zapisywany
jest przekodowany kod klawisza
Cursor Off
wylaczenie kursora
Cls
czysci LCD
Lcd Przycisk:
Wyswietlenie na LCD napisu
Do
poczatek nieskonczonej petli
Do-Loop
Klawisz = Getkbd()
skanowanie klawiatury i
pobranie kodu klawisza

przy braku nacisnietego
klawisza zwracana jest wartosc 16
Konw_klaw = Lookup(klawisz , Tab_klw)
przekodowanie odczytanej wartosci nacisnie-
tego klawisza
Locate 1 , 10
kursor na 10 kolumne wiersza
pierwszego
Lcd Konw_klaw ;
wyswietlenie przekonwertowa-
nego kodu nacisnietego klawisza
Loop
End
koniec programu
Tab_klw:
tablica konwersji kodow
klawiszy
Data 11 , 0 , 10 , 16 , 3 , 2 , 1 , 16 , 6 ,
5 , 4 , 16 , 9 , 8 , 7 , 16 , 16
List. 4.
Program obslugi klawiatury matrycowej 8x4
(32 przyciski) w przerwaniu zglaszanym
od przepelnienia Timer0 co 1/(8 MHz/1024/
150) = ok. 20 ms
oczywiscie przy czestotliwosci oscylatora
8MHz
Kod nacisnietego przycisku wyswietlany jest
na wyswietlaczu LCD
Przy braku nacisnietego przycisku zwracana
jest wartosc 33,
natomiast przyciski maja kody od 1 do 32
$regle = m8def.dat
informuje kompilator o pliku
dyrektyw mikrokontrolera
$crystal = 8000000
informuje kompilator o
czestotliwosci oscylatora taktujacego mikro-
kontroler
Cong Portd = Output
port D jako wyjsciowy
Cong Portb = Input
port B jako wejsciowy
Cong Lcd = 16 * 2
kongurowanie typu wyswie-
tlacza LCD
Cong Lcdpin = Pin , Db4 = Portc.3 , Db5 =
Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E
= Portc.4 , Rs = Portc.5 kongurowa-
nie linii

mikrokontrolera, do ktorych
dolaczono LCD
Cong Timer0 = Timer , Prescale = 1024
kongurowanie Timer0 jako timer z podzialem
preskalera przez 1024
On Timer0 Mult_kl
kongurowanie przerwania
od przepelnienia Timer0, skok do podprogramu
Mult_kl
Dim Temp(2) As Byte
dwu-elementowa tablica zmien-
neych pomocniczych Temp
Dim J As Byte
zmienna licznikowa
Dim Przycisk As Byte
zmienna, do ktorej bedzie
wpisywany kod nacisnietego przycisku (bez
konwersji)
Dim I As Byte
zmienna licznikowa
Dim Kod_p As Integer
zmienna do ktorej bedzie wpisywany przekon-
wertowany kod przycisnietego przycisku
Dim M_odcz As Byte
zmienna pomocniczaprzechowu-
jaca odczytany stan linii portu B
Portb = 255
dolaczenie rezystorow podcia-
gajacych do portu B
List. 4. cd
Portd = 254
ustawienie stanu portu
wyjsciowego D na 11111110, czyli wyzerowanie
linii PD.0
Enable Interrupts
odblokowanie globalnego systemu przerwan
Enable Timer0
odblokowanie przerwania od przepelnienia
Timer0
Load Timer0 , 150
wpisanie do licznika wartosci
poczatkowej
Cursor Off
wylaczenie kursora na ekranie
LCD
Cls
czyszczenie ekranu LCD
Lcd Przycisk:
wyswietlenie napisu
Do
ptla glowna programu
Kod_p = Lookdown(przycisk , Tab_kod , 65)
pobranie z tablicy pozycji odczytanego kodu
klawisza (konwersja kodow

odpowiadajacych klawiasza)
- przetoworziny kod zapisywany jest do zmien-
nej kod_p

przy braku nacisnietego
przycisku zwracana jest wartosc 33
Locate 1 , 11
kursor do pierwszego wiersza
i na pozycje 11
Lcd Kod_p ;
wyswietlenie na LCD
przekonwertowanego kodu przycisku oraz dwoch
dodatkowych spacji
Waitms 100
opoznienie 100 ms
Loop
End
koniec programu
Mult_kl:
podprogram przerwania, w kto-
rym multipleksowana jest matryca przyciskow
Load Timer0 , 150
wpisanie do licznika wartosci
poczatkowej
Portd = 254
wartosc poczatkowa stanu
linii
portu D (wyzerowana tylko linia PD.0)
For I = 0 To 7
petla wykonywana 8 razy
M_odcz = Pinb And &B00001111
odczyt stanu przyciskow w da-
nym wierszu (odczyt tylko 4 mniej znaczacych
linii portu)
If M_odcz <> 15 Then
jesli odczytana wartosc rozna
od 15 to
Exit For
wczesniejsze opuszczenie
petli For
End If
Rotate Portd , Left , 1
zalaczenie kolejnego wiersza
skanowanej klawiatury
Next I
zwiekszenie wartosci I o
jeden
Incr J
zwiekszenie o jeden wartosci
J
Temp(j) = M_odcz
przepisanie stanu przyciskow
do tablicy Temp z indeksem J
If J = 2 Then
jest J rowne 2 to
J = 0
wyzerowanie zmiennej J
If Temp(1) = Temp(2) And Temp(1) <> 15
Then Jesli wartosci w tablicy
Temp sa rowne i wartosc w Temp(1)<>15 to
Przycisk = 15 - Temp(1)
odjecie od 15 wartosci odczytanego przycisku
i zapisanie nowego kodu do zmiennej Przycisk
I = I * 10
pomnozenie wartosci I przez
10
Przycisk = Przycisk + I
podanie wartosci I do nie-
przetworzonego kodu nacisnietego przycisku
Else
w przeciwnym razie
Przycisk = 15
zapisanie do zmiennej przy-
cisk wartosci 15
End If
End If
Return
powrot z podprogramu przerwania
Tab_kod:
tablica konwersji kodow
klawiszy
Data 1 , 11 , 21 , 31 , 41 , 51 , 61 , 71 , 2
, 12 , 22 , 32 , 42 , 52 , 62 , 72
Data 4 , 14 , 24 , 34 , 44 , 54 , 64 , 74 , 8
, 18 , 28 , 38 , 48 , 58 , 68
Data 78 , 15
wiersza klawiatury. W przypadku bra-
ku nacinicia przycisku zwracana jest
warto 15. Kod nacinitego przycisku
jest zapisywany w zmiennej Przycisk.
Jak wida na schemacie przyciskom
klawiatury zostay przypisane wartoci
od 1 do 32. Aby uzyska tego typu
kody nacinitych przyciskw, take
wykorzystano do przekodowania tablice
staych Tab_kod. Ale przekodowywanie
dziaa inaczej ni w poprzednim przy-
kadzie. W tablicy zostay zamieszczone
kody klawiszy zwracanych w przerwa-
niu Timer0. Za porednictwem funkcji
Lookdown zwracana jest pozycja w ta-
blicy odczytanego kodu klawisza, ktra
bdzie jego nowym kodem. Nowy kod
przycisku zostaje zapisany do zmiennej
Kod_p typu integer. Po przekodowaniu
przy braku nacinitego przycisku b-
dzie zwracana warto 33. Przykadowo
po przyciniciu przycisku oznaczonego
2 zostanie w przerwaniu odebrany
kod 11. W tablicy ma on pozycje 2
wiec zostanie do zmiennej Kod_p zapi-
sana warto 2, ktra jest nowym ko-
dem nacinitego przycisku. Przy takim
odczycie danych z tablicy wystarczy w
niej jedynie zapisa wartoci kodw
klawiszy na odpowiednich pozycjach,
czyli bdzie ona miaa warto zbli-
on do liczby przyciskw klawiatury.
Przekodowany kod nacinitego jest
wywietlany na wywietlaczu LCD. Bez
problemw procedur obsugi matrycy
w przedstawionym programie mona
przystosowa do obsugi wikszych
lub mniejszy matryc klawiatur. Gdy w
systemie mikroprocesorowym wystpu-
j multipleksowane wywietlacze LED,
mona obsug klawiatur matrycowych
zrealizowa przy okazji ich obsugi.
Podczas multipleksowania wywietlaczy
moe si przy okazji odbywa odczyt
klawiatury, ktrej wiersze lub kolumny
s zaczane poprzez tranzystory za-
czajce wywietlacze. Mona w ten
sposb zredukowa jeszcze bardziej
liczb linii mikrokontrolera potrzebnych
do obsugi klawiatury matrycowej.
Marcin Wizania, EP
marcin.wiazania@ep.com.pl

Vous aimerez peut-être aussi