Simple integer calculator using FRDM-KL25Z and Adafruit 2.8" TFT with touch \\ "Dentaku" means "Desktop Calculator" in Japanese \\ On 5-Dec-2015, Support for FRDM-K64F, FRDM-K22F, NUCLEO-F411RE added.
Dependencies: SPI_STMPE610 UniGraphic mbed vt100
Yet another simple desktop calculator program, only for integer.
As usual I used FRDM-KL25Z, Adafruit 2.8" TFT with touch and UniGraphic library.
Now works with FRDM-K64F, FRDM-K22F, and NUCLEO-F411RE.
整数計算のみの簡単な電卓プログラムです。
例によって、FRDM-KL25Z, Adafruit 2.8" TFT with touch, そして UniGraphic を使用しています。
FRDM-K64F, FRDM-K22F, NUCLEO-F411RE でも動くようになりました。
menu.cpp
- Committer:
- Rhyme
- Date:
- 2017-04-11
- Revision:
- 4:d4c937bcc469
- Parent:
- 0:659a74b77279
File content as of revision 4:d4c937bcc469:
/** mbed oscilloscope my implementation of a oscillo scope * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab * * menu.cpp * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include "mbed.h" #include <ILI9341.h> #include "SPI_STMPE610.h" //#include "Arial12x12.h" //#include "Arial24x23.h" #include "Arial28x28.h" //#include "Arial43x48_numb.h" #include "vt100.h" #include "TFTMenu.h" #include "menu.h" #include "main.h" #define NUM_MAX_DIGIT 8 int num_digit = 0 ; long prevValue = 0 ; long topValue = 0 ; int op = opPlus ; void doDigit(int num) { if (num_digit < NUM_MAX_DIGIT) { topValue = topValue * 10 + num ; num_digit++ ; display() ; } } void do0(void) { doDigit(0) ; } void do1(void) { doDigit(1) ; } void do2(void) { doDigit(2) ; } void do3(void) { doDigit(3) ; } void do4(void) { doDigit(4) ; } void do5(void) { doDigit(5) ; } void do6(void) { doDigit(6) ; } void do7(void) { doDigit(7) ; } void do8(void) { doDigit(8) ; } void do9(void) { doDigit(9) ; } void doPlus(void) { doCalc() ; prevValue = topValue ; topValue = 0 ; num_digit = 0 ; op = opPlus ; display("+") ; } void doMinus(void) { doCalc() ; prevValue = topValue ; topValue = 0 ; num_digit = 0 ; op = opMinus ; display("-") ; } void doMul(void) { doCalc() ; prevValue = topValue ; topValue = 0 ; num_digit = 0 ; op = opMul ; display("x") ; } void doDiv(void) { doCalc() ; prevValue = topValue ; topValue = 0 ; num_digit = 0 ; op = opDiv ; display("/") ; } void doClear(void) { prevValue = 0 ; topValue = 0 ; num_digit = 0 ; op = opPlus ; display() ; } int doCalc(void) { int error = 0 ; switch(op) { case opPlus: topValue += prevValue ; break ; case opMinus: topValue = prevValue - topValue ; break ; case opMul: topValue = prevValue * topValue ; break ; case opDiv: if (topValue != 0) { topValue = prevValue / topValue ; } else { error = 1 ; } break ; default: break ; } prevValue = 0 ; return(error) ; } void doEqu(void) { int error = 0 ; error = doCalc() ; if (error) { display("Error!") ; } else { display() ; } op = opPlus ; num_digit = 0 ; } void initMenu(void) { int f_left = 18 ; int f_top = 14 ; numMenu = 0 ; menu[numMenu++] = new TFTMenuItem( 5, 85, 55, 135, do7, "7", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem( 65, 85, 115, 135, do8, "8", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem(125, 85, 175, 135, do9, "9", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem(185, 85, 235, 135, doClear, "C", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem( 5, 145, 55, 195, do4, "4", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem( 65, 145, 115, 195, do5, "5", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem(125, 145, 175, 195, do6, "6", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem(185, 145, 235, 195, doMinus,"-", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem( 5, 205, 55, 255, do1, "1", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem( 65, 205, 115, 255, do2, "2", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem(125, 205, 175, 255, do3, "3", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem(185, 205, 235, 255, doPlus, "+", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem( 5, 265, 55, 315, do0, "0", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem( 65, 265, 115, 315, doMul ,"x", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem(125, 265, 175, 315, doDiv, "/", Green, Black, f_left, f_top) ; menu[numMenu++] = new TFTMenuItem(185, 265, 235, 315, doEqu, "=", Green, Black, f_left, f_top) ; } void drawMenu(void) { for (int i = 0 ; i < numMenu ; i++ ) { menu[i]->draw() ; } } bool doMenu(uint16_t x, uint16_t y) { bool result = false ; for (int i = 0 ; i < numMenu ; i++ ) { if (menu[i]->hit(x, y)) { menu[i]->doIt() ; menu[i]->draw() ; result = true ; // printf("%s TopValue = %d, PreValue = %d\n\r", menu[i]->name(), topValue, prevValue) ; break ; } } return( result ) ; }