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 でも動くようになりました。

/media/uploads/Rhyme/img_1194.jpg

Files at this revision

API Documentation at this revision

Comitter:
Rhyme
Date:
Sun Aug 02 14:00:59 2015 +0000
Child:
1:1d311dfd5f5c
Commit message:
commit before publish;

Changed in this revision

SPI_STMPE610.lib Show annotated file Show diff for this revision Revisions of this file
TFTMenu.cpp Show annotated file Show diff for this revision Revisions of this file
TFTMenu.h Show annotated file Show diff for this revision Revisions of this file
UniGraphic.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
menu.cpp Show annotated file Show diff for this revision Revisions of this file
menu.h Show annotated file Show diff for this revision Revisions of this file
vt100.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SPI_STMPE610.lib	Sun Aug 02 14:00:59 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/Rhyme/code/SPI_STMPE610/#34e7dc5991b5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TFTMenu.cpp	Sun Aug 02 14:00:59 2015 +0000
@@ -0,0 +1,180 @@
+/** mbed oscilloscope my implementation of a oscillo scope
+ * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab
+ *
+ * TFTMenu.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 <string.h>
+
+#include "TFTMenu.h"
+
+extern ILI9341 TFT ;
+extern SPI_STMPE610 TSC ;
+extern vt100 *tty ;
+
+
+TFTMenuItem::TFTMenuItem(int x1, int y1, int x2, int y2, FuncPtr fnc, 
+    char *name, uint16_t mcolor, uint16_t fcolor, int l_margin, int t_margin ) 
+{
+    left = x1 ;
+    right = x2 ;
+    top = y1 ;
+    bottom = y2 ;
+    if (name) {
+        label = new char[strlen(name)+1] ;
+        strcpy(label, name) ;
+        font_color = fcolor ;
+    }
+    menu_color = mcolor ;
+    
+    left_margin = l_margin ; // 7 ; 
+    top_margin = t_margin ; // 10 ; 
+    func = fnc ;
+}
+
+TFTMenuItem::~TFTMenuItem() 
+{
+    left = 0 ;
+    right = 0 ;
+    top = 0 ;
+    bottom = 0 ;
+    if (label) {
+        free(label) ;
+    }
+}
+
+TFTRadioButton::TFTRadioButton(int x1, int y1, int x2, int y2, FuncPtr fnc, 
+    char *name, uint16_t mcolor, uint16_t fcolor,
+    char *altname, uint16_t altmcolor, uint16_t altfcolor, 
+    bool sel) : TFTMenuItem(x1,y1,x2,y2,fnc,name,mcolor,fcolor)
+{
+    if (altname) {
+        alt_label = new char[strlen(altname) + 1] ;
+        strcpy(alt_label, altname) ;
+    } else {
+        alt_label = 0 ;
+    }
+    alt_font_color = altfcolor ;
+    alt_menu_color = altmcolor ;
+    selected = sel ;
+}
+
+TFTRadioButton::~TFTRadioButton() 
+{
+    left = 0 ;
+    right = 0 ;
+    top = 0 ;
+    bottom = 0 ;
+    if (label) {
+        delete label ;
+    }
+    if (alt_label) {
+        delete alt_label ;
+    }
+}
+
+bool TFTRadioButton::hit(int x, int y)
+{
+    bool result = false ;
+    if ((left <= x)&&(x <= right)&&(top <= y)&&(y <= bottom)) {
+        result = true ;
+        if (selected) {
+            selected = false ;
+        } else {
+            selected = true ;
+        }
+        draw() ;
+    }
+    return( result ) ;
+}
+
+void TFTRadioButton::select(bool value)
+{
+    selected = value ;
+}
+
+uint16_t TFTMenuItem::getColor(void) 
+{
+    return(menu_color) ;
+}
+
+bool TFTMenuItem::hit(int x, int y) 
+{
+    bool result = false ;
+    if ((left <= x)&&(x <= right)&&(top <= y)&&(y <= bottom)) {
+        result = true ;
+        draw() ;
+    }
+//    draw() ;
+    return( result ) ;
+}
+
+void TFTMenuItem::doIt(void)
+{
+    if (func) {
+        func() ;
+    }
+}
+
+void TFTMenuItem::font_margin(int x, int y) 
+{
+    top_margin = y ;
+    left_margin = x ;
+}
+
+void TFTMenuItem::draw(int offset_x, int offset_y)
+{
+    TFT.BusEnable(true) ;
+    TFT.fillrect(left+offset_x, top+offset_y, right+offset_x, bottom+offset_y, Black) ;
+    TFT.fillrect(left+offset_x, top+offset_y, right+offset_x, bottom+offset_y, menu_color) ;
+    wait(0.1) ;
+    TFT.locate(left+offset_x+left_margin, top+offset_y+top_margin) ;
+    TFT.foreground(font_color) ;
+    TFT.background(menu_color) ;
+    TFT.set_font((unsigned char *)Arial28x28) ;
+    wait(0.1) ;
+    TFT.printf(label) ;
+    TFT.BusEnable(false) ;
+}
+
+void TFTRadioButton::draw(int offset_x, int offset_y)
+{
+    TFT.BusEnable(true) ;
+    if (selected) {
+        TFT.fillrect(left+offset_x, top+offset_y, right+offset_x, bottom+offset_y, Black) ;
+        TFT.fillrect(left+offset_x, top+offset_y, right+offset_x, bottom+offset_y, alt_menu_color) ;
+        wait(0.1) ;
+        TFT.locate(left+offset_x+left_margin, top+offset_y+top_margin) ;
+        TFT.foreground(alt_font_color) ;
+        TFT.background(alt_menu_color) ;
+        TFT.set_font((unsigned char *)Arial12x12) ;
+        wait(0.1) ;
+        TFT.printf(alt_label) ;
+    } else {
+        TFTMenuItem::draw(offset_x, offset_y) ;
+    }
+    TFT.BusEnable(false) ;
+}
+        
+
+void TFTMenuItem::highlight(int offset_x, int offset_y)
+{
+    TFT.BusEnable(true) ;
+    TFT.rect(left+offset_x, top+offset_y, right+offset_x, bottom+offset_y, font_color) ;
+    TFT.BusEnable(false) ;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TFTMenu.h	Sun Aug 02 14:00:59 2015 +0000
@@ -0,0 +1,76 @@
+/** mbed oscilloscope my implementation of a oscillo scope
+ * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab
+ *
+ * TFTMenu.h
+ *
+ * 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.
+ */
+#ifndef _TFT_MENU_H_
+#define _TFT_MENU_H_ defined
+
+typedef void (*FuncPtr)(void) ;
+
+class TFTMenuItem {
+public:
+TFTMenuItem(int x1, int y1, int x2, int y2, FuncPtr fnc, 
+    char *name, uint16_t mc, uint16_t fc,
+    int l_margin = 7, int t_margin = 10) ;
+~TFTMenuItem() ;
+virtual bool hit(int x, int y) ;
+virtual void draw(int offset_x = 0, int offset_y = 0) ;
+virtual void font_margin(int x, int y) ;
+void highlight(int offset_x = 0, int offset_y = 0) ;
+uint16_t getColor(void) ;
+void doIt(void) ;
+const char *name(void) { return label ; }
+
+protected:
+char *label ;
+uint16_t font_color ;
+uint16_t menu_color ;
+int top ; 
+int bottom ;
+int left ;
+int right ;
+int left_margin ;
+int top_margin ;
+FuncPtr func ;
+private:
+} ;
+
+class TFTRadioButton : public TFTMenuItem {
+public:
+TFTRadioButton(int x1, int y1, int x2, int y2, FuncPtr fnc, 
+    char *name, uint16_t mc, uint16_t fc,
+    char *altname = 0, uint16_t altmc = 0, uint16_t altfc = 0, 
+    bool sel = false) ;
+~TFTRadioButton() ;
+
+virtual bool hit(int x, int y) ;
+virtual void draw(int offset_x = 0, int offset_y = 0) ;
+
+void select(bool value) ;
+
+protected:
+bool selected ;
+char *alt_label ;
+uint16_t alt_font_color ;
+uint16_t alt_menu_color ;
+// FuncPtr alt_func ;
+private:
+} ;
+
+class TFTMenu {
+public:
+TFTMenu() ; // constructor
+~TFTMenu() ; // destructor 
+private:
+} ;
+
+#endif /* _TFT_MENU_H_ */
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UniGraphic.lib	Sun Aug 02 14:00:59 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/GraphicsDisplay/code/UniGraphic/#f9a37f22b9cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Aug 02 14:00:59 2015 +0000
@@ -0,0 +1,110 @@
+/** mbed oscilloscope my implementation of a oscillo scope
+ * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab
+ *
+ * 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 <string.h>
+#include <ILI9341.h>
+//#include "Arial12x12.h"
+//#include "Arial24x23.h"
+#include "Arial28x28.h"
+//#include "Arial43x48_numb.h"
+#include "SPI_STMPE610.h"
+#include "vt100.h"
+#include "TFTMenu.h"
+#include "menu.h"
+#include "main.h"
+
+vt100 tty ;
+DigitalOut tsc_cs(PIN_CS_TSC, 1) ;
+DigitalOut backlight(PIN_BL_TFT, 0) ;
+ILI9341 TFT(SPI_8, 10000000, 
+    PIN_MOSI, PIN_MISO,  PIN_SCLK, 
+    PIN_CS_TFT, PIN_RESET_TFT, PIN_DC_TFT, "Adafruit2.8") ;
+SPI_STMPE610 TSC(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TSC) ;
+TFTMenuItem *menu[NUM_MAX_MENU] ;
+int numMenu = 0 ;
+
+void initTFT(void)
+{
+    //Configure the display driver
+    TFT.BusEnable(true) ;
+    TFT.FastWindow(true) ;
+    TFT.background(Black);
+    TFT.foreground(White);
+    wait(0.01) ;
+    TFT.cls();
+    TFT.set_orientation(0) ;
+    wait(0.1) ;
+    TFT.BusEnable(false) ;
+}
+
+void hello()
+{
+    printf("=== simple calculator ===\n\r") ;
+    printf("built: %s\n\r",__DATE__) ;
+}
+
+void display(char *label)
+{
+    char str[16] ;
+    int dummy ;
+    int x = 200 ;
+    int y = 30 ;
+    int font_width = 16 ;
+    dummy = topValue ;
+
+    TFT.BusEnable(true) ;
+    TFT.fillrect(0, 0, 239, 80, Black) ;
+    wait(0.1) ;
+    TFT.foreground(White) ;
+    TFT.background(Black) ;
+    wait(0.01) ;
+    TFT.set_font((unsigned char *)Arial28x28) ;
+    wait(0.1) ;
+    
+    if ((label != 0)&&(*label != 0)) {
+        strcpy(str, label) ;
+    } else {
+        sprintf(str, "%d", dummy) ;
+    }
+    x = 228 - (strlen(str) * font_width) ;
+    TFT.locate(x, y) ;
+    TFT.printf(str) ;
+    TFT.BusEnable(false) ;
+}
+
+int main() 
+{
+    int touched ;
+    uint16_t x, y ;
+    bool result ;
+    tsc_cs = 1 ; 
+
+    backlight = 0 ;
+    initTFT() ;
+    initMenu() ;    
+    drawMenu() ;
+    backlight = 1 ;
+    hello() ;
+    
+    display() ;
+    
+    while(1) {
+//       tsc_cs = 0 ;
+        touched = TSC.getPoint(&x, &y) ;
+//        tsc_cs = 1 ;
+//        if (touched && ((x != 0)||(y != 0))) { // TSC sometimes returns (0,0)
+        if ((x != 0)||(y !=0)) { // FRDM-KL46Z fails to return touched somehow
+            result = doMenu(x, y) ;
+        }
+        wait(0.1) ;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Sun Aug 02 14:00:59 2015 +0000
@@ -0,0 +1,101 @@
+/** mbed oscilloscope my implementation of a oscillo scope
+ * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab
+ *
+ * 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.
+ */
+#ifndef _MAIN_H_
+#define _MAIN_H_ inluded
+
+// uncomment following line if K64F rev is E or later
+#define FRDM_K64F_VE
+
+#if   defined (TARGET_KL25Z) 
+#define PIN_MOSI        PTD2
+#define PIN_MISO        PTD3 
+#define PIN_SCLK        PTD1 
+#define PIN_CS_TFT      PTD0 
+#define PIN_DC_TFT      PTD5 
+#define PIN_BL_TFT      PTC9 
+#define PIN_CS_SD       PTA4 
+#define PIN_CS_TSC      PTA13
+#define PIN_TSC_INTR    PTC9
+#define PIN_RESET_TFT   PTB10
+#define PIN_ADC_CH0     PTB0
+#define PIN_ADC_CH1     PTB1
+
+#elif defined (TARGET_KL46Z)
+#define PIN_MOSI        PTD6
+#define PIN_MISO        PTD7 
+#define PIN_SCLK        PTD5 
+#define PIN_CS_TFT      PTD4 
+#define PIN_DC_TFT      PTD2 
+#define PIN_BL_TFT      PTC9 
+#define PIN_CS_SD       PTA4 
+#define PIN_CS_TSC      PTA13
+#define PIN_TSC_INTR    PTC9
+#define PIN_RESET_TFT   PTA20
+#define PIN_ADC_CH0     PTB0
+#define PIN_ADC_CH1     PTB1
+
+#elif defined (TARGET_K64F)
+#define PIN_MOSI        PTD2
+#define PIN_MISO        PTD3
+#define PIN_SCLK        PTD1
+#define PIN_CS_TFT      PTD0
+#define PIN_DC_TFT      PTC4
+#define PIN_BL_TFT      PTC3
+#define PIN_CS_SD       PTB23
+#ifdef FRDM_K64F_VE
+#define PIN_CS_TSC      PTC12
+#else
+#define PIN_CS_TSC      PTA0
+#endif
+#define PIN_TSC_INTR    PTC3
+#define PIN_RESET_TFT   PTB20
+#define PIN_ADC_CH0     PTB2
+#define PIN_ADC_CH1     PTB3
+
+#else
+  #error TARGET NOT DEFINED
+#endif
+
+#define CHART_LEN    198
+
+// NOTE: in case MIN_INTERVAL is too small
+// the program hangs during ADC and timer interrupt
+#define MIN_INTERVAL   30
+#define MAX_INTERVAL   20000
+#define NUM_MAX_MENU   20
+#define NUM_MAX_ANALOG_CH 2
+#define MODE_RUN 1 
+#define MODE_STOP 0
+
+#define opPlus 0
+#define opMinus 1
+#define opMul 2
+#define opDiv 3
+
+
+extern vt100 tty ;
+extern AnalogIn *ach[] ;
+extern Ticker timer ;
+
+extern DigitalOut backlight ;
+extern ILI9341 TFT ;
+extern SPI_STMPE610 TSC ;
+extern TFTMenuItem *menu[] ;
+extern int numMenu ;
+
+extern int num_digit ;
+extern long prevValue ;
+extern long topValue ;
+extern int op ;
+
+void display(char *label = 0) ;
+#endif /* _MAIN_H_ */
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun Aug 02 14:00:59 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/bad568076d81
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/menu.cpp	Sun Aug 02 14:00:59 2015 +0000
@@ -0,0 +1,189 @@
+/** 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 ) ;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/menu.h	Sun Aug 02 14:00:59 2015 +0000
@@ -0,0 +1,37 @@
+/** mbed oscilloscope my implementation of a oscillo scope
+ * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab
+ *
+ * menu.h
+ *
+ * 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.
+ */
+#ifndef _MENU_H_
+#define _MENU_H_ included
+
+int doCalc(void) ;
+void do0(void) ;
+void do1(void) ;
+void do2(void) ;
+void do3(void) ;
+void do4(void) ;
+void do5(void) ;
+void do6(void) ;
+void do7(void) ;
+void do8(void) ;
+void do9(void) ;
+void doPlus(void) ;
+void doMinus(void) ;
+void doMul(void) ;
+void doDiv(void) ;
+void doClear(void) ;
+void doEqu(void) ;
+void initMenu(void) ;
+void drawMenu(void) ;
+bool doMenu(uint16_t x, uint16_t y) ;
+#endif /* _MENU_H_ */
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vt100.lib	Sun Aug 02 14:00:59 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/Rhyme/code/vt100/#62238d4d6032