Re: tlačítko a zákmity

Aleš Novák ales.novak@t-email.cz
Čtvrtek Červen 22 18:49:29 CEST 2006


Bez potreby autorepeatu to resim ve svych programech nejak takto.
S autorepeatem mam silenou rutinu, kterou nemam odvahu zverejnovat.
Ale s trochou premysleni by sla jiste upravit i tahle :-)
V kazdem "spravnem" programu je timerem vyvolavano preruseni takze
neni problem do nej vlozit neco jako generator udalosti pri stisku
tlacitka. Nepisete typ procesoru, tohle je pro x51.

;Tohle do datového segmentu
KeySens:        ds      1       ;po startu nula (nebo cokoliv)
OldKey:         ds      1       ;po startu nula
Key_Event:      ds      1       ;po startu nula

sbit            Key1 =  P3_0    ;stisknuté tlačítko = nula
sbit            Key2 =  P3_1

;------------------------------------------------------------------------------
;Tohle volat každých 10ms (v přerušení od timeru).
;Generuje události od až 8 tlačítek (bez autorepeatu). V okamžiku stisku
;nekterého tlačítka (nebo tlačítek), nastaví příslušné bity na adrese
;Key_Event. Pak nějakou dobu ignoruje další změny na vstupech.
;Key_Event je zpracován a nulován v hlavní smyčce.
;------------------------------------------------------------------------------
;-------------- Generování událostí od tlačítek -------------------------------
;------------------------------------------------------------------------------
KeyEv:          mov     a,KeySens       ;necitlivost na zákmity
                jz      KeyEvGo
                dec     KeySens
                ret
KeyEvGo:        call    KeyScan         ;aktuání stav tlačítek (1=stisknuto)
                xch     a,OldKey        ;schovat na příště
                xrl     a,OldKey        ;změnilo se od minule něco?
                jz      KeyEvEx         ;nezměnilo
                anl     a,OldKey        ;byl to stisk?
                jz      KeyEvSH         ;nebyl, bylo to uvolnění
                orl     a,Key_Event     ;přidáme k ještě nevyřízeným stiskům
                mov     Key_Event,a     ;
KeyEvSH:        mov     KeySens,#3      ;po stisku nebo uvolnění 3x ignorovat
KeyEvEx:        ret

;------------------------------------------------------------------------------
;-------------- Načítání stavu tlačítek ---------------------------------------
;------------------------------------------------------------------------------
KeyScan:        clr     a               ;aktuální stav tlačítek uloží
                cpl     a               ;do akumulátoru
                mov     c,Key2          ;stisknuté tlačítko bude mít
                rlc     a               ;příslušný bit = 1
                mov     c,Key1
                rlc     a
                cpl     a
                ret
  
  Novalex

lm> a opět jeden začátečnický dotaz..
lm> u svých hodin se snažím udělat pomocí tlačítek nějáké nastavení..
lm> na tlačítko jsem dal přerušení reagující na hranu, ale samozřejmě se mi
lm> díky zákmitům vyvolává několikrát..
lm> vyřeší to RC filtr? nebo na to mám jít úplně jinak..

lm> děkuji za odpověď.





Další informace o konferenci Hw-list