Jste zde

Maticová klávesnice pro x51

Kompletně komentovaná rutina na ovládání maticové klávesnice na portu procesoru. Připraveno pro

využití v přerušení.

Připojení tlačítek nebo klávesnice je velmi častá úloha při realizaci jakéhokoli ručně ovládaného přístroje. Jednotlivá tlačítka, na jedné straně uzemněná, se obvykle připojují na vstupní brány, které jsou pravidelně čteny. Nechceme-li pravidelně číst vstupní brá-ny, potom můžeme tlačítka připojit ještě na vstupy logického členu AND, jehož vý-stup  připojíme na vstup vnějšího přerušení. Je-li počet tlačítek větší něž zhruba 5 tlačítek, potom se tlačítka obvykle za-po-jují do matice mající určitý počet řádků a sloupců. Zapojení tlačítek potom využívá externí logi-ku (členy AND) do řádků a sloupců, které jsou připojeny pouze na vstupní brány procesoru.  Toto zapojení umožňuje indikovat zmáčknutí jednoho nebo dvou tlačítek najednou. Pří-padné zmáčknutí tří tlačítek může, ale také nemusí být identifikovatelné. 

Z tohoto důvodu a také vzhledem k jednodušší hardwarové realizaci se častěji používá zapojení přímého připojení na porty mikroprocesoru. Jednotlivá tlačítka jsou zapojena mezi řádky a sloupce matice. Přivedeme-li například pouze na jeden řádek úroveň log.0, potom přečtením všech sloupců snadno zjistíme, která tlačítka v daném řádku jsou zmáčknuta. Postupným výběrem všech řádků snadno zjistíme všechna zmáčknutá tlačítka na klávesnici. Používáme-li bránu P0 jako vstupní nebo výstupní, musíme ji doplnit kolektorovými odpory vůči napájení (tzv. pull-up odpory). 
V záhlaví programu je uveden podrobný komentář.

Pokud máte napsanou SW rutinu, která umí detekovat rychlost ze souvislého toku dat, pošlete nám ji..

;Program Maticova Klavesnice

;Program obsluhuje maticovou klavesnici na P1. Zaroven vyuziva 
;Vlastnosti P1, ze pri zapisu log. 0, drzi tuto uroven na vnejsim pinu i 
;pri cteni. Na port je mozno primo pripojit maticovou klavesnici 4 x 4. 
;Nevyhodou je moznost ovlivneni dat pri pripojeni jakekoli dalsi periferie. 
;Proto ve slozitejsich aplikacich doporucuji pouzit pri pripojeni na port 
;oddelovac na vystupy z klavesnice. Pripadne umistit klavesnici obdobne 
;jako ve Spectru primo pres diody a odpory do adresoveko prostoru.
;
;Rutina je vytvorena pro praci v prerusovacim rezimu. Pro vlastni cinnost 
;vyuziva 3. banku registru (PSW=XXX11XXX) => muze pouzivat i Delay 
;a stackuje Acc. 
;Nici pouze P1, ktere je pro jakykoli dalsi provoz stejne nepouzitelne.
;
;Ma smysl obsluhovat max. tri tlacitka, protoze pri vice tlacitkach dochazi 
;k nesmyslnum informacim, diky spopojeni vetvi, stisknu-li tlacitka 
;do PRAVOUHLEHO TROJUHELNIKU, Proto je potreba vzdy dobre zvazit umisteni 
;alternativnich klaves (SHIFT). Nascanovane kody klaves jsou ukladany do 
;registru vzdy vzestupne = posledni klavesa ma vzdy nejvyssi SCAN kod.

;Obsluzny program JE vytvoren tak, aby pripravil data pro dalsi zpracovani 
;ve forme poctu stisknutych klaves jejich SCAN kodu.
 

;********* inicializace ***********************************************

         dseg       at 40h           ;promenne od adr 40,10 bytu rezerva
         disp_cur:  DS 1

         cseg at 00h
         org 0
         JMP INIT
 

INIT:
            mov sp,#80d         ;stack od 80d do 127d => 47 adres.
            JMP START
 

; ---------------------- Rutina klavecnice  --------------------------------

P1_Matic_Klav:

;Potrebuje 3 byte jako hloubku stacku
;R5 - Shift nuly pro cteni 4 bitu
;R6 - poradi tlacitka ktere prave ctu
 

DSEG                & nbsp;           ; Nastav Data Segment
keyb_kolik: ds 1   ;kolik tlacitek bylo stisteno[1,2,3]0=zadne
keyb_res1:      ds 1  ;keyboard result 1- kod 1ho tlac.
keyb_res2:      ds 1            ;------||------  2
keyb_res3:      ds 1            ;          3
CSEG                & nbsp;           ; Vrat Code Segment
 

;     MSB                  LSB  ; Misto X mohu pripojit jeste jeden Sloupec
;      X C1 C2 C3 L1 L2 L3 L4   ; Potom je ale potreba jeste jednou zkopirovat
;     D7 D6 D5 D4 D3 D2 D1 D0   ; Rutinu pro cteni sloupce

 

 

        Push Acc                ;Uloz puvodni Acc

        Mov R5,#11101111b       ;Vybira kterou radku nebo sloupec ctu
        Mov R6,#0
        Mov keyb_kolik,#0
        Mov Keyb_Res1,#0
        Mov Keyb_Res2,#0
        Mov Keyb_Res3,#0

Next_line:              &nb sp;   ; Precte jednu radku klavesnice

        Mov Acc,R5          ; Nacte data pro nastaveni sloupce
        RR  A               ; Odrotuje je
        Mov R5,Acc          ; Ulozi zpet do R5, pro dalsi cteni
        JB  Acc.7,KEY_READ  ;Testuji na konec smycky (pouze 4 pruchody
        JMP Konec_cteni_klv ;Skok na konec cteni klavesnice, pretocil jsem registr

KEY_READ:

        Mov P1,Acc          ; Vysle ovladaci kombinaci
        Call Delay50u       ; Ceka 50 nS (kvuli kapacitam membranovych klavesnic)
        Mov Acc,P1          ; Nacte zpatky data z klavesnice
        CPL A               ; Prevedu na 1= stisknute tlacitko
        Inc R6              ; Poradi tlacitka+1

        JNB Acc.6,cullum_2

        INC keyb_kolik      ; Stisknuta dalsi klavesa
        Push Acc            ; Uloz Acc
        Mov Acc,R0          ; Kvuli ukladani R0 na zasobnik
        Push Acc            ; Uloz R0
        Mov Acc,#Keyb_res1-1; Ulozi adresu 1. tlacitka - 1 (nutno pocitat od Keyb_res1)
 Add a,keyb_kolik    ; Prictenim spocita adresu stisknuteho tlacitka
 Mov r0,a     ; Adresa dalsiho tlacitka do r0 (neprima adresace)
 Mov a,R6            ; do Acc SCAN kod znaku
 Mov @R0,Acc     ; zapsat SCAN kod znaku na adresu patricneho vysledku
        Pop Acc
        Mov R0,Acc          ; Obnov R0
        Pop Acc             ; Obnov Acc

 

 


cullum_2:
        Inc R6              ;Poradi tlacitka+1

        JNB Acc.5,cullum_3
        INC keyb_kolik      ; Stisknuta dalsi klavesa
        Push Acc            ; Uloz Acc
        Mov Acc,R0          ; Kvuli ukladani R0 na zasobnik
        Push Acc            ; Uloz R0
        Mov Acc,#Keyb_res1-1; Ulozi adresu 1. tlacitka - 1 (nutno pocitat od Keyb_res1)
 Add a,keyb_kolik    ; Prictenim spocita adresu stisknuteho tlacitka
 Mov r0,a     ; Adresa dalsiho tlacitka do r0 (neprima adresace)
 Mov a,R6            ; do Acc SCAN kod znaku
 Mov @R0,Acc     ; zapsat SCAN kod znaku na adresu patricneho vysledku
        Pop Acc
        Mov R0,Acc          ; Obnov R0
        Pop Acc             ; Obnov Acc

cullum_3:
        Inc R6              ;Poradi tlacitka+1
        JNB Acc.4,cullum_4

        INC keyb_kolik      ; Stisknuta dalsi klavesa
        Push Acc            ; Uloz Acc
        Mov Acc,R0          ; Kvuli ukladani R0 na zasobnik
        Push Acc            ; Uloz R0
        Mov Acc,#Keyb_res1-1; Ulozi adresu 1. tlacitka - 1 (nutno pocitat od Keyb_res1)
 Add a,keyb_kolik    ; Prictenim spocita adresu stisknuteho tlacitka
 Mov r0,a     ; Adresa dalsiho tlacitka do r0 (neprima adresace)
 Mov a,R6            ; do Acc SCAN kod znaku
 Mov @R0,Acc     ; zapsat SCAN kod znaku na adresu patricneho vysledku
        Pop Acc
        Mov R0,Acc          ; Obnov R0
        Pop Acc             ; Obnov Acc

Cullum_4:
        JMP Next_Line

Konec_cteni_klv:

        Pop Acc             ;Obnovi Vse krome R5 aR6
        Ret                 ; Konec rutiny na klavesnici

;------------------------------ Konec rutiny klavesnice -----------------

 


;zpozdeni asi 50 mikrosecund  KILL r0, banka 3 

delay50u: Push PSW
  setb rs1
  setb rs0  ;3rd registers bank
   mov r0,#170
del50u: 
  djnz r0,del50u
  Pop PSW   ;puvodni bank of reg.
  ret
 

;-------------------------- Obsluzny Program ----------------------------

START:
       Call P1_Matic_Klav

       Mov Acc,Keyb_kolik    ;Pocet stisknutych klaves

       Mov Acc,Keyb_res1     ; Tlacitko 1

       Mov Acc,Keyb_res2 ; Tlacitko 2

       Mov Acc,Keyb_res3 ; Tlacitko 3
 

       JMP START

;Stazeno z www.HW.cz 
;        Autorem tohoto SW je Jan Rehak Rehak@hw.cz
 


DOWNLOAD rutiny s  komentářem
Hodnocení článku: