Politechnika Lubelska
Sprawozdanie
Z laboratorium Podstaw techniki mikroprocesorowej
Tytuł ćwiczenia: Klawiatury matrycowe. Klawiatury sekwencyjne.
Imię i nazwisko:
Nr ćwiczenia:C6
Grupa: Mechatronika
Rok akademicki 2014/15
Kod programu:
LED EQU P1.7
KEY EQU P3.5 ;odczyt klawiatury
;Stałe używane w programie
KEY_COD EQU 00001001B ;wybrane klawisze – 1 i 4
LJMP START
ORG 100H
START:
MOV R0,#CSDS ;adres wyboru klawisza
MOV A,#KEY_COD
MOVX @R0,A ;wpisz wybrane klawisze
LOOP:
MOV C,KEY ;czytaj stan klawiszy
CPL C ;neguj
MOV LED,C ;zapal diode TEST gdy
;klawisz jest naciśnięty
SJMP LOOP
W.w. program uaktywnia z klawiatury strzałkę w górę i enter. Po wciśnięciu i trzymaniu danego klawisza dioda świeci światłem ciągłym.
Aby aktywnymi klawiszami był ESC i strzałka w lewo, należy zmodyfikować wartość KEY_COD EQU z 00001001B, na 00100010B.
Adres bufora CSDS sterującego klawiaturą sekwencyjną to: MOV R0, #30H.
Kod programu:
LED EQU P1.7
KEY EQU P3.5 ;odczyt klawiatury
;Stale uzywane w programie
KEY_COD EQU 00001001B ;wybrane klawisze-1 i 4
LJMP START
ORG 100H
START:
MOV R0,#CSDS ;adres wyboru klawisza
MOV A,#KEY_COD
MOVX @R0,A ;wpisz wybrane klawisze
LOOP_NO:
JNB KEY,LOOP_NO ;czekaj na naciśnięcie
;klawisza
MOV A,#10 ;eliminacja drgań styków
LCALL DELAY_MS
JNB KEY,LOOP_NO ;czy nadal naciśniety
CPL LED ;neguj stan diody TEST
;przy naciśnięciu klaw.
LOOP_YES:
JB KEY,LOOP_YES ;czekaj na zwolnienie
;klawisza
MOV A,#10 ;eliminacja drgań styków
LCALL DELAY_MS
JB KEY,LOOP_YES ;czy klawisz zwolniony
SJMP LOOP_NO ;powrót do pętli czekania
;na klawisz
Wciśnięcie aktywnego klawisza zapala diodę i podtrzymuje jej stan, dopiero powtórne wciśnięcie ją gasi. Można zapalać i gasić diodę różną kombinacją klawiszy, nie koniecznie tymi samymi.
Zwiększenie interwału czasowego skutkuje dłuższym sprawdzaniem przez mikrokontroler, czy dany klawisz jest wciśnięty. Aby zwiększyć interwał, należy zmienić wartość linii MOV A,#10, na MOV A,#20 w LOOP_NO, oraz LOOP_YES.
Kod programu:
LJMP START
ORG 100H
START:
LCALL LCD_CLR
MOV R0,#CSKB0 ;adres klawiszy 0..7
LOOP_NO:
MOVX A,@R0 ;odczyt stanu klawiszy
CPL A
JZ LOOP_NO ;czy klawisz naciśniety
MOV R2,#0FFH
LOOP_NR: ;przekoduj nr klawisza
;kod 1z 8 na cyfrę 0..7
;pętla będzie wykonana 1-8 razy
INC R2 ;wiec 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
Adresy buforów sterujących pierwszą grupa klawiszy 0 – 7:
82B9H, 8300H, 8304H, 8316H, 8331H, 837CH,
8421H, 83BBH.
Do uaktywnić klawisze: 8,9, ↑, ↓, ←, →, ENTER, ESC, należy zmienić linię MOV R0,#CSKB0 na
MOV R1,#CSKB1.
Kolejne wartości akumulatora w trakcie wykonywania instrukcji RRC A dla poszczególnych klawiszy:
0: 01 00
1: 02 01
2: 04 02
3: 08 04
4: 10 08
5: 20 10
6: 40 20
7: 80 40
Nie zrealizowano.