Procesory8.doc

(132 KB) Pobierz
Zadanie 1

Zadanie 1.

Obserwacja sposobu odczytu danej pojawiającej się w momencie odczytu klawisza. Klawiatura sekwencyjna.

 

LED              EQU              P1.7                           

KEY              EQU              P3.5                            ;odczyt klawiatury (nadanie nazwy adresowi linii odczytu stanu klawiszia

;aktualnie wybranego)

 

 

KEY_COD EQU              00001001B              ;wybrane klawisze - 1i4

 

              LJMP              START

              ORG              100H

START:

 

MOV R0,#CSDS                                          ;adres wyboru klawisza (rejestr odpowiedzialny za aktywacje

;danego klawisza)

              MOV              A,#KEY_COD              ; wpisanie do ACC wartości odpowiadającej uaktywnieniu klawiszy 1 i 4

              MOVX              @R0,A                            ;wpisz wybrane klawisze

 

LOOP:

              MOV              C,KEY                            ;czytaj stan klawiszy czyli linii P3.5

              CPL              C                            ;neguj

              MOV              LED,C                            ;zapal diodę TEST gdy

                                                        ;klawisz jest naciśnięty

              SJMP              LOOP

 

Aby uaktywniać inne klawisze należy wprowadzić inną wartość do CSDS, np.:

MOV     R0,#CSDS

MOV      A,#00000300B                            ;czyli uaktywnij klawisz 3

MOVX  @R0,A

 

CSDS znajduje się pod adresem 30H

 

Zadanie 2.

 

Powyższy program został zmodyfikowany pod kątem eliminacji drgań styków, dodano 2 pętle w których rozpoznaje się stan linii P3.5 i opóźnia ponowny odczyt o wartość z akumulatora w ms :

 

;program z punktu pierwszego do momentu LOOP:

;modyfikacja

LOOP_NO:

              JNB              KEY,LOOP_NO              ;czekaj na naciśnięcie klawisza (skacz jeżeli P3.5 =0)

              MOV A,#10

              LCALL DELAY_MS

JNB KEY,LOOP_NO              ;sprawdź, czy klawisz nadal naciśnięty

CPL              LED                            ;neguj stan diody TEST jeżeli jeden z aktywnych klawiszy jest naciśnięty

;(aktywny stan 0)

 

LOOP_YES:

              JB              KEY,LOOP_YES ;czekaj na zwolnienie klawisza (skacz jeżeli P3.5=1)

              MOV A,#10

              LCALL DELAY_MS

JNB KEY,LOOP_YES

              SJMP              LOOP_NO                            ;powrót do pętli czekania na naciśnięcie klawisza

 

Zadanie 3.

Modyfikacja programu z punktu 2 tak, aby uzyskać przeglądanie klawiatury co 20 ms, a wynik obserwować na wyświetlaczy LCD:

 

 

 

KEY              EQU              P3.5                            ;odczyt klawiatury (nadanie nazwy adresowi linii odczytu stanu klawiszia

;aktualnie wybranego)

 

 

KEY_COD EQU              00000100B              ;wybrane klawisz  3 (strzałka w prawo)

 

              LJMP              START

              ORG              100H

START:

              LCALL LCD_CLR

              MOV R0,#LCDWD

              MOV R1,#LCDRC

MOV B,#CSDS                                          ;adres wyboru klawisza (rejestr odpowiedzialny za aktywacje

;danego klawisza)

              MOV              A,#KEY_COD              ; wpisanie do ACC wartości odpowiadającej uaktywnieniu klawiszy 1 i 4

              MOVX              @B,A                            ;wpisz wybrane klawisze

LOOP_NO:

              JNB              KEY,LOOP_NO              ;czekaj na naciśnięcie klawisza (skacz jeżeli P3.5 =0)

              MOV A,#10

              LCALL DELAY_MS

JNB KEY,LOOP_NO              ;sprawdź, czy klawisz nadal naciśnięty

              ADD A,#01111110            ;kod znaku strzałki w prawo

              MOV R2,A

BUSY

              MOVX  A,@R1

              JB          ACC.7,BUSY

              MOV A,R2

              MOVX @R0,A

              SJMP LOOP_NO

 

 

LOOP_YES:

              JB              KEY,LOOP_YES ;czekaj na zwolnienie klawisza (skacz jeżeli P3.5=1)

              MOV A,#10

              LCALL DELAY_MS

JNB KEY,LOOP_YES

              SJMP              LOOP_NO                            ;powrót do pętli czekania na naciśnięcie klawisza

 

Zadanie 4.

 

Obserwacja sposobu dekodowania stanu klawiatury matrycowej i sposobu zamiany kodu 1 z  8 na zapis binarny.

 

              LJMP              START

              ORG              100H

START:

 

              LCALL              LCD_CLR

              MOV              R0,#CSKB0              ;adres klawiszy 0..7 uaktywnienie pierwszej kolumny klawiatury

;matrycowej

 

LOOP_NO:

              MOVX              A,@R0                            ;odczyt stanu klawiszy

              CPL              A

              JZ              LOOP_NO              ;czy klawisz naciśnięty

 

              MOV              R2,#0FFH

LOOP_NR:                                          ;przekoduj nr klawisza

                                                        ;kod 1z8 na cyfrę 0..7

                                                        ;pętla będzie wykonana 1-8 razy

              INC              R2                            ;więc R2 osiągnie wartość 0..7

              RRC              A                            ;obrót akumulatora przez C

                                          ;aż odczytana 1 wsunie się do C

              JNC              LOOP_NR

 

              MOV              A,R2                            ;przekoduj nr klawisza

              ADD              A,#30H                            ;na kody znaków wyśw. LCD

              LCALL              WRITE_DATA              ;wypisz kod klawisza

             

LOOP_YES:

              MOVX              A,@R0                            ;odczyt stanu klawiszy

              CPL              A

              JNZ              LOOP_YES              ;czy klawisz zwolniony

 

              SJMP              LOOP_NO              ;powrót do oczekiwania na

                                                        ;naciśnięcie klawisza

Za wybór kolumny klawiszy odpowiedzialny jest adres 21H CSKB0 (odpowiada mu stan dodatkowych linii: A1=0, A0=1)

 

Stany akumulatora podczas obrotu w prawo przez bit C (przeniesienia) dla 2 liczb z klawiatury:

 

Wprowadzono liczbę 7

Wprowadzono liczbę 5

Stan akumulatora

Stan R2

Stan akumulatora

Stan R2

H

BIN

BIN

H

BIN

BIN

80

1

0

0

0

0

...

Zgłoś jeśli naruszono regulamin