我试图了解这些定时器和中断的工作原理 而且我认为按钮的去抖动例程是一个很好的开始,因为我需要它用于学校的项目
我尽可能地设置了这段代码,但我确定有些错误。 我没有真正的硬件来测试它,但我想在几天内准备好上学。
有谁能请看一下这段代码并告诉我,我是否走在正确的轨道上? 我们的想法是在timer0上触发一个中断,然后计算按钮在同一时间窗口反弹的次数,因为timer0将再次倒计时。如果按下"按下" 20次,我希望已经过了足够的时间,以便按钮完成弹跳。
我可以使用timer0来告诉代码触发中断的频率,并使用它来测试在timer0计数的时间内是否感受到20次按下?
我有一种感觉,要么我真的很接近,要么我完全离开了。请帮我 我觉得我错过了一些东西(比如一个retfie)
我没有包含代码的所有初始化部分,我省略了变量声明和重置以及int向量设置,但它就像在数据表中一样
BANKSEL INTCON
MOVLW B'10100000'
MOVWF INTCON
BANKSEL OPTION_REG
MOVLW B'11000111' ;FOSC4mhz/4, 1:256 prescaler
MOVWF OPTION_REG
BANKSEL TMR0
MOVLW B'10110010' ;178 to get a cycle of around 20mS
MOVWF TMR0
MOVLW B'00010100'
MOVWF BOUNCECOUNTER ;count down from 20
GOTO MAIN
ISR
BTFSC INTCON, 2 ;TEST TIMER0 OVERFLOW FLAG
RETFIE
GOTO TEST
TEST
BTFSC INTCON, 2
GOTO DECIDE
DECFSZ TMR0
BTFSC PORTA, 0 ;TEST FOR BUTTON PRESS
GOTO DECIDE
DECFSZ BOUNCECOUNTER ;DECREMENT BOUNCECOUNTER EVERY TIME A HIGH TO LOW ON PORTA
GOTO TEST
GOTO DECIDE
DECIDE
BTFSC INTCON, 2 ;TEST TIMER0 OVERFLOW FLAG
BTFSS STATUS, Z ;TEST IF BOUNCECOUNTER REACHES ZERO
GOTO TEST
BTFSS INTCON, 2
GOTO NOTPRESSED
GOTO BPRESSED ;LOOP TIMER0 AND TEST FOR BUTTON PRESS
BPRESSED
BCF INTCON, 2 ;CLEAR TIMER0 OVERFLOW FLAG
MOVLW 0x000
MOVWF BOUNCECOUNTER
;TOGGLE BETWEEN AWESOME STUFF
NOTPRESSED
BCF INTCON, 2
MOVLW 0x000
MOVWF BOUNCECOUNTER
RETFIE
MAIN
GOTO MAIN
END