moje9.doc

(104 KB) Pobierz
POLITECHNIKA LUBELSKA

 

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.

Zgłoś jeśli naruszono regulamin