CALCULATOR.ino 3.9 KB

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