8051 i klawisze
Masz problem? Zapytaj na forum elektroda.pl
From: "Piotr" <bodek_at_nospam_mech.pw.edu.pl>
Subject: 8051 i klawisze
Date: Tue, 11 Dec 2001 16:02:13 +0100
Poszukuje przykladow programikow w assemblerze obslugujacych
przycisk/przyciski podlaczone do jednego z portow. Szukam jakchs przykladow
sterowania na przyklad menu.... Niby to proste, ale jakos nie moge tego
rozsadnie wymyslic. Ogolnie poszukuje wszelkich przykladow w asmie na 8051
(na przyklad utknalem na wypisywaniu na wyswietlaczu liczby w systemie
dziesietnym zawartej w jakims rejestrze).
Piotr
From: "ww" <wojtek_at_nospam_uz.pl>
Subject: Odp: 8051 i klawisze
Date: Tue, 11 Dec 2001 17:19:17 +0100
http://www.uz.pl/wojtek/klawiatura.asm
Date: Tue, 11 Dec 2001 22:24:52 +0100
From: Ireneusz Niemczyk <"i,niemczyk"_at_nospam_multispedytor.com.pl>
Subject: Re: 8051 i klawisze
--------------93D58FA5A7250DC2FD0E0048
Content-Type: text/plain; charset=iso-8859-2
Content-Transfer-Encoding: 8bit
Jeżeli możesz sobie pozwolić na wstrzymanie głównego wątku, to najprościej dać
obsługę w głównej pętli i zbudować menu tak samo jak zagłębienie podprogramów.
Jest to jak gdyby...naturalne rozwiązanie ;-)
Może to np: wyglądać tak:
założenia:
SET_W, MAIN, EDIT, TAK, NIE - podpięte do portu i zwierane do masy (a więc
uwaga z P0 - nie ma podciągania do plusa - nie będzie działać bez dodatkowych
oporników)
LED - diodka podłączona do jakiegoś portu pomiędzy plus a pin procka.
MAIN:
JB SET_W,MAIN_NS ;CZY KLAWISZ SET NACISNIETY ? JEŻELI NIE TO SPRAWDZAMY
KOLEJNY KLAWISZ
CALL DEL_200ms ;ODCZEKAĆ NA USTABILIZOWANIE SIE STYKOW KLAWISZA...
JNB SET_W,$ ; ODCZEKAĆ NA WYPADEK, GDYBY NIE ZOSTAŁ ZWOLNIONY
CALL BEEP ;SIAKIŚ SYGNAŁ ŻE ZADZIAŁAŁO
CALL MAIN_SET ;OBSŁUGA W PRZYPADKU NACIŚNIĘCIA KLAWISZA SET
CALL WITAJ_5 ;ODTWORZENIE WYŚWIETLACZA PO WYJSCIU Z PROCEDURY OBSŁUGI
KLAWISZA SET
MAIN_NS:
JB MENU,MAIN_NM ;CZY KLAWISZ MENU NACISNIETY ?
CALL DEL_200ms ;DALEJ ANALOGICZNIE......WIĘC POMINĘ OPIS.
JNB MENU,$
CALL BEEP
CALL MAIN_MENU
CALL WITAJ_5
MAIN_NM:
JB EDIT,MAIN_NE ;CZY KLAWISZ EDIT NACISNIETY ?
JB EDIT,MAIN
CALL DEL_200ms
JNB EDIT,$
CALL BEEP
CALL MAIN_EDIT
CALL WITAJ_5
MAIN_NE:
JB TAK,MAIN_NT ;CZY KLAWISZ TAK NACISNIETY ?
CALL DEL_200ms
JNB TAK,$
CALL BEEP
CALL MAIN_TAK
CALL WITAJ_5
MAIN_NT:
JB NIE,MAIN ;CZY KLAWISZ NIE NACISNIETY ?
CALL DEL_200ms
JNB NIE,$
CALL BEEP
CALL MAIN_NIE
CALL WITAJ_5
JMP MAIN
Taki fragment załatwia obsługę 5 klawiszy (SET, MENU, EDIT, TAK, NIE) przy
pomocy 2 procedur pomocniczych (DEL_200ms - odczekanie na ustablilizowanie się
styków oraz BEEP - potwierdzenie naciśnięcia klawisza krótkim sygnałem z
piszczka). Oczywiście to tylko przykład (i to chyba najprostszy). Acha -
jeszcze WITAJ_5....powoduje wyświetla treść menu głównego. Analogicznie można
zbudowć procedurki odpowiedzialne za poszczególne poziomy menu, lub w
przypływie _czułości_ zrobić procedurę wołaną z parametrem i w ten sposób
decydować o wyświetlanym w danym poziomie menu.
Teraz tak, w przypadku naciśnięcia klawisza (i jego puszczenia oczywiście)
wołana jest procedura jego obsługi (np: MAIN_SET dla klawisza SET).
W tej procedurze możemy podmienić komunikat na wyświetlaczu, coś zmodyfikować,
wreszcie trafić na bliźniaczą procedurę czekającą na naciśnięcie jakiś
klawiszy. Może to wyglądać np. tak (klawisz TAK robi beep i zgasi/zapali
diodkę LED, klawisz NIE robi tylko beep i powrót do poprzedniego menu)
MAIN_SET:
CALL WITAJ_6 ;menu na wyświetlaczu zmienione na adekwatne do
wcześniejszego wyboru klawiszem SET
CLR LED ;cokolwiek co musimy zrobić w tym menu (np: zapalić jakąś
diodkę... na p0.0
...
...
SET_NT:
JB TAK,SET_NN ;CZY KLAWISZ TAK NACISNIETY ?
CALL DEL_200ms
JNB TAK,$
CALL BEEP
CPL LED ;zrobiliśmy beep i zmieniliśmy stan diody....nie
opuszczamy tego poziomu menu.
SET_NN:
JB NIE,SET_NT ;CZY KLAWISZ NIE NACISNIETY ?
CALL DEL_200ms
JNB NIE,$
CALL BEEP ;zrobiliśmy beep, coby potwierdzić naciśnięcie i spadamy
do poprzedniego menu...
RET
Generalnie dużo zależy od budowy całęgo programu. Taka obsługa powoduje
zawieszenie wykonywania programu w przypadku permanentnego wciśnięcia klawisza
- w przerwania bym jej nie pchał, ale za to doskonale radzi sobie z
naciśnięciem kilku klawiszy na raz. Oczywiście jak klawiszy będzie więcej -
trzeba będzie dopisać procedurkę dekodującą stan poszczególnych klawiszy - nie
wypada podłączać np: 16 klawiszy w 2 kolejne porty procka ;-), ale sama obsługa
może pozostać bez zmian. Tak chyba najprościej na początek.
Mam nadzieję, że trochę pomoże ;-)
--
PZD, Irek.N.
<Ze wzgledu na ilosc spamu w necie
zamienilem kropke na przecinek>
ps. jeśli coś skopałem - poprawcie proszę.
ps2. mam nadzieję, że czytacz tego nie potnie na węższe wiersze....
--------------93D58FA5A7250DC2FD0E0048
Content-Type: text/html; charset=iso-8859-2
Content-Transfer-Encoding: 8bit
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
Jeżeli możesz sobie pozwolić na wstrzymanie głównego wątku, to najprościej
dać obsługę w głównej pętli i zbudować menu tak samo jak zagłębienie podprogramów.
Jest to jak gdyby...naturalne rozwiązanie ;-)
<br>Może to np: wyglądać tak:
<p>założenia:
<br>SET_W, MAIN, EDIT, TAK, NIE - podpięte do portu i zwierane do masy
(a więc uwaga z P0 - nie ma podciągania do plusa - nie będzie działać bez
dodatkowych oporników)
<br>LED - diodka podłączona do jakiegoś portu pomiędzy plus a pin procka.
<br>
<br> <tt></tt>
<p><tt>MAIN:</tt>
<br><tt> JB SET_W,MAIN_NS ;CZY KLAWISZ
SET NACISNIETY ? JEŻELI NIE TO SPRAWDZAMY KOLEJNY KLAWISZ</tt>
<br><tt> CALL DEL_200ms
;ODCZEKAĆ NA USTABILIZOWANIE SIE STYKOW KLAWISZA...</tt>
<br><tt> JNB SET_W,$
; ODCZEKAĆ NA WYPADEK, GDYBY NIE ZOSTAŁ ZWOLNIONY</tt>
<br><tt> CALL BEEP
;SIAKIŚ SYGNAŁ ŻE ZADZIAŁAŁO</tt>
<br><tt> CALL MAIN_SET
;OBSŁUGA W PRZYPADKU NACIŚNIĘCIA KLAWISZA SET</tt>
<br><tt> CALL WITAJ_5
;ODTWORZENIE WYŚWIETLACZA PO WYJSCIU Z PROCEDURY OBSŁUGI KLAWISZA SET</tt><tt></tt>
<p><tt>MAIN_NS:</tt>
<br><tt> JB MENU,MAIN_NM ;CZY
KLAWISZ MENU NACISNIETY ?</tt>
<br><tt> CALL DEL_200ms
;DALEJ ANALOGICZNIE......WIĘC POMINĘ OPIS.</tt>
<br><tt> JNB MENU,$</tt>
<br><tt> CALL BEEP</tt>
<br><tt> CALL MAIN_MENU</tt>
<br><tt> CALL WITAJ_5</tt><tt></tt>
<p><tt>MAIN_NM:</tt>
<br><tt> JB EDIT,MAIN_NE ;CZY KLAWISZ
EDIT NACISNIETY ?</tt>
<br><tt> JB EDIT,MAIN</tt>
<br><tt> CALL DEL_200ms</tt>
<br><tt> JNB EDIT,$</tt>
<br><tt> CALL BEEP</tt>
<br><tt> CALL MAIN_EDIT</tt>
<br><tt> CALL WITAJ_5</tt><tt></tt>
<p><tt>MAIN_NE:</tt>
<br><tt> JB TAK,MAIN_NT ;CZY KLAWISZ
TAK NACISNIETY ?</tt>
<br><tt> CALL DEL_200ms</tt>
<br><tt> JNB TAK,$</tt>
<br><tt> CALL BEEP</tt>
<br><tt> CALL MAIN_TAK</tt>
<br><tt> CALL WITAJ_5</tt><tt></tt>
<p><tt>MAIN_NT:</tt>
<br><tt> JB NIE,MAIN
;CZY KLAWISZ NIE NACISNIETY ?</tt>
<br><tt> CALL DEL_200ms</tt>
<br><tt> JNB NIE,$</tt>
<br><tt> CALL BEEP</tt>
<br><tt> CALL MAIN_NIE</tt>
<br><tt> CALL WITAJ_5</tt>
<br><tt> JMP MAIN</tt>
<br><tt></tt> <tt></tt>
<p>Taki fragment załatwia obsługę 5 klawiszy (SET, MENU, EDIT, TAK, NIE)
przy pomocy 2 procedur pomocniczych (DEL_200ms - odczekanie na ustablilizowanie
się styków oraz BEEP - potwierdzenie naciśnięcia klawisza krótkim sygnałem
z piszczka). Oczywiście to tylko przykład (i to chyba najprostszy). Acha
- jeszcze WITAJ_5....powoduje wyświetla treść menu głównego. Analogicznie
można zbudowć procedurki odpowiedzialne za poszczególne poziomy menu, lub
w przypływie _czułości_ zrobić procedurę wołaną z parametrem i w
ten sposób decydować o wyświetlanym w danym poziomie menu.
<p>Teraz tak, w przypadku naciśnięcia klawisza (i jego puszczenia oczywiście)
wołana jest procedura jego obsługi (np: MAIN_SET dla klawisza SET).
<br>W tej procedurze możemy podmienić komunikat na wyświetlaczu, coś zmodyfikować,
wreszcie trafić na bliźniaczą procedurę czekającą na naciśnięcie jakiś
klawiszy. Może to wyglądać np. tak (klawisz TAK robi beep i zgasi/zapali
diodkę LED, klawisz NIE robi tylko beep i powrót do poprzedniego menu)
<br>
<br>
<p><tt>MAIN_SET:</tt>
<br><tt> CALL WITAJ_6
;menu na wyświetlaczu zmienione na adekwatne do wcześniejszego wyboru klawiszem
SET</tt>
<br><tt> CLR LED
;cokolwiek co musimy zrobić w tym menu (np: zapalić jakąś diodkę... na
p0.0</tt>
<br><tt> ...</tt>
<br><tt> ...</tt>
<br><tt></tt>
<br><tt></tt> <tt></tt>
<p><tt>SET_NT:</tt>
<br><tt> JB TAK,SET_NN ;CZY
KLAWISZ TAK NACISNIETY ?</tt>
<br><tt> CALL DEL_200ms</tt>
<br><tt> JNB TAK,$</tt>
<br><tt> CALL BEEP</tt>
<br><tt> CPL LED
;zrobiliśmy beep i zmieniliśmy stan diody....nie opuszczamy tego poziomu
menu.</tt><tt></tt>
<p><tt>SET_NN:</tt>
<br><tt> JB NIE,SET_NT ;CZY
KLAWISZ NIE NACISNIETY ?</tt>
<br><tt> CALL DEL_200ms</tt>
<br><tt> JNB NIE,$</tt>
<br><tt> CALL BEEP
;zrobiliśmy beep, coby potwierdzić naciśnięcie i spadamy do poprzedniego
menu...</tt>
<br> RET
<br>
<p>Generalnie dużo zależy od budowy całęgo programu. Taka obsługa powoduje
zawieszenie wykonywania programu w przypadku permanentnego wciśnięcia klawisza
- w przerwania bym jej nie pchał, ale za to doskonale radzi sobie z naciśnięciem
kilku klawiszy na raz. Oczywiście jak klawiszy będzie więcej - trzeba będzie
dopisać procedurkę dekodującą stan poszczególnych klawiszy - nie wypada
podłączać np: 16 klawiszy w 2 kolejne porty procka ;-), ale sama obsługa
może pozostać bez zmian. Tak chyba najprościej na początek.
<p>Mam nadzieję, że trochę pomoże ;-)
<br>
<p>--
<br>PZD, Irek.N.
<br><Ze wzgledu na ilosc spamu w necie
<br> zamienilem kropke na przecinek>
<br>ps. jeśli coś skopałem - poprawcie proszę.
<br>ps2. mam nadzieję, że czytacz tego nie potnie na węższe wiersze....</html>
--------------93D58FA5A7250DC2FD0E0048--