#include <LiquidCrystal.h>
#include <Keypad.h>
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
}
void loop() {
int n;
int i,j,t;
double *data;
char key ;
boolean valid = false;
while(!n){
lcd.setCursor(0,0);
lcd.print("Total # to sort:");
key = keypad.getKey();
if (key){
if(checkIfNum(key) & key != '0'){
n = String(key).toInt();
data = (double *)calloc(n, sizeof(double));;
lcd.clear();
}
else{
valid_num();
}
}
}
for (int i = 0; i < n; ++i) {
valid = false;
while(!valid){
lcd.setCursor(0,0);
lcd.print(" # input ");
lcd.print(i+1);
lcd.setCursor(0,1);
lcd.print(" out of ");
lcd.print(n);
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 < n; ++i) {
for (j = 0; j <= i; ++j)
{
if (*(data +i) <* (data + j))
{
t = *(data+i);
*(data+i) = *(data+j);
*(data+j) = t;
}
}
}
lcd.setCursor(0,0);
lcd.print(" Ascending order: ");
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
for (i = 0; i < n; ++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();
}