|
LABORATORIUM PODSTAW SYSTEMÓW MIKROPROCESOROWYCH |
WYDZIAŁ ELEKTRYCZNY |
|
KLAWIATURA PRZEGLĄDANA SEKWENCYJNIE.
KLAWIATURA MATRYCOWA.
Data wykonania ćwiczenia: 05.12.97 |
Wykonawcy:Marcin Grabowiecki Sebastian Chmielowiec Jacek Gawęda
|
|
|
Cel ćwiczenia:
Celem ćwiczenia było zapoznanie się z ze sposobami obsługi klawiatury w systemie DSM-51, zarówno sekwencyjnej jak i matrycowej.
Zadanie 1.
W zadaniu tym przeanalizowany został program obsługujący klawiaturę sekwencyjną i reagujący tylko na klawisze 1 i 4.
W celu uaktywnienia innych klawiszy należy zmienić maskę KEY_COD . Program ,który będzie
reagował na wszystkie klawisze powinien więc mieć następującą postać:
LED EQU P1.7
KEY EQU P3.5
KEY_COD EQU 11111111B
LJMP START
ORG 100H
START:
MOV R0,#CSDS
MOV A,#KEY_COD
MOVX @R0,A
LOOP:
MOV C,KEY
CPL C
MOV LED,C
SJMP LOOP
Zadanie 2.
W tym zadaniu został przeanalizowany poprzedni program lecz uwzględniający drgania zestyków klawiatury. W celu ich eliminacji zastosowano opóznienie czasowe i powtórne sprawdzanie klawiatury.
Zadanie 3.
Modyfikacja programu z zadania 2. Program eliminuje drgania zestyków klawiatury oraz rozpoznaje kod naciśniętego klawisza i wyświetla go na wyświetlaczu.
LED EQU P1.7
KEY EQU P3.5
KEY_COD EQU 01H
LJMP START
ORG 100H
START:
LCALL LCD_CLR
MOV R0,#CSDS
MOV A,#KEY_COD ; do ACC liczba 01H
LOOP_NO:
RR A ; ACC jest przesuwany w prawo
MOVX @R0,A ;wpisz wybrane klawisze
JNB KEY,LOOP_NO
PUSH ACC ; ACC na stos
MOV A,#10 ;eliminacja drgań styków
LCALL DELAY_MS
POP ACC
JNB KEY,LOOP_NO ;czy nadal naciśnięty
LCALL WRITE_HEX ; wyświetl kod klawisza
LOOP_YES:
JB KEY,$ ; czekaj na puszczenie klawisza
MOV A,#10 ; eliminacja drgań zestyków
LCALL DELAY_MS
JB KEY,LOOP_YES
MOV A,#KEY_COD ; wróć do początku programu
AJMP LOOP_NO
Jak widać program ten umożliwia rozróżnianie naciśniętych klawiszy poprzez zmianę maski która wysyłana jest do bufora CSDS. Maska ta jest zmieniana w akumulatorze poprzez zastosowanie instrukcji RR ,która przesuwa zawartość akumulatora w prawo. W tym przypadku przesuwana jest liczba 01H, dzięki czemu po każdym przesunięciu i wysłaniu maski do bufora program czeka na naciśnięcie jednego specyficznego klawisza określonego tą maską. Następnie kod odpowiadający temu klawiszowi jest wyświetlany. Eliminacja drgań zestyków jest realizowana tak jak w poprzednim przykładzie.
Zadania 4,5.
Został przeanalizowany program obsługujący klawiaturę matrycową (klawisze 0-7).
Modyfikacja programu polega na eliminacji drgań zestyków klawiatury oraz obsługę klawiszy 8-15.
LJMP START
ORG 100H
START:
LCALL LCD_CLR
MOV R0,#CSKB0 ;adres klawiszy 0..7
MOV R1,#CSKB1 ;adres klawiszy 8..15
LOOP_NO:
MOV B,#0
MOVX A,@R0 ;odczyt stanu klawiszy (0-7)
CPL A
JNZ WYJSCIE ;czy klawisz naciśnięty (0-7)
ACALL 10MS
JNZ WYJSCIE
MOV B,#08H
MOVX A,@R1 ; odczyt stanu klawiszy (8-15)
CPL A
JZ LOOP_NO ; czy klawisz naciśnięty (8-15)
ACALL 10MS
JZ LOOP_NO
WYJSCIE:
MOV R2,#0FFH
LOOP_NR:
INC R2
RRC A
JNC LOOP_NR
MOV A,R2
ADD A,B ;przekoduj nr klawisza
LCALL WRITE_HEX ;wypisz kod klawisza
LOOP_YES:
MOVX A,@R0 ;odczyt stanu klawiszy (0-7)
CPL A
JNZ LOOP_YES ;czy klawisz zwolniony (0-7)
ACALL 10MS
JNZ LOOP_YES
MOVX A,@R1 ;odczyt stanu klawiszy (8-15)
CPL A
JNZ LOOP_YES ;czy klawisz zwolniony (8-15)
ACALL 10MS
JNZ LOOP_YES
SJMP LOOP_NO ;powrót do oczekiwania na
;naciśnięcie klawisza
10MS : PUSH ACC
MOV A,#10
LCALL DELAY_MS
POP ACC
Program obsługuje teraz klawisze 8-15 dzięki sprawdzaniu bufora CSKB1, który jest adresowany przez rejestr R1. Jeśli naciśnięto którykolwiek z klawiszy realizowane jest opóźnienie czasowe po czym stan klawiatury jest sprawdzany ponownie. W zależności od tego czy naciśnięty jest klawisz z dolnej czy z górnej grupy do rejestru B jest wpisywana wartość 0 albo 8 ,która pózniej służy do przenumerowania kodu klawisza. Rozpoznawanie ,który został naciśnięty klawisz odbywa się poprzez przesuwanie akumulatora instrukcją RRC w pętli dotąd aż wskaźnik C pokaże ,że naciśnięto klawisz. Jednocześnie w tej samej pętli jest zwiększana wartość rejestru R2 przechowującego kod klawisza. Następnie kod klawisza zostaje przenumerowany w akumulatorze i wyświetlony na LCD. Z kolei w pętli LOOP_YES program czeka na zwolnienie klawisza eliminując również drgania zestyków. Do realizacji opóznienia jest używany podprogram 10MS ,który nie nisczy zawartości akumulatora.
Wnioski:
Programy przeanalizowane w ćwiczeniu pozwoliły na zapoznanie się ze sposobami obsługi klawiatury w systemie. Obsługa klawiatury matrycowej wydaje się bardziej logiczna od obsługi klawiatury sekwencyjnej gdyż porty CSKB od razu zwracają do akumulatora pewną wartość co pozwala na łatwiejsze rozróżnianie klawiszy. Natomiast klawiatura sekwencyjna wymaga zmieniania maski w celu zidentyfikowania klawisza. Ten sposób wydaje się być w programie mniej przejrzysty i zrozumiały. Podczas uruchamiania programów w systemie DSM-51 można było czasami zaobserwować skutki drgań zestyków, które powodowały wielokrotne wyświetlanie tej samej liczby na wyświetlaczu. Wynika stąd wniosek ,że w programach obsługujących klawiaturę należy jednak stosować eliminację drgań zestyków.