#include #define KEYBOARD_I2C_ADDR 0X08 #define KEYBOARD_INT 5 float Num1 = 0; float Num2 = 0; float Num3 = 0; float Num4 = 0; char Fun; char Fun2; char Fun3; int CalNum = 0; int SumFlag = 0; float Sum; String Datain; uint8_t key_val; void setup() { M5.begin(); Wire.begin(); M5.Lcd.setTextFont(4); pinMode(KEYBOARD_INT, INPUT_PULLUP); CalNum = 1; Draw_Screen(); } void loop() { if (digitalRead(KEYBOARD_INT) == LOW) { Wire.requestFrom(KEYBOARD_I2C_ADDR, 1); // request 1 byte from keyboard while (Wire.available()) { uint8_t key_val = Wire.read(); // receive a byte as character if (key_val != 0) { if (isDigit(key_val) || key_val == '.') { if (SumFlag == 1) { StoreData(); } Datain += (char)key_val; IsNumber(); } if (key_val == 'A' || key_val == '+' || key_val == '-' || key_val == '*' || key_val == '/' || key_val == '=') { FunKey(key_val); } } } } } void FunKey(uint8_t key_in) { switch (key_in) { case 'A': M5.Lcd.clear(); Draw_Screen(); Num1 = 0; Num2 = 0; Sum = 0; Datain = " "; CalNum = 1; break; case '=': if (Fun == '+') { Sum = Num1 + Num2; } if (Fun == '-') { Sum = Num1 - Num2; } if (Fun == '*') { Sum = Num1 * Num2; } if (Fun == '/') { Sum = Num1 / Num2; } M5.Lcd.setCursor(105, 190); M5.Lcd.print(Sum); SumFlag = 1; break; case '+': Fun = '+'; CalNum += 1; Datain = " "; M5.Lcd.setCursor(20, 140); M5.Lcd.print(" "); M5.Lcd.setCursor(20, 140); M5.Lcd.print(Fun); break; case '-': Fun = '-'; CalNum += 1; Datain = " "; M5.Lcd.setCursor(20, 140); M5.Lcd.print(" "); M5.Lcd.setCursor(20, 140); M5.Lcd.print(Fun); break; case '*': Fun = '*'; CalNum += 1; Datain = " "; M5.Lcd.setCursor(20, 140); M5.Lcd.print(" "); M5.Lcd.setCursor(20, 140); M5.Lcd.print(Fun); break; case '/': Fun = '/'; CalNum += 1; Datain = " "; M5.Lcd.setCursor(20, 140); M5.Lcd.print(" "); M5.Lcd.setCursor(20, 140); M5.Lcd.print(Fun); break; default: break; } } void StoreData(void) { Num1 = Sum; Num2 = 0; SumFlag = 0; Datain = " "; M5.Lcd.setCursor(20, 140); M5.Lcd.print(Fun); M5.Lcd.setCursor(70, 100); M5.Lcd.print(" "); M5.Lcd.setCursor(70, 140); M5.Lcd.print(" "); M5.Lcd.setCursor(70, 100); M5.Lcd.print(Num1); M5.Lcd.setCursor(105, 190); M5.Lcd.print(" "); } void IsNumber(void) { if (CalNum == 1) { Num1 = Datain.toFloat(); M5.Lcd.setCursor(70, 100); M5.Lcd.print(Num1); } if (CalNum >= 2) { Num2 = Datain.toFloat(); M5.Lcd.setCursor(70, 140); M5.Lcd.print(Num2); } } void DrawBox(int LocX, int LocY, int W, int H) { M5.Lcd.drawLine(LocX, LocY, LocX + W, LocY, TFT_WHITE); M5.Lcd.drawLine(LocX, LocY + H, LocX + W, LocY + H, TFT_WHITE); M5.Lcd.drawLine(LocX, LocY, LocX, LocY + H, TFT_WHITE); M5.Lcd.drawLine(LocX + W, LocY, LocX + W, LocY + H, TFT_WHITE); } void Draw_Screen(void) { M5.Lcd.clear(); M5.Lcd.drawLine(1, 180, 320, 180, TFT_WHITE); M5.Lcd.setCursor(15, 20); M5.Lcd.print("FRACTION CALCULATOR"); DrawBox(50, 95, 250, 32); DrawBox(10, 135, 30, 32); DrawBox(50, 135, 250, 32); M5.Lcd.setCursor(10, 190); M5.Lcd.print("SUM ="); }