I am trying a simple project to count how many times a PushButton has been pressed.
I searched a couple of post but could not figure out how to make it work.
version 1
Code: Select all
/*
* Project name:
MyProject_3a (Using Timer0 to obtain count interrupts)
* Description:
- This code demonstrates how to use Timer0 and it's interrupt.
- Program counts how many times PushButton on PORTA.RA4 has been pressed
- Each count increment turns ON a LED (PORTB.RB1, PORTB.RB2, PORTB.RB3)
- The count resets to Zero after 3 presses and turns OFF all LEDs
*/
unsigned cnt_pb;
void initialize()
{
ANSEL = 0;
TRISA = 0xFF;
TRISB = 0x00;
PORTB = 0x01; //0b00000001
cnt_pb = 0;
OPTION_REG = 0x20; //0b00100000
TMR0 = 155;
INTCON = 0xA0; //0b10100000
}
void interrupt()
{
cnt_pb++;
TMR0 = 155;
INTCON.TMR0IF = 0;
switch(cnt_pb)
{
case 1:
PORTB.RB1 = 1; break;
case 2:
PORTB.RB2 = 1; break;
case 3:
PORTB.RB3 = 1; break;
default:
PORTB.RB1 = 0;
PORTB.RB2 = 0;
PORTB.RB3 = 0;
cnt_pb = 0;
}
}
void main()
{
initialize();
while(1){}
}
version 2
Code: Select all
/*
* Project name:
MyProject_3a (Using Timer0 to obtain count interrupts)
* Description:
- This code demonstrates how to use Timer0 and it's interrupt.
- Program counts how many times PushButton on PORTA.RA4 has been pressed
- Each count increment turns ON a LED (PORTB.RB1, PORTB.RB2, PORTB.RB3)
- The count resets to Zero after 3 presses and turns OFF all LEDs
*/
char cnt, old_cnt;
void initialize()
{
ANSEL = 0;
TRISA = 0xFF;
TRISB = 0x00;
PORTB = 0x01; //0b00000001
cnt = 0;
OPTION_REG = 0x20; //0b00100000
TMR0 = 155;
INTCON = 0xA0; //0b10100000
}
void interrupt()
{
if(INTCON.TMR0IF)
{
cnt++;
TMR0 = 155;
INTCON.TMR0IF = 0;
}
}
void display()
{
switch(cnt)
{
case 1:
PORTB.RB1 = 1; break;
case 2:
PORTB.RB2 = 1; break;
case 3:
PORTB.RB3 = 1; break;
default:
PORTB.RB1 = 0;
PORTB.RB2 = 0;
PORTB.RB3 = 0;
cnt = 0;
}
}
void main()
{
initialize();
while(1)
{
if (old_cnt != cnt)
{
display();
old_cnt = cnt;
}
}
}