elementy stykowe bascom czesc2.pdf

(1016 KB) Pobierz
ep_04_086-088_bascom_cz2.indd
K Ą C I K B A S C O M O W Y
Obsługa elementów stykowych:
przyciski, klawiatury, impulsatory,
część 2
W tej części artykułu skupimy się na prezentacji sposobów obsługi w języku
Bascom klawiatur AT oraz obrotowych enkoderów (impulsatorów), które są
niezwykle wygodne w obsłudze.
Klawiatura AT
W przypadku potrzeby zastosowa-
nia klawiatury z dużą ilością przy-
cisków ekonomiczniejsze może się
wydać zastosowanie klawiatury kom-
puterowej AT, której koszt może być
nieporównywalnie niższy niż budowa-
nej klawiatury. Można także w tym
przypadku zyskać na uproszczeniu
budowanego systemu, gdyż do stero-
wania tego typu klawiaturą potrzeb-
ne będą tylko 2 linie mikrokontrole-
ra. Na rys. 6 przedstawiono sposób
podłączenia klawiatury AT do mikro-
kontrolera. W Bascom AVR nie ma
większych problemów z obsługą tego
typu klawiatur, gdyż są przeznaczone
do jej obsługi odpowiednie funkcje.
Na list. 5 przedstawiono przykład
obsługi klawiatury AT, której naciska-
ne znaki są wyświetlane w pierwszej
linii wyświetlacza LCD. Naciśnięcie
przycisków SHIFT+znak powoduje
wyświetlenie dużych znaków. Po za-
pełnieniu linii wyświetlacza znakami
wpisany tekst po każdym następnym
znaku jest przesuwany o jedna pozy-
cje w lewo. Linie mikrokontrolera ko-
munikujące się z klawiatura AT na-
leży skonfigurować instrukcją Config
Keyboard , w której prócz linii DATA
i CLK należy podać tablicę kodów,
które zamieniają kody naciśniętych
klawiszy na ich odpowiedniki ASCII.
Tak wiec np. po naciśnięciu klawisza
„A” zostanie zamieniony jego umowny
kod na odpowiednik ASCII litery „A”
czyli na wartość 41. W przykładzie
tablica nazywa się Keydata i zawiera
kody dla małych jak i dużych liter.
Do odczytu kodu klawiszy klawiatu-
ry AT służy funkcja Getatkbd() , która
nie wstrzymuje działania programu.
Funkcja ta na podstawie tablicy Key-
data zwraca kod ASCII naciśniętego
przycisku. W programie jeśli zwróco-
ny zostaje kod ASCII większy od 31
i mniejszy od 127 zwiększana zosta-
je o jeden zmienna I . Przy wartości
zmiennej I równej 17 (zapełniona zo-
Rys. 6.
stała tekstem cala linia wyświetlacza)
następuje przepisanie znaków tablicy
Znaki (tablica 16-elementowa prze-
chowująca znaki kody ASCII znaków
dla całej linii wyświetlacza) o jedna
pozycje w lewo i wyświetlenie prze-
suniętego tekstu o jedna pozycje w
lewo na LCD. Na pozycji 16 tablicy
Znaki zostaje wpisany nowy znak,
który następnie zostaje wyświetlony.
W ten sposób zrealizowano prze-
suwanie się tekstu na wyświetlaczu
LCD po każdym odebraniu naciśnie-
tego znaku klawiatury AT. Jeśli linia
wyświetlacza LCD jeszcze nie została
zapełniona całkowicie znakami prze-
suwanie jest wyłączone a do tablicy
znaków Znaki ładowane są odebrane
znaki na pozycji wskazywanej przez
zmienną I . Kody ASCII odebranych
kodów są zamieniane przez funkcje
Chr() na znak a następnie wyświe-
tlane na wyświetlaczu LCD. Więc
kiedy potrzebna jest klawiatura z
dużą ilością przycisków bez wątpie-
nia należy rozważyć zastosowanie
klawiatury AT, gdyż jej niewielki
koszt oraz łatwość obsługi przeważa-
ją za jej użyciem we własnym syste-
mie mikroprocesorowym.
Enkoder (impulsator)
Do grona elementów umożliwiają-
cych zmianę parametrów systemu mi-
kroprocesorowego niewątpliwie można
zaliczyć enkoder, czyli znany z pro-
jektów publikowanych w EP nastaw-
nik impulsowy. Dostępne są różnego
rodzaju impulsatory, które mogą być
wyposażone także w dodatkowy przy-
cisk uruchamiany naciśnięciem jego
ośki. Impulsator umożliwia w prosty
sposób zmianę parametru poprzez jego
obrót w lewo lub w prawo. Na pod-
stawie stanów dwóch jego linii wyj-
ściowych A i B możliwe jest stwier-
dzenie w którym kierunku jest obra-
cana jego oś, co pokazano na rys. 8 .
Sygnały na liniach A i B impulsatora
są względem siebie przesunięte. Tak
więc możliwe jest poprzez obrót jego
osi w lewo zmniejszanie wartości
danego parametru a w prawo zwięk-
szanie. W przykładzie wykorzystany
został impulsator Alps z dodatkowym
przyciskiem uruchamianym naciśnię-
ciem jego ośki. Na rys. 8 przedsta-
wiono przykładowy schemat dołącze-
nia impulsatora do mikrokontrolera, a
na list. 6 przykład jego obsługi. Ob-
rót w lewo osi impulsatora powoduje
86
Elektronika Praktyczna 4/2005
27834729.081.png 27834729.092.png
K Ą C I K B A S C O M O W Y
List. 5.
‘Program obsługi klawiatury AT PC
‘Wpisywany z klawiatury tekst jesli zapelni
cala linie LCD
‘jest przesuwany o jedna pozycje w lewo.
$regfile = „m8def.dat”
‘informuje kompilator o pliku
dyrektyw mikrokontrolera
$crystal = 8000000
‘informuje kompilator o często-
tliwości oscylatora taktującego mikrokontroler
Config Lcd = 16 * 2
‘konfiguracja typu wyświetlacza
LCD
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 =
Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E
= Portc.4 , Rs = Portc.5 ‘konfiguracja
linii
‘mikrokontrolera, do których
dołączono LCD
Config Keyboard = Pind.0 , Data = Pind.1 , Key-
data = Keydata ‘konfiguracja linii portu
do których dołączono klawiaturę AT
Dim Kod_kl As Byte
‘zmienna, do której wpisy-
wany jest przekonwertowany kod naciśniętego
klawisza
Dim I As Byte
‘zmienna licznikowa
Dim Znaki(16) As Byte
‘16 bajtowa tablica na
przechowanie danych wyswietlanych w pierwszej
linii LCD
Dim J As Byte
‘zmienna licznikowa
Cls
‘czyszczenie LCD
Cursor On
‘wlaczenie kursora
Cursor Blink
‘wlaczenie migania kursora
I = 0
‘zerowanie zmiennej I
Do
‘nieskończona pętla Do...Loop
Kod_kl = Getatkbd()
‘odczytanie danej z klawiatury (kodu nacisnie-
tego klawisza)
If Kod_kl > 31 And Kod_kl < 127 Then
‘jeśli Kod_kl jest > od 31 oraz
mniejszy od 127, to
Incr I
‘zwiekszenie o jeden wartosci I
If I = 17 Then
‘jesli I osiagnie wartosc 17 to
I = 16
‘zapisanie do I wartosci 16
Home
‘kursor na poczatek pierwszej
linii LCD
For J = 1 To 15
‘petla wykonywana 15 razy dla J
rownego 1...15
Znaki(j) = Znaki(j + 1)
‘przepisanie znakow w tablicy
znaki do poprzednich komorek. Tzn znak z pozy-
cji 2 jest przepisywany na pozycje 1
‘znak z pozycji 3 na pozycje 2
itp. Na pozycji 16 wpisywany jest nowy znak a
znak na pozycji 1 jest tracony.
‘Czyli nastepuje przesuniecie
tekstu zawartego w tablicy znaki o jedna po-
zycje w lewo. W tablicy przechowywane sa kody
ASCII znakow.
Lcd Chr(znaki(j))
‘wyswietlenie znaku na wyswietlaczu LCD na
pozycji wskazanej przez J
Next J
‘zwiekszenie o jeden wartosci J
Znaki(16) = Kod_kl
‘zapisanie do tablicy nowego
znaku (komorka 16)
Else
‘w przeciwnym razie
Znaki(i) = Kod_kl
‘zapisanie odebranego znaku w
komorce tablicy wskazanej przez zmienna I
End If
Lcd Chr(znaki(i))
‘wyswietlenie znaku na wyswietlaczu LCD na
pozycji wskazanej przez I
End If
Loop
End
‘koniec programu
‘tablica Konwersji Kodów Odczytanych Z Klawia-
tury Na Kod Ascii
Keydata:
‘tablica kodów Keydata
‘klawisze normalnie - małe litery
Data 0 , 0 , 0 , 0 , 0 , 200 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , &H5E , 0
Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0
, 122 , 115 , 97 , 119 , 50 , 0
Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 ,
0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
List. 5. cd.
Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7
, 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 ,
0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 ,
13 , 0 , 0 , 92 , 0 , 0
Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49
, 0 , 52 , 55 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0
, 43 , 51 , 45 , 42 , 57 , 0 , 0
‘klawisze z Shift - duże litery
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0
, 90 , 83 , 65 , 87 , 34 , 0
Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 ,
32 , 86 , 70 , 84 , 82 , 37 , 0
Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0
, 76 , 77 , 74 , 85 , 47 , 40 , 0
Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0
, 58 , 95 , 76 , 48 , 80 , 63 , 0
Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 ,
13 , 94 , 0 , 42 , 0 , 0
Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0
, 52 , 55 , 0 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0
, 43 , 51 , 45 , 42 , 57 , 0 , 0
Rys. 7.
ło w programie zrealizowane. Choć
obsługa impulsatora jest dosyć pro-
sta, w Bascomie stworzono specjalną
funkcję Encoder . Pierwszym i drugim
parametrem tej funkcji są linie por-
tu do których dołączono linie A i B
impulsatora. Trzecim parametrem jest
etykieta podprogramu, do którego na-
stąpi skok po wykryciu przez funkcje
obrotu impulsatora w lewo. W pod-
programie Lewo następuję zmniejsza-
nie o jeden wartości zmiennej Licz
oraz jej wyświetlanie na LCD. Czwar-
tym parametrem jest etykieta do pod-
programu, który będzie wywoływany
przy obrocie impulsatora w prawo. W
podprogramie Prawo następuje zwięk-
szanie zmiennej Licz o jeden oraz
zmniejszanie wartości zmiennej Licz
wyświetlanej na wyświetlaczu LCD, a
obrót w prawo jej zwiększanie. Stan
dodatkowego przycisku uruchamiane-
go osią impulsatora jest reprezentowa-
ny w drugiej linii wyświetlacza LCD.
Linie mikrokontrolera, które mają od-
czytywać stan linii A, B i przycisku
impulsatora powinny zostać skonfigu-
rowane jako wejściowe z włączonymi
rezystorami podciągającymi, co zosta-
List. 6.
‘Program obslugi impulsatora (enkodera) z do-
datkowym przyciskiem uruchamianym jego oska.
‘Obrot impulsatora w lewo zmniejsza wartosc
zmiennej Licz a w prawo zwieksza jej wartosc.
‘Stan dodatkowego przycisku jest wyświetlany
na wyświetlczu LCD
$regfile = „m8def.dat”
‘informuje kompilator o pliku
dyrektyw mikrokontrolera
$crystal = 8000000
‘informuje kompilator o
czŕstotliwosci oscylatora taktuj¦cego mikro-
kontroler
Config Lcd = 16 * 2
‘konfiguracja typu wyswietlacza
LCD
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 =
Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E
= Portc.4 , Rs = Portc.5 ‘konfiguracja
linii komunikacyjnych wyswietlacza LCD
Config Portd = Input
‘linie portu D jako wejsciowe
Dim Licz As Byte
‘pomocnicza zmienna zliczajaca
Dim Stan_enk As Byte
‘zmienna do ktorej zwracany
jest stan impulsatora (enkodera)
S Alias Pind.0
‘przypisanie nazwie Pind.0
nazwy S1
Portd = 255
‘dolaczenie do linii portu D
rezystorow podciagajacych
Cursor Off
‘wylaczenie kursora
Cls
‘czysci LCD
Lcd „Wartosc: „ ; Licz
‘wyswietlenie napisu i warto-
sci zmiennej Licz
Lowerline
‘przejscie do drugiej linii
Lcd „Przycisk: OFF”
‘wyswietlenie napisu w drugiej
linii
Do
‘poczatek nieskoczonej petli Do-Loop
‘nieskoŻczona pÓtla Do...Loop
Debounce S , 0 , Obs_s , Sub
‘jezeli nacisniety przycisk
enkodera oznaczony jako S, to skok do podpro-
gramu Obs_s
Stan_enk = Encoder(pind.1 , Pind.2 , Lewo ,
Prawo , 0) ‘instrukcja obslugujaca impul-
sator (przy obrocie w lewym kierunku skok do
podrogramu Lewo przy prawym
List. 6 cd.
‘kierunku skok do podprogramu
Prawo. Do zmiennej Stan_enk zwracany sie stan
linii 1 i 2 impulsatora
Waitms 10
‘czekaj 10 ms
Loop
End
‘koniec programu
Lewo:
‘podrogram wywolywanym przy
poruszaniu osia impulsatora w lewo
Decr Licz
‘zmniejszenie o jeden wartosci
zmiennej Licz
Locate 1 , 10
‘kursor na 10 pozycje pierw-
szej linii LCD
Lcd Licz
‘wyswietlenie wartosci zmien-
nej Licz na wybranej pozycji LCD
Lcd „ „
‘wyswietlenie dwoch spacji
Return
‘powrot z podprogramu
Prawo:
‘podrogram wywolywanym przy poruszaniu osia
impulsatora w prawo
Incr Licz
‘zwiekszenie o jeden wartosci
Licz
Locate 1 , 10
‘kursor na 10 pozycje pierw-
szej linii LCD
Lcd Licz
‘wyswietlenie wartosci zmien-
nej Licz na wybranej pozycji LCD
Lcd „ „
‘wyswietlenie dwoch spacji
Return
‘powrot z podprogramu
Obs_s:
‘podrogram wywolywanym przy
uruchomieniu dodatkowego przycisku impulsa-
tora
Locate 2 , 11
‘kursor do drugiego wiersza
LCD na pozycje 11
Lcd „ON „
‘wyswietlenie tekstu ON
Bitwait S , Set
‘czekaj na puszczenie przyci-
sku S impulsatora
Locate 2 , 11
‘kursor do drugiego wiersza
LCD na pozycje 11
Lcd „OFF”
‘wyswietlenie tekstu OFF
Return
‘powrot z podprogramu
Elektronika Praktyczna 4/2005
87
27834729.103.png 27834729.114.png
K Ą C I K B A S C O M O W Y
wyświetlanie jej wartości na LCD.
Ostatni parametr funkcji Encoder okre-
śla czy funkcja będzie wstrzymywała
działanie programu czy nie (tzn. czy
będzie czekała na obrót ośki impulsa-
tora). Przy wartości 1 tego parametru
funkcja Encoder będzie czekała na
obrót impulsatora a przy wartości 0
nie. W programie parametr ten został
ustawiony na wartość 0, gdyż jeszcze
do obsługi zostaje przycisk impulsa-
tora. Przy wartości 1 tego parametru,
dodatkowy przycisk nie mógłby być
obsłużony. Funkcja Encoder zwraca
stan linii A i B impulsatora, który w
przykładowym programie został zapi-
sany do zmiennej Stan_enk i nie jest
do niczego wykorzystywany. Przycisk
impulsatora jest podobnie obsługiwa-
ny jak przycisk w programie z list.
1, czyli za pomocą instrukcji Deboun-
ce . Po przyciśnięciu osi impulsatora
wywoływany jest podprogram Obs_s ,
w którym wyświetlany jest stan przy-
cisku oraz następuje oczekiwanie na
puszcze przycisku za pomocą instruk-
cji Bitwait . Jak pokazano obsługa po-
jedynczych przycisków, klawiatur czy
nawet impulsatora w Bascomie jest
Rys. 8.
dosyć prosta. Niewątpliwie ułatwi-
ły to dedykowane im instrukcje oraz
funkcje. Podczas budowania własnych
systemów mikroprocesorowych należy
wziąć pod uwagę, jeśli będzie po-
trzebnych wiele przycisków czy przy-
padkiem nie lepszym rozwiązaniem
będzie użycie klawiatury AT, z której
obsługą nie ma żadnych problemów,
czy zamiast stosowania kilku przyci-
sków czasem nie lepszym rozwiąza-
niem będzie przykładowo impulsator.
W budowanych urządzeniach można
także rozważyć możliwość zastosowa-
nia gotowej klawiatury matrycowej z
niewielką liczbą klawiszy (na przy-
kład taką jak na rys. 2, EP3/2005)
która ma już oznaczone przyciski i
jest łatwa w zamocowaniu poprzez
przyklejenie do obudowy urządzenia.
Marcin Wiązania, EP
marcin.wiazania@ep.com.pl
88
Elektronika Praktyczna 4/2005
27834729.001.png 27834729.012.png 27834729.023.png 27834729.034.png 27834729.035.png 27834729.036.png 27834729.037.png 27834729.038.png 27834729.039.png 27834729.040.png 27834729.041.png 27834729.042.png 27834729.043.png 27834729.044.png 27834729.045.png 27834729.046.png 27834729.047.png 27834729.048.png 27834729.049.png 27834729.050.png 27834729.051.png 27834729.052.png 27834729.053.png 27834729.054.png 27834729.055.png 27834729.056.png 27834729.057.png 27834729.058.png 27834729.059.png 27834729.060.png 27834729.061.png 27834729.062.png 27834729.063.png 27834729.064.png 27834729.065.png 27834729.066.png 27834729.067.png 27834729.068.png 27834729.069.png 27834729.070.png 27834729.071.png 27834729.072.png 27834729.073.png 27834729.074.png 27834729.075.png 27834729.076.png 27834729.077.png 27834729.078.png 27834729.079.png 27834729.080.png 27834729.082.png 27834729.083.png 27834729.084.png 27834729.085.png 27834729.086.png 27834729.087.png 27834729.088.png 27834729.089.png 27834729.090.png 27834729.091.png 27834729.093.png 27834729.094.png 27834729.095.png 27834729.096.png 27834729.097.png 27834729.098.png 27834729.099.png 27834729.100.png 27834729.101.png 27834729.102.png 27834729.104.png 27834729.105.png 27834729.106.png 27834729.107.png 27834729.108.png 27834729.109.png 27834729.110.png 27834729.111.png 27834729.112.png 27834729.113.png 27834729.115.png 27834729.116.png 27834729.117.png 27834729.118.png 27834729.119.png 27834729.120.png 27834729.121.png 27834729.122.png 27834729.123.png 27834729.124.png 27834729.002.png 27834729.003.png 27834729.004.png 27834729.005.png 27834729.006.png 27834729.007.png 27834729.008.png 27834729.009.png 27834729.010.png 27834729.011.png 27834729.013.png 27834729.014.png 27834729.015.png 27834729.016.png 27834729.017.png 27834729.018.png 27834729.019.png 27834729.020.png 27834729.021.png 27834729.022.png 27834729.024.png 27834729.025.png 27834729.026.png 27834729.027.png 27834729.028.png 27834729.029.png 27834729.030.png 27834729.031.png 27834729.032.png 27834729.033.png
Zgłoś jeśli naruszono regulamin