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
32579370.058.png 32579370.069.png 32579370.080.png 32579370.091.png 32579370.001.png 32579370.009.png 32579370.010.png 32579370.011.png 32579370.012.png 32579370.013.png 32579370.014.png 32579370.015.png 32579370.016.png 32579370.017.png 32579370.018.png 32579370.019.png 32579370.020.png 32579370.021.png 32579370.022.png 32579370.023.png 32579370.024.png 32579370.025.png 32579370.026.png 32579370.027.png 32579370.028.png 32579370.029.png 32579370.030.png 32579370.031.png 32579370.032.png 32579370.033.png 32579370.034.png 32579370.035.png 32579370.036.png 32579370.037.png 32579370.038.png 32579370.039.png 32579370.040.png 32579370.041.png 32579370.042.png 32579370.043.png 32579370.044.png 32579370.045.png 32579370.046.png 32579370.047.png 32579370.048.png 32579370.049.png 32579370.050.png 32579370.051.png 32579370.052.png 32579370.053.png 32579370.054.png 32579370.055.png 32579370.056.png 32579370.057.png 32579370.059.png 32579370.060.png 32579370.061.png 32579370.062.png 32579370.063.png 32579370.064.png 32579370.065.png 32579370.066.png 32579370.067.png 32579370.068.png 32579370.070.png 32579370.071.png 32579370.072.png 32579370.073.png 32579370.074.png 32579370.075.png 32579370.076.png 32579370.077.png 32579370.078.png 32579370.079.png 32579370.081.png 32579370.082.png 32579370.083.png 32579370.084.png 32579370.085.png 32579370.086.png 32579370.087.png 32579370.088.png 32579370.089.png 32579370.090.png 32579370.092.png 32579370.093.png 32579370.094.png 32579370.095.png 32579370.096.png 32579370.097.png 32579370.098.png 32579370.099.png 32579370.100.png 32579370.101.png
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
32579370.002.png 32579370.003.png 32579370.004.png 32579370.005.png 32579370.006.png 32579370.007.png 32579370.008.png
Zgłoś jeśli naruszono regulamin