#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
LiquidCrystal_I2C lcd(0x27,20,4);
int i = 0;
const int ROW_NUM = 4;
const int COLUMN_NUM = 4;
byte pin_rows[ROW_NUM] = {9, 8, 7, 6};
byte pin_column[COLUMN_NUM] = {5, 4, 3, 2};
char keys[ROW_NUM][COLUMN_NUM] = {
{'1','2','3', 'A'},
{'4','5','6', 'B'},
{'7','8','9', 'C'},
{'*','0','#', 'D'}
};
Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
char key;
void setup() {
lcd.init();
lcd.backlight();
lcd.home();
Serial.begin(9600);
}
void loop() {
int num_item;
int num, i, k;
double *data, *reset;
boolean valid = false;
while(!num_item){
lcd.setCursor(0,0);
lcd.print("Enter the total");
lcd.setCursor(0,1);
lcd.print("number of items: ");
key = keypad.getKey();
if (key){
if(checkIfNum(key) and key != '0'){
num_item = String(key).toInt();
data = (double *)malloc(num_item);
lcd.clear();
}
else{
valid_num();
}
}
}
for (int i = 0; i < num_item; ++i) {
valid = false;
while(!valid){
lcd.setCursor(0,0);
lcd.print(" No. of input ");
lcd.print(i+1);
lcd.setCursor(0,1);
lcd.print(" out of ");
lcd.print(num_item);
key = keypad.getKey();
if(key){
if(checkIfNum(key)){
int ascii = key;
data[i] = ascii -48;
valid = true;
}
else{
valid_num();
}
}
}
lcd.clear();
}
for (int i = 0; i < num_item; ++i) {
for (k = i + 1; k < num_item; ++k)
{
if (data[i] > data[k])
{
num = data[i];
data[i] = data[k];
data[k] = num;
}
}
}
lcd.setCursor(0,0);
lcd.print(" Numbers in");
lcd.setCursor(0,1);
lcd.print(" ascending order: ");
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
for (i = 0; i < num_item; ++i)
lcd.print(data[i]);
free(data);
delay(5000);
lcd.clear();
}
boolean checkIfNum(char input_char){
if(input_char == 'A' or input_char == 'B' or input_char == 'C' or input_char == 'D' or input_char == '*' or input_char == '#'){
return false;
}
else{
return true;
}
}
void valid_num(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Invalid Number!");
delay(2000);
lcd.clear();
}