CALCULATOR.ino 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include <M5Stack.h>
  2. #define KEYBOARD_I2C_ADDR 0X08
  3. #define KEYBOARD_INT 5
  4. float Num1 = 0;
  5. float Num2 = 0;
  6. float Num3 = 0;
  7. float Num4 = 0;
  8. char Fun;
  9. char Fun2;
  10. char Fun3;
  11. int CalNum = 0;
  12. int SumFlag = 0;
  13. float Sum;
  14. String Datain;
  15. uint8_t key_val;
  16. void setup() {
  17. M5.begin();
  18. Wire.begin();
  19. M5.Lcd.setTextFont(4);
  20. pinMode(KEYBOARD_INT, INPUT_PULLUP);
  21. CalNum = 1;
  22. Draw_Screen();
  23. }
  24. void loop() {
  25. if (digitalRead(KEYBOARD_INT) == LOW) {
  26. Wire.requestFrom(KEYBOARD_I2C_ADDR, 1); // request 1 byte from keyboard
  27. while (Wire.available()) {
  28. uint8_t key_val = Wire.read(); // receive a byte as character
  29. if (key_val != 0) {
  30. if (isDigit(key_val) || key_val == '.') {
  31. if (SumFlag == 1) {
  32. StoreData();
  33. }
  34. Datain += (char)key_val;
  35. IsNumber();
  36. }
  37. if (key_val == 'A' || key_val == '+' || key_val == '-' ||
  38. key_val == '*' || key_val == '/' || key_val == '=') {
  39. FunKey(key_val);
  40. }
  41. }
  42. }
  43. }
  44. }
  45. void FunKey(uint8_t key_in) {
  46. switch (key_in) {
  47. case 'A':
  48. M5.Lcd.clear();
  49. Draw_Screen();
  50. Num1 = 0;
  51. Num2 = 0;
  52. Sum = 0;
  53. Datain = " ";
  54. CalNum = 1;
  55. break;
  56. case '=':
  57. if (Fun == '+') {
  58. Sum = Num1 + Num2;
  59. }
  60. if (Fun == '-') {
  61. Sum = Num1 - Num2;
  62. }
  63. if (Fun == '*') {
  64. Sum = Num1 * Num2;
  65. }
  66. if (Fun == '/') {
  67. Sum = Num1 / Num2;
  68. }
  69. M5.Lcd.setCursor(105, 190);
  70. M5.Lcd.print(Sum);
  71. SumFlag = 1;
  72. break;
  73. case '+':
  74. Fun = '+';
  75. CalNum += 1;
  76. Datain = " ";
  77. M5.Lcd.setCursor(20, 140);
  78. M5.Lcd.print(" ");
  79. M5.Lcd.setCursor(20, 140);
  80. M5.Lcd.print(Fun);
  81. break;
  82. case '-':
  83. Fun = '-';
  84. CalNum += 1;
  85. Datain = " ";
  86. M5.Lcd.setCursor(20, 140);
  87. M5.Lcd.print(" ");
  88. M5.Lcd.setCursor(20, 140);
  89. M5.Lcd.print(Fun);
  90. break;
  91. case '*':
  92. Fun = '*';
  93. CalNum += 1;
  94. Datain = " ";
  95. M5.Lcd.setCursor(20, 140);
  96. M5.Lcd.print(" ");
  97. M5.Lcd.setCursor(20, 140);
  98. M5.Lcd.print(Fun);
  99. break;
  100. case '/':
  101. Fun = '/';
  102. CalNum += 1;
  103. Datain = " ";
  104. M5.Lcd.setCursor(20, 140);
  105. M5.Lcd.print(" ");
  106. M5.Lcd.setCursor(20, 140);
  107. M5.Lcd.print(Fun);
  108. break;
  109. default:
  110. break;
  111. }
  112. }
  113. void StoreData(void) {
  114. Num1 = Sum;
  115. Num2 = 0;
  116. SumFlag = 0;
  117. Datain = " ";
  118. M5.Lcd.setCursor(20, 140);
  119. M5.Lcd.print(Fun);
  120. M5.Lcd.setCursor(70, 100);
  121. M5.Lcd.print(" ");
  122. M5.Lcd.setCursor(70, 140);
  123. M5.Lcd.print(" ");
  124. M5.Lcd.setCursor(70, 100);
  125. M5.Lcd.print(Num1);
  126. M5.Lcd.setCursor(105, 190);
  127. M5.Lcd.print(" ");
  128. }
  129. void IsNumber(void) {
  130. if (CalNum == 1) {
  131. Num1 = Datain.toFloat();
  132. M5.Lcd.setCursor(70, 100);
  133. M5.Lcd.print(Num1);
  134. }
  135. if (CalNum >= 2) {
  136. Num2 = Datain.toFloat();
  137. M5.Lcd.setCursor(70, 140);
  138. M5.Lcd.print(Num2);
  139. }
  140. }
  141. void DrawBox(int LocX, int LocY, int W, int H) {
  142. M5.Lcd.drawLine(LocX, LocY, LocX + W, LocY, TFT_WHITE);
  143. M5.Lcd.drawLine(LocX, LocY + H, LocX + W, LocY + H, TFT_WHITE);
  144. M5.Lcd.drawLine(LocX, LocY, LocX, LocY + H, TFT_WHITE);
  145. M5.Lcd.drawLine(LocX + W, LocY, LocX + W, LocY + H, TFT_WHITE);
  146. }
  147. void Draw_Screen(void) {
  148. M5.Lcd.clear();
  149. M5.Lcd.drawLine(1, 180, 320, 180, TFT_WHITE);
  150. M5.Lcd.setCursor(15, 20);
  151. M5.Lcd.print("FRACTION CALCULATOR");
  152. DrawBox(50, 95, 250, 32);
  153. DrawBox(10, 135, 30, 32);
  154. DrawBox(50, 135, 250, 32);
  155. M5.Lcd.setCursor(10, 190);
  156. M5.Lcd.print("SUM =");
  157. }