#include <TimerOne.h>
/*
* upper nibble hold the button state
* lower nibble hold the counter value
*/
volatile uint8_t var = 0;
/*
* button pressed logic 0
* buuton released logic 1
*/
#define BUTTON_SET 0
#define BUTTON_RESET 1
#define b1 2
#define b2 3
#define b3 4
#define b4 5
#define B1_STATE_POS 0x10
#define B2_STATE_POS 0x20
#define B3_STATE_POS 0x40
#define B4_STATE_POS 0x80
const uint16_t t1_load = 0;
const uint16_t t1_comp = 249;
#define DEBOUNCE_TIME 6 // for 100 ms
/*
* Timer Initialization Function (mocked)
* initialize timer on periodic base to call its ISR after every 10ms
*/
void init_timer()
{
//Reset Time1 Control Register A to its defualt value
TCCR1A = 0;
/* Set prescaler of 256,
NOTE: FIrst 3 bits of TCCR1B need to be 100 for 256 prescaler*/
TCCR1B &= ~(1 << CS12); //Set Bit 2
TCCR1B |= (1 << CS11); // Clear Bit 1
TCCR1B |= (1 << CS10); // Clear Bit 0
// Reset Timer1 and Set Compare Value
TCNT1 = t1_load; // Reset Timer 1
OCR1A = t1_comp; // Set Compare Value of 31250 (Output Compare Register)
// Enable Timer1 compare Interrupt
TIMSK1 = (1 << OCIE1A);
// Enable Global Interrupts, NOTE: Enabled by defualt
sei();
// Timer1.initialize(10000); // Set the timer period to 10000 microseconds (10ms)
// Timer1.attachInterrupt(timerCallback);
}
/*
* start the timer
*/
void timer_start()
{
}
/*
* stop the timer
*/
void timer_stop()
{
}
bool state = 0;
void timerCallback() {
// Your code to run every 10ms
digitalWrite(13, state);
state = !state;
btn_loop();
}
ISR(TIMER1_COMPA_vect){
// switch_loop();
//TCNT1 = t1_load; // Reset Timer1 to 0.
digitalWrite(13, state);
state = !state;
btn_loop();
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(13, OUTPUT);
init_timer();
}
void loop() {
Key_check();
}
/*
bool digitalRead(uint8_t pin)
{
// return 0 when pressd
// return 1 when released
}
*/
/*
* Check if any of key pressed with debounce time of 100ms
*/
void btn_loop()
{
if((digitalRead(b1)== BUTTON_SET) && (var >> 4 == 0x0))
{
if((var & 0x0F) < DEBOUNCE_TIME)
{
var += 1;
}else
{
var |= B1_STATE_POS;
}
}
else if((digitalRead(b2)== BUTTON_SET) && (var >> 4 == 0))
{
if((var & 0x0F) < DEBOUNCE_TIME)
{
var += 1;
}else
{
var |= B2_STATE_POS;
}
}
else if((digitalRead(b3)== BUTTON_SET) && (var >> 4 == 0))
{
if((var & 0x0F) < DEBOUNCE_TIME)
{
var += 1;
}else
{
var |= B3_STATE_POS;
}
}
else if((digitalRead(b4)== BUTTON_SET) && (var >> 4 == 0))
{
if((var & 0x0F) < DEBOUNCE_TIME)
{
var += 1;
}else
{
var |= B4_STATE_POS;
}
}
else if(var >> 4 != 0)
{
if((var & 0x0f) < 0x0f)
var += 1;
}else
{
var &= 0xF0;
}
}
void print_press_type(uint8_t var)
{
if((var & 0x0f) >6 && (var & 0x0f) < 12)
{
Serial.println("short pressed");
}else if((var & 0x0f) > 12 && (var & 0x0f) < 16)
{
Serial.println("long pressed");
}else
{
Serial.println("pressed");
}
}
/*
* Function to check which key pressed
* this function will reset the key state after the button is released
*/
void Key_check()
{
if((var & B1_STATE_POS) == B1_STATE_POS && digitalRead(b1)) /* check if btn was pressed for 100ms and now released*/
{
Serial.println("1");
print_press_type(var);
var &= ~(B1_STATE_POS);
var &= ~(0x0F);
}
if((var & B2_STATE_POS) == B2_STATE_POS && digitalRead(b2)) /* check if btn was pressed for 100ms and now released*/
{
Serial.println("2");
print_press_type(var);
var &= ~(B2_STATE_POS);
var &= ~(0x0F);
}
if((var & B3_STATE_POS) == B3_STATE_POS && digitalRead(b3)) /* check if btn was pressed for 100ms and now released*/
{
Serial.println("3");
print_press_type(var);
var &= ~(B3_STATE_POS);
var &= ~(0x0F);
}
if((var & B4_STATE_POS) == B4_STATE_POS && digitalRead(b4)) /* check if btn was pressed for 100ms and now released*/
{
Serial.println("4");
print_press_type(var);
var &= ~(B4_STATE_POS);
var &= ~(0x0F);
}
}