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)
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_COD EQU 00000100B ;wybrane klawisz 3 (strzałka w prawo)
LCALL LCD_CLR
MOV R0,#LCDWD
MOV R1,#LCDRC
MOV B,#CSDS ;adres wyboru klawisza (rejestr odpowiedzialny za aktywacje
MOVX @B,A ;wpisz wybrane klawisze
ADD A,#01111110 ;kod znaku strzałki w prawo
MOV R2,A
BUSY
MOVX A,@R1
JB ACC.7,BUSY
MOV A,R2
SJMP LOOP_NO
Zadanie 4.
Obserwacja sposobu dekodowania stanu klawiatury matrycowej i sposobu zamiany kodu 1 z 8 na zapis binarny.
MOV R0,#CSKB0 ;adres klawiszy 0..7 – uaktywnienie pierwszej kolumny klawiatury
;matrycowej
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
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
H
BIN
80
1
0
...
tomasz.kubiak.sap