/* Perform three Digit Addition. Ex: 161 + 656 = 817 659 + 765 = 1424
*/
#include "data.h" // Contains common variables and funcions
#include "setup.h" // Contains Macros and Functions to intialize Data Direction, Input and Output Registers
#include "keypad.h"
#include "quad_sev_seg.h"
#define MAX_SWITCH_COUNT 7
#define SIZE(X) (uint8_t) sizeof(X)/sizeof(X[0])
void read_input_sequence(volatile uint16_t*, unsigned char*, volatile uint16_t*);
uint16_t addition(uint16_t*, uint8_t);
int main(void)
{
init_port();
volatile uint16_t nums[2] = {0};
uint8_t switch_count = 0;
uint16_t sum = 0;
unsigned char sign;
while (1)
{
if (switch_count < MAX_SWITCH_COUNT)
{
read_input_sequence(nums, &sign, &switch_count);
}
else if(switch_count == MAX_SWITCH_COUNT)
{
for (long i = 0; i < 10; i++ )
{
show_multiplexed_number(nums[0]); // To display 1st number
}
for (long i = 0; i < 10; i++ )
{
show_multiplexed_number(nums[1]); // To display 2nd number
}
if (sign == PLUS_SIGN)
{
sum = addition(nums, SIZE(nums));
for (long i = 0; i < 10; i++)
show_multiplexed_number(sum); // To display sum of both numbers
}
}
}
}
void read_input_sequence(volatile uint16_t *nums, unsigned char *sign, uint8_t *sw)
{
volatile uint16_t n = NO_KEY_PRESSED;
static uint8_t index = 0;
uint8_t digit = 0;
while (*sw < MAX_SWITCH_COUNT && digit < 3)
{
n = read_keypad();
time_delay(2);
if (n != NO_KEY_PRESSED && n != INVALID_KEY_PRESSED)
{
if (n != PLUS_SIGN && digit < 3)
{
nums[index] = nums[index] * 10 + n;
digit++;
}
else if (*sw == 3 && n == PLUS_SIGN)
{
*sign = n;
(index)++;
digit = 0;
}
(*sw)++;
}
}
}
uint16_t addition(uint16_t *nums, uint8_t size)
{
uint16_t sum = 0;
for (char i = 0; i < size; i++)
{
sum += nums[i];
}
return sum;
}