Princip vychází z uvedeného článku, zdálo se mi ale, že by stejnou funkci šlo udělat jednodušeji. Navíc má uveřejněný
program dva drobné nedostatky:
- Neukládá, i když používá R0, R5, R6 a PSW
- Při stisknutí 4 a více kláves zapisuje mimo vyhrazené proměnné
Pokusil jsem se tyto chyby odstranit a napsat program jednodušeji a doplnit některá rozšíření. Výsledek si můžete stáhnout.
Moje verze rutiny má tedy tato rozšíření :
- V R0 vrací počet stisknutých kláves,
- v R1, R2 a R3 kódy kláves.
- Vše co použije po sobě obnoví.
- Původní program je dlouhý 140 byte, mnou posílaný 60 byte
- Program používá PSW, Acc, R4,R5 a R6
- Bez ukládání na zásobník by byl dlouhý jen 40 byte.
- Pokud je stisknuto více jak 3 klávesy současně ignoruje 4. a další klávesu.
- Program je (pomocí dvou portů) schopen obsloužit klávesnici až 8x8 tlačítek.
DOWNLOAD Download rutiny - m_klav_p1_v2.zip (2 kB)
;Stazeno z www.HW.cz
; Autorem tohoto SW je Martin Zaruba swz@volny.cz
;====================================================================
;; Deklarace registru, bitu a konstant
MR0 equ 0 ;kolik tlacitek bylo stisteno[1,2,3]0=zadne
MR1 equ 1 ;keyboard result 1- kod 1ho tlac.
MR2 equ 2 ;------||------ 2
MR3 equ 3 ; 3
MR4 equ 4 ;poradi tlacitka ktere prave ctu
MR5 equ 5 ;Shift nuly pro cteni 4 bitu
MR6 equ 6 ;Citac sloupcu
;------
;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 1 x 8 az 8 x 1.
;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.
;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.
;********* pripojeni klavesnice ***********************************************
;Radky se pripojuji na prislusny pocet bitu P1 zprava,
;tedy napr. dvouradkova na D1 a D0
;ctyrradkova na D3,D2,D1,D0
;Sloupce se pripojuji na prislusny pocet bitu P1 zleva,
;tedy napr. trisloupcova na D7,D6,D5
; pro 3x4 tedy takto:
POCSL equ 3 ; Pocet sloupcu
KODRAD equ 11110111b ; Nulovy bit je ten,
;kam je pripojen 1. radek klavesnice
;Takto naplnit konstantu KODRAD
;Pocet radek 1 11111110b
; 2 11111101b
; 3 11111011b
; 4 11110111b
; 5 11101111b
; 6 11011111b
; 7 10111111b
; 8 01111111b
;Pokud je pocet radek + pocet sloupcu vetsi nez 8 je treba pro cteni pouzit jiny port
;a zmenit tedy instrukci mov A,P1 a na zacatek
;pridat mov Px,0FFh aby port byl vstupni.
org 0
jmp INIT
; ---------------------- Rutina klavecnice --------------------------------
P1_Matic_Klav:
;Potrebuje 5 byte jako hloubku stacku
push PSW
push Acc
push MR4
push MR5
push MR6
clr A
mov R0,A
mov R1,A
mov R2,A
mov R3,A
mov R4,A
mov A,#KODRAD ; Nulovy bit urcuje ctenou radku
radek: ; Precte jednu radku klavesnice
mov R5,A ; Uchova v R5
mov P1,A ; Vysle ovladaci kombinaci
mov A,#170
del50u:
djnz Acc,del50u ; Ceka 50 uS (kvuli kapacitam membranovych klavesnic)
mov R6,#POCSL ; Pocet sloupcu klavesnce
mov A,P1 ; Nacte zpatky data z klavesnice
sloupec:
inc R4 ; Poradi tlacitka+1
rlc A
jc dalsl ; tlacitko neni stisknuto
inc R0 ; Stisknuto dalsi tlacitko
mov @R0,MR4 ; zapsat SCAN kod tlacitka do registru 1-3
cjne R0,#3,dalsl ; pocet stisknutych tlacitek neni 3
sjmp koncti
dalsl:
djnz R6,sloupec
mov A,R5 ; Nacte data pro nastaveni radky
rr A ; Odrotuje je
jb Acc.7,radek ; byly zpracovany vsechny radky
koncti: ; Obnovi vse
pop MR6
pop MR5
pop MR4
pop Acc
pop PSW
ret
;-------------------------- Pokusny Program ----------------------------
INIT:
START:
; push MR0
; push MR1
; push MR2
; push MR3
Call P1_Matic_Klav
mov 40h,R0 ;Pocet stisknutych klaves
mov 41h,R1 ; Tlacitko 1
mov 42h,R2 ; Tlacitko 2
mov 43h,R3 ; Tlacitko 3
; pop MR3
; pop MR2
; pop MR1
; pop MR0
sjmp START
end
;Stazeno z www.HW.cz
; Autorem tohoto SW je Martin Zaruba swz@volny.cz