#include <math.h>
void init_port(void);
void outdata(char);
void outcontrol(char);
void init_lcd(void);
void lcd_control_write(void);
void write_data(char);
void write_string(char);
void set_cursor_second_row(void);
char str[50] = "hiii, this is full adder";
void setup() {
//For keypad and Adder
volatile char *dirF, *dirK, *dirA, *dirC, *dirB, *dirL;
dirF = 0x30;
dirK = 0x107;
dirA = 0x21;
dirC = 0x27;
dirB = 0x24;
dirL = 0x10A;
*dirF = 0xFF;
*dirK = 0xFF;
*dirA = 0x00;
*dirC = 0xFF;
*dirB = 0xFF;
*dirL = 0x00;
//For operation of LCD
init_port();
init_lcd();
set_cursor_first_row();
write_string(str);
}
void write_string( char *ptr) {
volatile long count = 0;
while (*ptr != 0) {
if (count == 16) {
set_cursor_second_row();
lcd_control_write();
}
write_data(*ptr); // Write character to the LCD
ptr++;
count++;
}
}
void init_port(void) {
volatile char *portC_dir = (volatile char *)0x27;
volatile char *portE_dir = (volatile char *)0x2D;
*portC_dir = 0xFF;
*portE_dir = 0x03;
}
void outdata(char out_data) {
volatile char *portC_data;
portC_data = 0x28;
*portC_data = out_data;
}
void outcontrol(char out_data) {
volatile char *portE_data;
portE_data = 0x2E;
*portE_data = out_data;
}
void init_lcd(void) {
outdata(0x38); //function set: 8bit ,2line , 5*8
lcd_control_write(); //giving pulse to enable
outdata(0x0F); //display on ,cursor blinking
lcd_control_write();
outdata(0x01); //clear display
lcd_control_write();
outdata(0x06); //auto increment after writing 1 char; entry mode
lcd_control_write();
}
void lcd_control_write(void) {
outcontrol(0x01);
delay(1);
outcontrol(0x00);
delay(1);
}
void write_data(char wr_data) {
outdata(wr_data);
outcontrol(0x02); //giving pulse to enable and sending data
delay(1);
outcontrol(0x03);
delay(1);
outcontrol(0x02);
delay(1);
}
void set_cursor_second_row(void) {
outdata(0xC0); // Address of the second row in 16x2 LCD(DDRAM)
lcd_control_write();
}
void set_cursor_first_row(void) {
outdata(0x00); // Address of the second row in 16x2 LCD(DDRAM)
lcd_control_write();
}
void loop() {
// Empty loop since main code runs in setup
volatile char *outF, *outK, *inA, *outC, *outB, *inL;
outF = 0x31;
outK = 0x108;
inA = 0x20;
outC = 0x28;
outB = 0x25;
inL = 0x109;
volatile int col, row;
char keys[4][4] = {
{'1', '2', '3', '+'},
{'4', '5', '6', '-'},
{'7', '8', '9', '*'},
{'.', '0', '=', '/'}
};
volatile long i, j;
int num1 = -1, num2 = -1;
int num3 = -1, num4 = -1;
uint8_t sum;
bool firstNumberComplete = false;
bool inputComplete = false;
while (1) {
for (i = 0; i < 4 ; i++) {
*outB = 1 << i;
if (*inA != 0) {
col = *inA;
row = 1 << i;
char key = keys[int(log(row) / log(2))][int(log(col) / log(2))];
if (key >= '0' && key <= '9') {
int digit = key - '0';
if (!firstNumberComplete) {
if (num1 == -1) {
num1 = digit;
sprintf(str, "%d", num1);
init_lcd();
write_string(" ");
write_string(str);
}
else {
num2 = digit;
sprintf(str, "%d", num2);
write_string(str);
int firstNumber = num1 * 10 + num2;
*outF = firstNumber;
firstNumberComplete = true;
num1 = -1;
num2 = -1;
}
} else {
// Getting the second two-digit number
if (num3 == -1) {
num3 = digit; // Store first digit of second number
outdata(0x05); //auto increment stopped(it worked but not confirmed)
lcd_control_write();
set_cursor_second_row();
lcd_control_write();
write_string("+");
sprintf(str, "%d", num3);
write_string(str);
} else {
num4 = digit; // Store second digit of second number
sprintf(str, "%d", num4);
write_string(str);
int secondNumber = num3 * 10 + num4;
*outK = secondNumber; //2nd input to adder
// Reset for next set of numbers
num3 = -1;
num4 = -1;
firstNumberComplete = false;
inputComplete = true;
}
}
// Debounce delay
delay(50);
// Wait for key release
while (*inA != 0);
}
if (inputComplete) {
sum = *inL;
sprintf(str, "%d", sum);
delay(300);
init_lcd();
write_string(str);
inputComplete = false;
}
delay(10); // Short delay between each iteration
}
}
}
}