Evo ti kompletan program, testiraj ga i analiziraj, ako nešto nije jasno pitaj slobodno.
Za sada samo da ti napomenem da C bit STATUS registra koristim kao indikaciju da li je taster upravo pritisnut ili ne. Ja sam tako prvi put uradio kad sam napisao ovu rutinu jer sam bio kratak sa RAM-om pa je tako ostalo, tako koristim i dan-danas, ali može da se upotrebi bilo koji drugi registar opšte namene. Zbog toga što je C setovan kod detektovanja pritiska, morao sam da ga resetujem u rutini za rotiranje. Izmeni to za probu, upotrebi neki drugi registar, npr. možeš da upotrebiš bit 7 registra FTASTERI.
Suština je u tome da je c bit setovan samo ako je taster upravo pritisnut, tako da koliko god dugo ga držiš pritisnutim, detektovaće samo 1 pritisak.
I izračunaj koliko traje ispitivanje tastera u rutini ako je taster pritisnut sve vreme.
Code:
;******Inicijalizacija asemblera********
list p=16f84 ;Definise upotrebljeni kontroler
; #include <p16f84.inc> ;Ubacuje nazive registara u program
include "reg84.asm"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
cblock 0X0C ; Pocetak slobodnih registara
SPORTB ; shaddow registar
djnzt ; brojac za unutrasnju petlju
djnzt2 ; brojac za spoljasnju petlju
ftasteri ; Flegovi za tastere
endc ; Kraj bloka registara
;********Podesavanje porta************
org 0X00 ; Definise start programa
bsf STATUS, RP0 ; Prebacuje se u banku 1
movlw b'00000011' ; Postavlja RA0 i RA1 kao ulazni
movwf TRISA ; Upis vrednosti u registar porta A
clrf TRISB ; Port b je izlazni
bcf STATUS, RP0 ; Prebacuje se u banku 0
movlw b'00000001'
movwf SPORTB
movwf PORTB
clrf ftasteri
;*********Ukljuci led*******
pocetak
call taster0 ; Proveri taster na RA0
btfsc STATUS, c ; preskoci ako nije upravo sada pritisnut
call rot_levo ; ako jeste,rotiraj ulevo
call taster1 ; Proveri taster na RA1
btfsc STATUS, c ; preskoci ako nije upravo sada pritisnut
call rot_desno ; ako jeste, rotiraj udesno
goto pocetak ; Povratak na pocetak
;******** Ispitaj taster na RA0 ********
taster0
bcf STATUS, c ; resetuj carry bit
movlw .30 ; pocetna vrednost spoljasnje petlje
movwf djnzt2
loopt0s
movlw .250 ; pocetna vrednost unutrasnje petlje
movwf djnzt
loopt0u
btfss porta, 0 ; da li je pritisnut taster na RA0
goto neprit0 ; ako nije, idi na labelu neprit0
decfsz djnzt, F ; ako jeste, umanji brojac unutrasnje petlje
goto loopt0u ; ako nije 0 idi na labelu loopt0u
decfsz djnzt2, F ; umanji brojac spoljasnje petlje
goto loopt0s ; ako nije 0 idi na labelu loopt0s
btfss ftasteri, 0; da li je setovan fleg za tasterr0, tj. da li je
; taster na RA0 pritisnut od prethodne provere?
bsf STATUS, c ; ako nije bio pritisnut, setuj carry bit
bsf ftasteri, 0 ; setuj fleg da je taster na RA0 pritisnut u ovom ispitivanju
return ; vrati se
neprit0
bcf ftasteri, 0 ; resetuj fleg za taster, tj. obelezi da taster na RA0
; nije pritisnut u ovom ispitivanju
return ; vrati se
;******** Ispitaj taster na RA1 ********
taster1
bcf STATUS, c
movlw .30
movwf djnzt2
loopt1s
movlw .250
movwf djnzt
loopt1u
btfss porta, 1
goto neprit1
decfsz djnzt, F
goto loopt1u
decfsz djnzt2, F
goto loopt1s
btfss ftasteri, 1
bsf STATUS, c
bsf ftasteri, 1
return
neprit1
bcf ftasteri, 1
return
;******PP za paljenje i gasenje LED******
rot_levo
bcf STATUS, c
rlf SPORTB, F ; Rotacija u SHADDOW registru
btfsc STATUS, c
rlf SPORTB, F
movf SPORTB, W ; Kopiranje iz SHADDOW u W
movwf PORTB ; Kopiranje iz W u PORTB.
return ; Povratak iz PP
rot_desno
bcf STATUS, c
rrf SPORTB, F ; Rotacija u SHADDOW registru
btfsc STATUS, c
rrf SPORTB, F
movf SPORTB, W ; Kopiranje iz SHADDOW u W
movwf PORTB ; Kopiranje iz W u PORTB.
return ; Povratak iz PP
;********Kraj programa********
end ; Kraj
Pozdrav.
Sinisha