Pressing a button could make noise disturbing the MCU digital input. Noise produced by internal contact of the switching button. We can eliminate noise using many methods:
- using an S-R flip flop
- using a passive low pass filter
- using a software delay in the program
With a built-in timer of MCU, we can eliminate the noise and limit the time out of button pressing duration.
In this example, I use timer 0 to counter the duration of a button being pressed. The minimum duration is three seconds. If it's pressed shorter than three seconds, it's ignored.
Any calculation relates to timer 0 interrupt is skipped here, due to the repeating in the previous post.
Source code is here:
#include "xc.h"
// PIC16F887 Configuration Bit Settings
// CONFIG1
#pragma config FOSC = XT
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config IESO = ON
#pragma config FCMEN = ON
#pragma config LVP = OFF
// CONFIG2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF
unsigned char cnt_0=0;
unsigned char cnt_1=0;
void main(){
PORTD=0x00;
TRISD=0x0F;
T0CS=0;
PSA=0;
T0IE=1;
GIE=1;
T0IF=0;
TMR0=0;
while(1){
/*Check RD0*/
if(RD0==0){
cnt_1=0;
while(RD0==0){
/*if the press durations
is greater than 3 minutes*/
if(cnt_1>9){
RD4^=1;
break;
}
}
}
/*Check RD1*/
if(RD1==0){
cnt_1=0;
/*if the press durations
is greater than 3 minutes*/
while(RD1==0){
if(cnt_1>9){
RD5^=1;
break;
}
}
}
}
}
void interrupt _ISR(void){
if(T0IF){
cnt_0+=1;
T0IF=0;
}
/*325 milli seconds*/
if(cnt_0>=5){
cnt_0=0;
cnt_1+=1;
}
}
No comments:
Post a Comment