Hello guys , the long_click function could not executed even I press the push button for long time ., always short_click function works
anybody advice ?
// ************************************************************//
/* PIC16F88 */
unsigned int volatile counter = 0 ;
bit flag ;
void Interrupt()
{
while (PORTB.F0==0 && INTCON.TMR0IF == 1) {
counter++ ;
INTCON.TMR0IF=0;
INTCON.GIE = 1 ;
if ( counter >6500) { // reset counter value
counter = 0 ;
}
}
void main() {
unsigned int Interval ;
OSCCON = 0b01111110 ; // Internal OSC 8 MHz
TRISA.F0 = 0 ; // RA0 as output
TRISB.F0 = 1 ; // RB0 as Input
PORTA.F0= 0 ; // ( Led connected )
PORTB.F0= 1 ; // push button
INTCON = 0b10000000 ;
OPTION_REG = 0b11000010 ; // interrupt on RB0 rising edge (push button) , prescaler 32 , Timer0 overflow interrupt every 1ms
ANSEL = 0 ; // All ports as digital I/O
while(1){ // infinite loop
Interval = counter ; // assign counter to Interval
if(PORTB.F0 == 0 ) { //if button pressed
delay_ms(10); // delay
INTCON.TMR0IE = 1 ; // enable timer0 Interrupt
INTCON.INT0IE = 1; // enable RB0 interrupt
INTCON.GIE = 0 ; // enable global interupt
flag = 1 ; // set flag
}
if (flag && PORTB.F0== 1 && INTCON.INT0IF == 1) // if flag and button released and INT flag do
{
if(Interval<=500){ // if Interval below 500ms do
Run_Short_Click();
Interval = 0;
counter = 0 ;
}
if(Interval>500){ // if Interval greater 500ms do // Note this not executed even long hold of button
Run_Long_Click();
Interval = 0;
counter =0 ;
}
INTCON.INT0IE = 0; // disable RB0 interrupt
flag=0 ; // clear flag
}
}
}
void Run_Short_Click() short click
{
unsigned char j ,x ;
for( j=0;j<2 ;j++ )
{
PORTA.F0 = 1 ;
delay_ms( 100);
PORTA.F0 = 0 ;
delay_ms( 100);
}
void Run_Long_Click()
{
unsigned char j ,x ;
for( j=0;j<4 ;j++ ) {
PORTA.F0 = 1 ;
delay_ms( 125);
PORTA.F0 = 0 ;
delay_ms( 125);
}
anybody advice ?
// ************************************************************//
/* PIC16F88 */
unsigned int volatile counter = 0 ;
bit flag ;
void Interrupt()
{
while (PORTB.F0==0 && INTCON.TMR0IF == 1) {
counter++ ;
INTCON.TMR0IF=0;
INTCON.GIE = 1 ;
if ( counter >6500) { // reset counter value
counter = 0 ;
}
}
void main() {
unsigned int Interval ;
OSCCON = 0b01111110 ; // Internal OSC 8 MHz
TRISA.F0 = 0 ; // RA0 as output
TRISB.F0 = 1 ; // RB0 as Input
PORTA.F0= 0 ; // ( Led connected )
PORTB.F0= 1 ; // push button
INTCON = 0b10000000 ;
OPTION_REG = 0b11000010 ; // interrupt on RB0 rising edge (push button) , prescaler 32 , Timer0 overflow interrupt every 1ms
ANSEL = 0 ; // All ports as digital I/O
while(1){ // infinite loop
Interval = counter ; // assign counter to Interval
if(PORTB.F0 == 0 ) { //if button pressed
delay_ms(10); // delay
INTCON.TMR0IE = 1 ; // enable timer0 Interrupt
INTCON.INT0IE = 1; // enable RB0 interrupt
INTCON.GIE = 0 ; // enable global interupt
flag = 1 ; // set flag
}
if (flag && PORTB.F0== 1 && INTCON.INT0IF == 1) // if flag and button released and INT flag do
{
if(Interval<=500){ // if Interval below 500ms do
Run_Short_Click();
Interval = 0;
counter = 0 ;
}
if(Interval>500){ // if Interval greater 500ms do // Note this not executed even long hold of button
Run_Long_Click();
Interval = 0;
counter =0 ;
}
INTCON.INT0IE = 0; // disable RB0 interrupt
flag=0 ; // clear flag
}
}
}
void Run_Short_Click() short click
{
unsigned char j ,x ;
for( j=0;j<2 ;j++ )
{
PORTA.F0 = 1 ;
delay_ms( 100);
PORTA.F0 = 0 ;
delay_ms( 100);
}
void Run_Long_Click()
{
unsigned char j ,x ;
for( j=0;j<4 ;j++ ) {
PORTA.F0 = 1 ;
delay_ms( 125);
PORTA.F0 = 0 ;
delay_ms( 125);
}