Vous êtes sur la page 1sur 4

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.

Wymienione elementy s czsto


stosowane w systemach mikroprocesorowych, gdzie umoliwiaj atw
zmian parametrw lub wprowadzenie
danych do systemu. Obsuga przez
mikrokontroler przyciskw czy klawiatur nie jest trudna, ale przy wykorzystywaniu 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 mikroprocesorowego. Nie ma z tym wikszego
problemu, gdy drgania stykw mona w bardzo prosty sposb usun
programowo poprzez zastosowanie
opnienia. Poniewa z rnego typu
przyciskami czy klawiaturami wystpuje wiele kopotw przy prbie ich
obsugi, wic w artykule zostan
przedstawione przykady obsugi: od
pojedynczych przyciskw (z przypisan jedn lub dwoma funkcjami) poprzez klawiatury matrycowe (wane
ze wzgldu na koszty klawiatury AT)
a do czsto wykorzystywanych impulsatorw, ktrych uycie upraszcza
znacznie obsug urzdzenia, a bez
wtpienia mona je zaliczy do elementw stykowych.

Pojedyncze przyciski

W przypadku niewielkiej liczby


przyciskw wystpujcych w systemie mikroprocesorowym (poniej 6)
mona je doczy bezporednio do
linii portw mikrokontrolera. W przypadku wykorzystywania wikszej liczby przyciskw lepszym rozwizaniem
s klawiatury matrycowe (przyciski
poczone w matryc), gdy do ich
obsugi jest potrzebna mniejsza liczba linii mikrokontrolera. Na rys. 1
przedstawiono schemat z doczonym
do mikrokontrolera jednym przyci-

88

skiem. Diody LED D1 i D2 zastosowane zostay jako elementy sygnalizujce dziaanie przycisku S1. Mikrokontroler powinien reagowa na nacinicie przycisku S1, czyli na stan
niski na jego linii PB0. Aby przycisk
poprawnie pracowa linia ta musi zosta skonfigurowana jako wejciowa z
wczonym rezystorem podcigajcym.
Mona take zastosowa zewntrzny
rezystor podcigajcy. W przypadku
gdyby na wejcie mikrokontrolera
po przyciniciu przycisku by podawany stan wysoki (druga kocwka
przycisku doczana do linii zasilajcej, a nie do masy) naley lini
mikrokontrolera PB0 ustawi jako
wejciow, przy czym naley zastosowa zewntrzny rezystor cigajcy
do masy. Nie naley wcza wewntrznego rezystora podcigajcego.
W Bascom AVR do obsugi pojedynczych przyciskw mona wykorzysta
dedykowan instrukcj Debounce. Na
list. 1 przedstawiono przykadowy
program, ktry po kadym naciniciu przycisku S1 gasi i zapala diod
D1. Pierwszym parametrem instrukcji
Debounce jest linia portu wejciowego, do ktrej podczony zosta
przycisk. Aliasowi S1 w programie
przypisano bit 0 rejestru wejciowego Pinb. Poprzez ustawienie bitu 0
rejestru Portb wczony zosta rezystor podcigajcy do linii PB0. linii
sterujcej diod LED D1 take zosta
przypisany alias Led1. Aliasy niewtpliwie 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 naciniciu przycisku podawany jest stan
0, czyli drugim parametrem jest warto 0. W wymienionym przypadku z
przyciskiem podczonym do linii za-

Rys. 1.

silajcej byaby to warto 1. Nastpnym parametrem instrukcji Debounce


jest etykieta, do ktrej nastpi skok
po przyciniciu przycisku. Zamiast
do etykiety moe to by take skok
do podprogramu (z czego skorzystano w przykadzie), ale naley wtedy
dodatkowo zawrze w instrukcji Debounce parametr SUB. W przykadzie
po naciniciu przycisku S1 nastpi skok do podprogramu Obs_s1, w
ktrej zmieniany jest na przeciwny
stan linii sterujcej diod LED. Czyli po kadym naciniciu przycisku
S1 dioda bdzie zapalana i gaszona.
Instrukcja Debounce nie wstrzymuje
dziaania programu i sama dba o eliminacje drga stykw przycisku. Czas
potrzebny na eliminacj drga stykw,
z ktrego korzysta Debounce mona
okreli za pomoc instrukcji Config
Debounce. W programie czas opnie-

Rys. 2.

Elektronika Praktyczna 3/2005

K C I K

Fot. 3.

nia zosta okrelony na 30 ms, cho


domylnie wynosi 25 ms, co take
jest wystarczajce. Gdyby przy takim
opnieniu daway zna drgania stykw mona to opnienie zwikszy.
Jeli by byo potrzebne wstrzymywanie programu a do nacinicia przycisku, to przed instrukcj Debounce
mona wykorzysta instrukcje wstrzymujc Bitwait. W programie kady
pojedynczy przycisk mona obsuy
za pomoc instrukcji Debounce, ale
mona take to zrobi z wykorzystaniem instrukcji warunkowych (If...
Then) pamitajc o potrzebie eliminacji drga stykw. Jest take moliwe przypisanie do jednego przycisku
wielu funkcji, ktre bd rozpoznawane 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. ProList. 1.

Program obslugi jednego przycisku S1 za pomoca 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 mikrokontroler
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 rezystora 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
Obs_s1:
Toggle Led1

koniec programu
podprogram Obs_s1

zmiana na przeciwny stanu


wyjscia sterujacego dioda LED D1
Return
powrot z podprogramu

Elektronika Praktyczna 3/2005

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 instrukcja Debounce, ktrej czas opnienia eliminacj drga stykw wynosi domylnie 25 ms. Po wykryciu
nacinicia przycisku nastpuje skok
do podprogramu Obs_s1, w ktrym
liczony jest czas przycinicia przycisku 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 bdzie oznaczao, e przycisk zosta
przycinity na czas ok. 2 sekund
(10 ms 200). Nastpnie jest sprawdzany 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 przeciwny stan diody D1. Naley zauway,
e dioda D1 bdzie zmieniaa swj
stan dopiero po puszczeniu przycisku, a dioda D2 po przytrzymaniu
nacinitego przycisku przez czas co
najmniej 2 sekund. Do jednego przycisku na przedstawionym przykadzie
mona take przypisa wiksz liczb
funkcji, ktre bd rozpoznawane po
czasie nacinicia. Mona take przypisywa przyciskowi inne funkcje w
zalenoci od liczby jego nacini
w danym czasie, tak jak to ma miejsce np. w myszkach komputerowych.
Podwjne przycinicie przycisku
moe na przykad realizowa inn
funkcj. Dziaanie tego typu mona
zrealizowa w podprogramie wywoywanym przez instrukcj Debounce, w
ktrej naley czeka na nastpne nacinicie tego przycisku przez okrelony 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 indywidualnej linii mikrokontrolera staje si
rozwizaniem nieoptymalnym. W tym
przypadku swoj zalet ujawniaj klawiatury matrycowe, ktre do swojego dziaania potrzebuj mniej linii
mikrokontrolera, ale s trudniejsze
w obsudze. Bascom AVR do obsugi klawiatur matrycowych (w ktrej
przyciski poczono w matryc, podobnie jak si czy wywietlacze

B A S C O M O W Y

List. 2.

Program obslugi jednego przycisku S1 za pomoca 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 mikrokontroler
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 rezystora 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:
Opozn = 0
opoznienia
Do
Waitms 10
Incr Opozn

podprogram Obs_s1
zerowanie zmiennej liczacej
poczatek petli Do-loop
opoznienie 10 ms

zwiekszenie o jeden wartosci


zmiennej opoznienia
Loop Until Opozn = 200 Or S1 = 1
jesli S1 puszczony lub zmienna 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

pracujce w trybie multipleksowym)


ma dedykowan funkcj Getkbd(), ktra nie wstrzymuje dziaania programu
i umoliwia obsug klawiatur 4x4
lub 4x6, czyli klawiatury 16-przyciskowej i 24-przyciskowej. Ale moe
to by take klawiatura matrycowa o
mniejszej liczbie przyciskw. Nie zostan wtedy wykorzystane wszystkie
linie danego portu mikrokontrolera,
gdy funkcja Getkbd() na swoje cele
rezerwuje cay 8-bitowy port, z ktrego poowa pracuje jako wejcie, a
polowa jako wyjcie, co przedstawiono na rys. 2.
W przykadzie wykorzystana zostaa
klawiatura STD3407 o matrycy 3x4 (12

89

K C I K

B A S C O M O W Y

Rys. 4.

przyciskw), ktrej wygld przedstawiono na rys. 3. Na rys. 4 przedstawiono


sposb podczenia do mikrokontrolera tego typu klawiatury, ktr mona
obsuy za pomoc funkcji Getkbd().
Poniewa funkcja Getkbd() wykorzystuje
do swego dziaania cay port mikrokontrolera, niewykorzystana zostaa jedna
linia PD3. Na list. 3 zosta przedstawiony program obsugujcy tak klawiatur, i ktrej kody nacinitych przyciskw s wywietlane na wywietlaczu
LCD. Przy czym s to kody przekonwertowane, bowiem kod nacinitego
przycisku nie musi odpowiada znakowi 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 klawiatury (port do ktrego zostaa przyczona
klawiatura) za pomoc instrukcji Config
Kbd. W przykadzie klawiatura zostaa
doczona do portu PD, przy czym parametr 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 instrukcji parametry ROWS, ROWS5 i ROW-

Rys. 5.

90

S6, ktre okrelaj linie portu dodatkowych dwch wierszy klawiatury przy
obsudze klawiatur 4x6. W przykadzie
funkcja Getkbd(), gdy nie zosta naciniety aden przycisk zwraca warto
16 (przy matrycy 4x6 byaby to warto 24). Po kadym odebraniu kodu
klawisza jest on przekodowywany na
podstawie tablicy Tab_klw. Po odebraniu kodu klawisza okrela on pozycje
staej, ktra zostaje pobrana z tablicy
i jest nowym kodem nacinietego przycisku. Nowy kod klawisza jest pobierany za pomoc funkcji Lookup i zapisywany 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 przyciskw, 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 przekodowania kodw przyciskw zostanie
przedstawiony w nastpnym przykadzie i polega na znalezieniu w tablicy danego kodu (czyli tablica kodw
bdzie wielkoci odpowiadajcej iloci
przyciskw matrycy). Odczyt przyciskw za pomoc funkcji Getkbd()
mona take umieci w przerwaniu
zgaszanym co pewien czas od timera.

Naley wtedy do minimum zmniejszy


opnienie Delay w instrukcji Config Kbd. W przypadku wikszych lub
mniejszych matryc klawiatur mona
stworzy wasne procedury ich obsugi.
Dla przykadu zostanie przedstawiona
obsuga klawiatury 8x4 w przerwaniu zgaszanym przez Timer0 co ok.
20 ms. Obsuga klawiatury w przerwaniu 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 klawiatury 8x4 do mikrokontrolera przedstawiono na rys. 5. Na list. 4 przedstawiono
program obsugujcy klawiatur matrycow 8x4. Oczywicie tego typu zadanie mona rozwiza na wiele innych
sposobw, a w przykadzie jest tylko
jeden z nich. Port PD zosta skonfigurowany jako wyjciowy, natomiast
port PB jako wejciowy z rezystorami
podcigajcymi, ktre s niezbdne do
dziaania tego typu klawiatury. Obsuga klawiatury odbywa si w dwch
etapach - kod nacinitego klawisza
otrzymuje si dopiero po obsueniu
dwch przerwa Mult_kl od Timer0.
Czyli nastpuj dwa sprawdzenia nacinitego przycisku z opnieniem
20 ms, co eliminuje drgania stykw.
Jeli pierwsze sprawdzenie bdzie identyczne z drugim to zostaje obliczony i
zwrcony kod nacinitego przycisku.
A dokadnie, po wywoaniu przerwania zostaj skanowane kolejno wiersze
klawiatury (instrukcja Rotate zacza po
kadym jej wywoaniu kolejny wiersz
klawiatury poddawany skanowaniu) i
jeli odczytana warto kolumny bdzie rna od 15 (4 bardziej znaczce
bity portu wejciowego PB s maskowane) nastpuje wczeniejsze opuszczenie ptli For, gdy wykryto nacinicie
przycisku. Warto zmiennej I wskazuje
na numer wiersza, w ktrym wykryto
nacinicie przycisku. Odczytana warto z kolumn matrycy jest zapisywana 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 dwuelementowej 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 zmiennej I ktra jest zmienna licznikowa
ptli For. Czyli zostanie uwzgldniony
w kodzie klawisza numer skanowanego

Elektronika Praktyczna 3/2005

K C I K
wiersza klawiatury. W przypadku braku 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 przykadzie. W tablicy zostay zamieszczone
kody klawiszy zwracanych w przerwaniu Timer0. Za porednictwem funkcji
Lookdown zwracana jest pozycja w tablicy 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 bdzie 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 zapiList. 3.

Program obslugi klawiatury matrycowej 4x3 z


wykorzystaniem dedykowanych
instrukcji getkbd()
Na wyswietlaczu przedstawione zostaja kody
nacisnietych klawiszy,
ktore zostaja wczesniej przekodowane na odpowiadajace 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 mikrokontroler
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 sterujacego 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

sana warto 2, ktra jest nowym kodem nacinitego przycisku. Przy takim
odczycie danych z tablicy wystarczy w
niej jedynie zapisa wartoci kodw
klawiszy na odpowiednich pozycjach,
czyli bdzie ona miaa warto zblion 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 wystpuj 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 zaczajce wywietlacze. Mona w ten
sposb zredukowa jeszcze bardziej
liczb linii mikrokontrolera potrzebnych
do obsugi klawiatury matrycowej.
Marcin Wizania, EP
marcin.wiazania@ep.com.pl
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 mikrokontroler
Cong Portd = Output
port D jako wyjsciowy
Cong Portb = Input
port B jako wejsciowy
Cong Lcd = 16 * 2
kongurowanie typu wyswietlacza LCD
Cong Lcdpin = Pin , Db4 = Portc.3 , Db5 =
Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E
= Portc.4 , Rs = Portc.5
kongurowanie linii

czysci LCD
Lcd Przycisk:
Wyswietlenie na LCD napisu

mikrokontrolera, do ktorych
dolaczono LCD
Cong Timer0 = Timer , Prescale = 1024
kongurowanie Timer0 jako timer z podzialem
preskalera przez 1024

Do

On Timer0 Mult_kl

przy braku nacisnietego


klawisza zwracana jest wartosc 16
Konw_klaw = Lookup(klawisz , Tab_klw)
przekodowanie odczytanej wartosci nacisnietego klawisza
Locate 1 , 10
kursor na 10 kolumne wiersza
pierwszego
Lcd Konw_klaw ;
wyswietlenie przekonwertowanego kodu nacisnietego klawisza
Loop
End
koniec programu

Dim Temp(2) As Byte


dwu-elementowa tablica zmienneych 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 przekonwertowany kod przycisnietego przycisku
Dim M_odcz As Byte
zmienna pomocniczaprzechowujaca odczytany stan linii portu B

Cls

wylaczenie kursora

poczatek nieskonczonej petli


Do-Loop
Klawisz = Getkbd()
skanowanie klawiatury i
pobranie kodu klawisza

Tab_klw:

tablica konwersji kodow


klawiszy
Data 11 , 0 , 10 , 16 , 3 , 2 , 1 , 16 , 6 ,
5 , 4 , 16 , 9 , 8 , 7 , 16 , 16

Elektronika Praktyczna 3/2005

kongurowanie przerwania
od przepelnienia Timer0, skok do podprogramu
Mult_kl

Portb = 255

dolaczenie rezystorow podciagajacych do portu B

B A S C O M O W Y

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

wylaczenie kursora na ekranie

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 zmiennej 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 ktorym 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 danym 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 nieprzetworzonego kodu nacisnietego przycisku
Else
w przeciwnym razie
Przycisk = 15
zapisanie do zmiennej przycisk wartosci 15
End If
End If
Return
powrot z podprogramu przerwania
Tab_kod:
klawiszy
Data 1 , 11 , 21
, 12 , 22 , 32 ,
Data 4 , 14 , 24
, 18 , 28 , 38 ,
Data 78 , 15

tablica konwersji kodow


, 31
42 ,
, 34
48 ,

, 41
52 ,
, 44
58 ,

, 51 , 61 , 71 , 2
62 , 72
, 54 , 64 , 74 , 8
68

91

Vous aimerez peut-être aussi