/* This implementation assumes that segments are connected
to consecutiong pins on the Arduino board */
/* Defines, enums */
#define ONE_SEC (1000U) /* in msec */
#define SEGMEN_PINS_OFFSET (2U)
#define NUMBER_OF_NUMS (10U)
#define GET_BIT(VAR, BIT_IDX) ((VAR >> BIT_IDX) & 0x01)
enum{
SEGMENT_A = SEGMEN_PINS_OFFSET,
SEGMENT_B,
SEGMENT_C,
SEGMENT_D,
SEGMENT_E,
SEGMENT_F,
SEGMENT_G,
NUM_OF_SEGMENTS
};
/* Function definitions */
bool one_second_passed(void);
void increment_displayed_num(void);
void display_num(void);
/* Global variables */
unsigned long tstamp = 0U;
short unsigned int displayed_num = 0U;
/* This is array of 10 elements, each is indicating which segment
should be raised for which number */
const short unsigned int num_to_segments[NUMBER_OF_NUMS] =
{0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
/* Arduino setup function */
void setup() {
pinMode(SEGMENT_A, OUTPUT);
pinMode(SEGMENT_B, OUTPUT);
pinMode(SEGMENT_C, OUTPUT);
pinMode(SEGMENT_D, OUTPUT);
pinMode(SEGMENT_E, OUTPUT);
pinMode(SEGMENT_F, OUTPUT);
pinMode(SEGMENT_G, OUTPUT);
display_num();
}
/* Arduino loop function */
void loop() {
bool second_passed = one_second_passed();
if (true == second_passed)
{
increment_displayed_num();
display_num();
}
else
{
/* Do nothing */
}
}
/* Defined functions implementations */
bool one_second_passed(void)
{
bool ret_val = false;
if ((millis() - tstamp) >= ONE_SEC)
{
tstamp = millis();
ret_val = true;
}
else
{
/* Do nothing */
}
return ret_val;
}
void increment_displayed_num(void)
{
displayed_num = (displayed_num + 1) % 10;
}
void display_num(void)
{
for (int seg_idx = 0; seg_idx < NUM_OF_SEGMENTS; seg_idx++)
{
if (1U == GET_BIT(num_to_segments[displayed_num], seg_idx))
{
digitalWrite(seg_idx + SEGMEN_PINS_OFFSET, HIGH);
}
else
{
digitalWrite(seg_idx + SEGMEN_PINS_OFFSET, LOW);
}
}
}