97_98.pdf
(
327 KB
)
Pobierz
C dla mikrokontrolerów 8051, część 12
K U R S
W†ostatniej czÍúci cyklu poúwiÍconego obs³udze
klawiatur za pomoc¹ mikrokontrolerÛw programowanych w†jÍzyku
C†przedstawiamy najbardziej ekonomiczny - z†punktu widzenia
część 12
wydajnoúci pracy mikrokontrolera - sposÛb obs³ugi klawiatury:
za pomoc¹ przerwaÒ sprzÍtowych.
Obsługa klawiatury w C, część 3
Przerwania i†klawiatura
Dotychczas we wszystkich prezento-
wanych przyk³adach klawiatury by³y ob-
s³ugiwane z†wykorzystaniem techniki
zwanej odpytywaniem lub przegl¹daniem
(
pooling
). Teraz pokaøÍ przyk³ad klawia-
tury, ktÛra obs³ugiwana bÍdzie na ø¹da-
nie, po naciúniÍciu klawisza. Do jej wy-
konania wykorzystam przerwanie zewnÍt-
rzne INT0 mikrokontrolera 8051, jak to
pokazano na
rys. 6
.
Podobnie jak poprzednio wykorzystu-
jemy przyciski zajmuj¹ce bity od 0†do
4†portu P1. W†sumie daje to piÍÊ klawi-
szy. Identycznie jak w†poprzednich przy-
k³adach stanem aktywnym jest stan niski
- jego pojawienie siÍ na wejúciu mikro-
kontrolera oznacza wciúniÍcie klawisza.
Do poszczegÛlnych bitÛw portu pod³¹czo-
ne s¹ rezystory
pull-up
, ktÛrych zadaniem
jest zwiÍkszenie odpornoúci mikrokontro-
lera na zak³Ûcenia. Jeúli uøywasz niewiel-
kiej, lokalnej klawiatury pod³¹czonej blis-
ko uk³adu mikrokontrolera (przewÛd nie
d³uøszy niø 15...20 cm) - moøesz ich nie
stosowaÊ. Wejúcia portÛw pod³¹czone s¹
do wejúÊ oúmiowejúciowej bramki NAND
(7430). Jej zadaniem jest wygenerowanie
sygna³u przerwania w†momencie naciúniÍ-
cia klawisza. Na wyjúciu bramki NAND
(negacja iloczynu) pojawia siÍ jednak syg-
na³ o†fazie przeciwnej niø nam potrzeb-
na: w†sytuacji, gdy wszystkie wejúcia
bramki s¹ w†stanie wysokim (czyli nie
jest wciúniÍty øaden z†klawiszy), wyjúcie
bramki jest w†stanie niskim. Gdy na do-
wolnym z†wejúÊ pojawi siÍ stan logiczny
niski, to wyjúcie bramki przyjmuje stan
wysoki. Odpowiada to narastaj¹cemu zbo-
czu sygna³u na wejúciu przerwania INT0
po wciúniÍciu klawisza. Opadaj¹ce zbocze,
ktÛre wyzwala przerwanie (jest to zwi¹-
zane z†zasad¹ dzia³ania mikrokontrolera
z†rodziny 8051, ktÛry wymaga opadaj¹ce-
go zbocza lub poziomu niskiego, aby uru-
chomiÊ procedurÍ obs³ugi przerwania), po-
jawi siÍ dopiero po zwolnieniu przycis-
ku. Niestety, jest to zbyt pÛüno, ponie-
waø nie bÍdziemy w†stanie sprawdziÊ,
ktÛry przycisk zosta³ wciúniÍty. W†zwi¹z-
ku z†tym wymagane jest uøycie uk³adu
inwertera dla odwrÛcenia fazy sygna³u.
Faktycznie realizowana jest wiÍc funkcja
AND, a†nie NAND.
Moøna rÛwnieø pokusiÊ siÍ o†wyko-
nanie bramki AND za pomoc¹ diod (
rys.
7
). Jest to rozwi¹zanie bardzo oszczÍdne,
jeúli rozpatrywaÊ je pod k¹tem ceny uøy-
tych do konstrukcji elementÛw. Moøe nie
tak ìeleganckieî jak z†wykorzystaniem
uk³adÛw scalonych, jednak tanie i†rÛw-
nie skuteczne.
Nowatorska jest w†tym przyk³adzie
tylko metoda. Nie angaøujmy mikrokont-
rolera w†przegl¹danie stanu klawiatury,
zajmujemy siÍ ni¹ tylko wÛwczas, gdy
jest to konieczne. Na øyczenie moøliwe
jest rÛwnieø wy³¹czenie obs³ugi klawiszy
poprzez prost¹ blokadÍ przyjmowania
przerwania z†INT0 (zerowanie bitu IE0).
Metoda ta jak kaøda ma swoje wady
i†zalety: nie bÍdziemy ich tu dyskuto-
waÊ, zajmijmy siÍ programem obs³ugi.
Najwaøniejsz¹ czÍúci¹ programu jest
funkcja obs³uguj¹ca przerwanie. Zajmuje
siÍ ona rozpoznaniem, ktÛry z†klawiszy
zosta³ naciúniÍty, ustawia bity zmiennej
status. Podobnie jak poprzednio funkcja
printf
wysy³a, korzystaj¹c z†UART, numer
wciúniÍtego klawisza.
Jacek Bogusz, AVT
jacek.bogusz@ep.com.pl
List. 6. Przykładowy program obsługujący klawiaturę w przerwaniu INT0
/* prosty program demonstracyjny „przerwanie generowane po wciśnięciu klawisza”
wykorzystane są bity P1.0 do P1.4 oraz wejście zewnętrznego przerwania INT0
rezonator kwarcowy 8MHz */
#include <reg51.h>
//dołączenie definicji rejestrów mikrokontrolera
#include <stdio.h>
//prototyp funkcji printf
#define PortKey P1
//definicja bitu portu klawisza
#define Key_1 0b00000001
//maski dla poszczególnych bitów klawiszy
#define Key_2 0b00000010
#define Key_3 0b00000100
#define Key_4 0b00001000
#define Key_5 0b00010000
#define mask 0b00011111
//maska bitów klawiatury dla operacji logicznych
unsigned char status = 0;
//status, ustawiany w obsłudze przerwania
//odczyt klawiatury podłączonej do PortKey
//jest to funkcja obsługi przerwania używająca banku rejestrów 1
void KbdRead() interrupt 1 using 1
{
int i;
unsigned char p;
p = PortKey;
//odczyt bitów portu
p = ~p & mask;
for (i=0; i<1300; i++); //pauza 20 ms dla rezonatora 8MHz
status = PortKey;
//ponowny odczyt bitów klawiatury dla weryfikacji
status = ~status & mask;
if (p != status) status = 0; //ustawienie zmiennej status
}
//początek programu głównego
void main(void)
{
PortKey |= ~mask;
//ustawienie linii klawiatury
EX0 = 1;
//zezwolenie na przyjmowanie przerwań INT0
EA = 1;
//załączenie przerwań
while (1)
//pętla nieskończona
{
if (status)
{
if (status && Key_1) printf(„%s\n”,”Klawisz 1");
if (status && Key_2) printf(„%s\n”,”Klawisz 2");
if (status && Key_3) printf(„%s\n”,”Klawisz 3");
if (status && Key_4) printf(„%s\n”,”Klawisz 4");
if (status && Key_5) printf(„%s\n”,”Klawisz 5");
status = 0;
}
}
}
Elektronika Praktyczna 5/2003
97
K U R S
Rys. 6. Schemat elektryczny klawiatury generującej
sygnał przerwania po naciśnięciu dowolnego przycisku
Rys. 7. Schemat elektryczny klawiatury generującej sygnał
przerwania po naciśnięciu dowolnego przycisku z bramką AND
zbudowaną z diod
98
Elektronika Praktyczna 5/2003
Plik z chomika:
wilo1981
Inne pliki z tego folderu:
1.pdf
(288 KB)
129_130.pdf
(322 KB)
133_136.pdf
(554 KB)
138_140.pdf
(116 KB)
14_18.pdf
(434 KB)
Inne foldery tego chomika:
01.03
02.03
03.03
04.03
06.03
Zgłoś jeśli
naruszono regulamin