Jste zde

Maticová klávesnica

Prakticky každé zapojenie s mikroprocesorom potrebuje meniť určité premenné. S výhodou sa k tomu

používajú maticové klávesnice. Väčšina však rieši problém zákmitov časovým oneskorením riešeným do slučky, čiže

procesor nič nerobí. Ďalší problém nastáva pri stlačení troch tlačítok do pravouhlého trojuholníka. Vtedy každý

software detekuje aj štvrtú avšak nestlačenú klávesu. Riešenie ostáva na programátorovi.

Program je napísaný tak aby čo najmenej zamestnával procesor. Pri jednom volaní scanuje jeden riadok, takže pre 4-riadkovú klávesnicu ho treba volať 4krát. Na konci scanovania riadku nastaví port na scanovanie ďalšieho riadku a ukončí podprogram.

Scan kód stlačenej klávesy uloží podprogram na vrchol posuvného registra. Po kompletnom zoscanovaní vloží počet stlačených kláves do registra "PocTlac". Jednoduchou kontrolou tohto registra môžeme vylúčiť chybné stlačenie na klávesnici.

Program počíta s pripojením klávesnice k portu P2 (P2.0-P2.3 riadky, P2.4-P2.7 stĺpce). Pripojenie portu je možné meniť v konštantách "keybPort" a usporiadanie riadky - stĺpce v časti "keyScan". Scan kódy jednotlivých tlačítok je možné meniť v časti "keyCode" a veľkosť posuvného registra v "fifiLenght".

$       TITLE(Key/8xc51/1.0)
;***********************************************************************
;*      Telo programu na odskusanie
;*
stack   segment idata
rseg    stack
ds      10h
cseg    at 00
org     0
using   0
mov     sp,#Stack
call    keyb
jmp     00
;***********************************************************************
;*      Copyright (c) 2002 Garaj
;*      Author: Dalibor Garaj
;***********************************************************************
;*Tento program sluzi na zosnimanie stlacenej klavesy na maticovej
;*klavesnici.
;*
;*      Pouzitie programu:
;*---------------------------
;*Podprogram detekuje stlacenu klavesu a jej ScanKod vlozi do FIFO
;*registra a incrementuje register poctu stlacenych tlacitok. Nakoniec
;*nastavi port klavesnice na zoskenovanie dalsieho riadku. Podprogram
;*pri jednom volani zoskenuje jeden riadok, takze na kompletne
;*zoskenovanie je nutne ho volat pre 4 riadky 4krat.
;*
;***********************************************************************
;*      Konstanty
;*---------------------------
keybPort        equ     p2
;*
;***********************************************************************
;*      Registre
;*---------------------------
KeybData        segment data
rseg    KeybData
pocTlac:        ds      1               ;pocet stlacenych tlacitok
pocTlacPrac:    ds      1               ;pracovny register
riadok:         ds      1               ;cislo aktivneho riadku
;*
;***********************************************************************
;* Nazov:       Keyb
;* Popis:       Obsluha maticovej klavesnice
;* Funkcia:     Nastavuje, cita port a dekoduje stlacenu klavesu
;* Podprogramy: FIFO
;* Vstupy:      Port klavesnice
;* Vystupy:     FIFO Data
;* Registre:    Acc,b,R1,DPTR
;*---------------------------
KeybCode        segment code
rseg    keybCode
keyb:
mov     a,keybPort      ;nacitaj port klavesnice
cpl     a               ;neguj
anl     a,#0f0h         ;vymaskuj
jz      keybInit        ;dalsi riadok
keyb1:
mov     r1,#4
mov     a,keybPort      ;nacitaj port klavenice
cpl     a
anl     a,#0fh          ;vymaskuj data
keybLoop:
rrc     a               ;rotuj
jc      KeybDekod       ;ak je stlacena dekoduj
keybLoop1:
djnz    r1,keybLoop     ;test dalsieho tlacitka v riadku
;bolo posledne
inc     riadok          ;nastav dalsi riadok
mov     a,riadok
cjne    a,#4,keybAll    ;je posledny?
keybInit:
mov     riadok,#0       ;na stav prvy riadok
mov     pocTlac,pocTlacPrac
mov     pocTlacPrac,#0  ;vynuluj pracovny register
keybAll:
mov     a,riadok        ;nastav port pre dalsie citanie
mov     dptr,#keyScan
movc    a,@a+dptr
mov     keybPort,a
keybEnd:
ret
keyScan:
db      11101111b       ;
db      11011111b
db      10111111b
db      01111111b
keybDekod:
push    acc             ;zalohuj aktualny stav riadku
mov     dptr,#keyCode   ;nastav zaciatok dekodovacej tabulky
mov     a,Riadok        ;nacitaj cislo riadku
mov     b,#4
mul     ab              ;uprav pre dekodovanie
add     a,r1            ;pripocitaj aktualne tlacitko
movc    a,@a+dptr       ;vycitaj z tabulky
call    Fifo            ;uloz do Fifo registra
inc     pocTlacPrac     ;pripocitaj pocet stlacenych tlacitiek
pop     Acc             ;do acc aktulany stav riadku
jmp     keybLoop1
keyCode:
db          0
db          00h,00h,00h,00h     ;kody tlacitiek
db          33h,36h,39h,42h
db          31h,34h,37h,41h
db          32h,35h,38h,30h
;*
;***********************************************************************
;* Nazov:       FIFO
;* Popis:       Posuvny register
;* Funkcia:     Nove data ulozi na prvu adresu a ostatne posunie
;* Podprogramy: Ziadne
;* Vstupy:      Acc - Nove data
;* Vystupy:     Acc - Najstarsie data
;* Registre:    R0,b,acc
;*---------------------------
;*
fifoLenght      equ     5       ;dlzka Fifo registra
;*
FifoData        segment data
rseg    FifoData
ds      fifoLenght      ;
;*
FifoCode        Segment Code
rseg    FifoCode
FIFO:
mov     r0,#fifoData    ;do r0 adresa FIFO
mov     b,#fifoLenght   ;do b dlzka FIFO
FifoLoop:
xch     a,@r0           ;vymen data medzi Acc a
inc     r0              ;dalej
djnz    b,FifoLoop      ;koniec?
ret                     ;ano
;*
;***********************************************************************
;*
end
Dalibor Garaj

DOWNLOAD & Odkazy

Hodnocení článku: