#include "DNA_math.h"
void delay1()
{
volatile long i;
for(i=0;i<10000;i++);
}
void delay2()
{
volatile long i;
for(i=0;i<2000;i++);
}
void delay3()
{
volatile long i;
for(i=0;i<20000;i++);
}
void port_initializations()
{
volatile char *portF_dir;
volatile char *portK_dir;
volatile char *portA_dir;
portF_dir=0x30;
portK_dir=0x107;
portA_dir=0x21;
*portA_dir=0x0F;
*portF_dir=0xFF;
*portK_dir=0xFF;
}
void LCD_outdata(char data1)
{
volatile char *portF_data;
portF_data=0x31;
*portF_data=data1;
}
void ENABLE_and_RS_pin(char data2)
{
volatile char *portK_data;
portK_data=0x108;
*portK_data=data2;
}
void Keypad_Row(char data3)
{
volatile char *portA_data;
portA_data=0x22;
*portA_data=data3 & 0x0F;
}
char Keypad_column()
{
char data4;
volatile char *portA_input;
portA_input=0x20;
data4=(*portA_input & 0xF0)>>4;
data4=(~(data4)) & 0x0F;
return data4;
}
char get_key()
{
int row,col;
char key_value,column;
for(row=0;row<4;row++)
{
Keypad_Row(~(1<<row));
for(col=0;col<4;col++)
{
column=Keypad_column();
if(column!=0x00)
{
delay1();
for(col=0;col<4;col++)
{
if(column==(1<<col))
{
key_value=row*4+col+1;
delay1();
return(key_value);
}
}
}
}
}
return(0);
}
void Enable_pulse()
{
ENABLE_and_RS_pin(0x01);
delay2();
ENABLE_and_RS_pin(0x00);
delay2();
}
void LCD_initialization()
{
LCD_outdata(0x38);
Enable_pulse();
LCD_outdata(0x0E);
Enable_pulse();
}
void write_data_LCD(char data5)
{
LCD_outdata(data5);
ENABLE_and_RS_pin(0x02);
delay2();
ENABLE_and_RS_pin(0x03);
delay2();
ENABLE_and_RS_pin(0x02);
delay2();
ENABLE_and_RS_pin(0x00);
}
void clear_display()
{
LCD_outdata(0x01);
Enable_pulse();
}
void Return_home()
{
LCD_outdata(0x02);
Enable_pulse();
}
void shift_or_cursor()
{
LCD_outdata(0x10);
Enable_pulse();
}
void Set_DDRAM_Address(char data6)
{
LCD_outdata(data6);
Enable_pulse();
}
void Display_string(char *pos)
{
while(*pos!=0)
{
write_data_LCD(*pos);
*pos++;
}
}
void clear_inputs(char input[])
{
int i;
for(i=0;i<5;i++)
{
input[i]='\0';
}
}
void clear_outputs(char output1[])
{
int i;
for(i=0;i<17;i++)
{
output1[i]='\0';
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
char key,input1[8],input2[8],output[17];
int i,flag=0,j=0,out=0,operation,check=0;
port_initializations();
LCD_initialization();
char key_binding[16]={'1','2','3','+','4','5','6','-','7','8','9','*','<','0','=','/'};
while(1)
{
key=get_key();
while(key==0 && out==0)
{
key=get_key();
for(i=1;i<=16;i++)
{
if(i==key)
{
if(key==15)
{
write_data_LCD(key_binding[i-1]);
out=1;
// Serial.println("the value of out is ");
// Serial.println(out);
}
if(key==13)
{
shift_or_cursor();
write_data_LCD(' ');
if(check==1)
{
operation=0;
}
else{
j=j-1;
}
shift_or_cursor();
}
if(((key!=4)&&(key!=8)&&(key!=12)&&(key!=15)&&(key!=16)&&(key!=13))&&flag==0)
{
write_data_LCD(key_binding[i-1]);
input1[j]=key_binding[i-1];
// Serial.println(j);
// Serial.println(" ");
j=j+1;
input1[j]=0;
}
if(((key!=4)&&(key!=8)&&(key!=12)&&(key!=15)&&(key!=16)&&(key!=13))&&flag==1)
{
write_data_LCD(key_binding[i-1]);
check=0;
input2[j]=key_binding[i-1];
//Serial.println(input2[j]);
// Serial.println(" ");
j=j+1;
input2[j]=0;
}
if(key==4||key==8||key==12||key==16)
{
write_data_LCD(key_binding[i-1]);
operation=key;
check=1;
flag=1;
j=0;
}
}
}
delay3();
}
// Serial.println("out of the while");
if(out==1)
{
// Serial.println("the value of operation is ");
// Serial.println(operation,DEC);
if (operation==4)
{
// Serial.println("the value of inputl is");
// Serial.println(input1);
// Serial.println("the value of input2 is");
// Serial.println(input2);
Serial.println("Addition");
addition(input1,input2,output);
// Serial.println("the value of Addition output is");
// Serial.println(output);
Return_home();
Set_DDRAM_Address(0xC0);
Display_string(output);
}
if (operation==8)
{
Serial.println("Subtraction");
subtraction(input1,input2,output);
Return_home();
Set_DDRAM_Address(0xC0);
Display_string(output);
}
if (operation==12)
{
Serial.println("Multiplication");
multiplication(input1,input2,output);
Return_home();
Set_DDRAM_Address(0xC0);
Display_string(output);
}
if (operation==16)
{
Serial.println("Division");
division_quotient(input1,input2,output);
Return_home();
Set_DDRAM_Address(0xC0);
Display_string(output);
}
operation=0;
}
if(key==13&&out==1)
{
Return_home();
//Set_DDRAM_Address(0x80);
clear_display();
// Serial.println("Clear");
clear_inputs(input1);
clear_inputs(input2);
clear_outputs(output);
out=0;
j=0;
flag=0;
}
}
}
void loop() {
// put your main code here, to run repeatedly:
}