# TFT LCD Calculator!!

Finally!
I made a TFT LCD calculator!!!
I wanted to not see the internet for clues, but eventually I had to ( cause it was a little tough ) which helped me 0%. I mean literally. So all code was written by me.

So this is a touchscreen calculator suitable for 320*240 TFT LCD shields. You can copy-paste the code and try it out yourself!

A special thanks to david_prentice for his knowledge in displays and the creator of the amazing MCU_FRIEND Library!

I was first using strings in my code ( not understanding the evil of Strings ) but then after seeing this
and after my calculations failed a few times, I started using char arrays.

Char Arrays are amazing! easy to work with and best of all NO ERRORS like strings!!!

The calculator can perform simple calculations like +, -, *, / and for division it only gives the decimal ( float ) value if required.

Example: 6 / 3: Float value not required.
5 / 2: Float value required.

It also has a clear button ( ‘C’ ) to clear the screen and reset the calculator.

Code for the calculator:

``````#include <MCUFRIEND_kbv.h> // MCUFRIEND_kbv library
#include <TouchScreen.h> // Adafruit Touchscreen library

MCUFRIEND_kbv tft;
const int XP = 7, XM = A1, YP = A2, YM = 6;
const int TS_LEFT = 185, TS_RT = 897, TS_TOP = 153, TS_BOT = 887; // Calibrated

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
TSPoint tp;

int xpos, ypos, n, n1, n2;

int xf, yf = 90, count;
int i;
int check, sum;
int op;
int check2;
float floatSum;

int cx;
int counterNum, floatCheck;
char ar[5];

#define white 0xFFFFFF
#define black 0x0000
#define blue    0x001F
#define red     0xF800
#define green   0x07E0
#define cyan    0x07FF
#define magenta 0xF81F
#define yellow  0xFFE0

void setup()
{
Serial.begin ( 9600 );
tft.begin ( 0x9325 );

count = 1;

for ( int j = 1; j <= 3; j++ )
{
for ( i = 1; i <= 3; i++ )
{
tft.fillRect ( xf, yf, 60, 60, yellow );
tft.setCursor ( xf + 20, yf + 10 );
tft.setTextSize ( 4 );
tft.setTextColor ( black );
tft.print ( count );

xf = xf + 60;
count = count + 1;
}
xf = 0;
yf = yf + 60;
}
tft.fillRect ( 0, 270, 60, 60, yellow );
tft.setCursor ( 20, 280 );
tft.setTextSize ( 4 );
tft.setTextColor ( black );
tft.print ( "C" );

tft.fillRect ( 60, 270, 60, 60, yellow );
tft.setCursor ( 80, 280 );
tft.setTextSize ( 4 );
tft.setTextColor ( black );
tft.print ( 0 );

tft.fillRect ( 120, 270, 60, 60, yellow );
tft.setCursor ( 140, 280 );
tft.setTextSize ( 4 );
tft.setTextColor ( black );
tft.print ( "=" );

tft.fillRect ( 180, 270, 60, 60, yellow );
tft.setCursor ( 200, 280 );
tft.setTextSize ( 4 );
tft.setTextColor ( black );
tft.print ( "/" );

tft.fillRect ( 180, 210, 60, 60, yellow );
tft.setCursor ( 200, 220 );
tft.setTextSize ( 4 );
tft.setTextColor ( black );
tft.print ( "*" );

tft.fillRect ( 180, 150, 60, 60, yellow );
tft.setCursor ( 200, 160 );
tft.setTextSize ( 4 );
tft.setTextColor ( black );
tft.print ( "-" );

tft.fillRect ( 180, 90, 60, 60, yellow );
tft.setCursor ( 200, 100 );
tft.setTextSize ( 4 );
tft.setTextColor ( black );
tft.print ( "+" );

cls();

cx = 10;
tft.setCursor ( cx, 45 );
check = 0;
check2 = 0;
counterNum = 0;
}
void loop()
{
floatSum = 0;
tft.setTextSize ( 5 );
tft.setTextColor ( white );

uint16_t xpos, ypos;
tp = ts.getPoint(); // Getting x, y ( touched )

pinMode ( XM, OUTPUT );
pinMode ( YP, OUTPUT );

xpos = map (tp.x, TS_LEFT, TS_RT, 0, tft.width());
ypos = map (tp.y, TS_TOP, TS_BOT, 0, tft.height()); // mapping the values

if ( tp.z >= 165 )
{
tft.setCursor ( cx, 45 );
if ( xpos >= 0 && ypos >= 90 && xpos <= 60 && ypos <= 150 && check == 0 )
{
tft.print ( "1" );
ar[counterNum] = '1';
counterNum = counterNum + 1;
cx = cx + 30;
}
if ( xpos >= 60 && ypos >= 90 && xpos <= 120 && ypos <= 150 && check == 0 )
{
tft.print ( "2" );
ar[counterNum] = '2';
counterNum = counterNum + 1;
cx = cx + 30;
}
if ( xpos >= 120 && ypos >= 90 && xpos <= 180 && ypos <= 150 && check == 0 )
{
tft.print ( "3" );
ar[counterNum] = '3';
counterNum = counterNum + 1;
cx = cx + 30;
}
if ( xpos >= 180 && ypos >= 90 && xpos <= 240 && ypos <= 150 && check == 0 )
{
tft.print ( "+" );
cx = cx + 30;

sum = atoi ( ar );
counterNum = 0;
op = 1;

memset( ar, '?', sizeof ( ar ) );
}
if ( xpos >= 0 && ypos >= 150 && xpos <= 60 && ypos <= 210 && check == 0 )
{
tft.print ( "4" );
ar[counterNum] = '4';
counterNum = counterNum + 1;
cx = cx + 30;
}
if ( xpos >= 60 && ypos >= 150 && xpos <= 120 && ypos <= 210 && check == 0 )
{
tft.print ( "5" );
ar[counterNum] = '5';
counterNum = counterNum + 1;
cx = cx + 30;
}
if ( xpos >= 120 && ypos >= 150 && xpos <= 180 && ypos <= 210 && check == 0 )
{
tft.print ( "6" );
ar[counterNum] = '6';
counterNum = counterNum + 1;
cx = cx + 30;
}
if ( xpos >= 180 && ypos >= 150 && xpos <= 240 && ypos <= 210 && check == 0 )
{
tft.print ( "-" );
cx = cx + 30;

sum = atoi ( ar );
counterNum = 0;
op = 2;

memset( ar, '?', sizeof( ar ) );
}
if ( xpos >= 0 && ypos >= 210 && xpos <= 60 && ypos <= 270 && check == 0 )
{
tft.print ( "7" );
ar[counterNum] = '7';
counterNum = counterNum + 1;
cx = cx + 30;
}
if ( xpos >= 60 && ypos >= 210 && xpos <= 120 && ypos <= 270 && check == 0 )
{
tft.print ( "8" );
ar[counterNum] = '8';
counterNum = counterNum + 1;
cx = cx + 30;
}
if ( xpos >= 120 && ypos >= 210 && xpos <= 180 && ypos <= 270 && check == 0 )
{
tft.print ( "9" );
ar[counterNum] = '9';
counterNum = counterNum + 1;
cx = cx + 30;
}
if ( xpos >= 180 && ypos >= 210 && xpos <= 240 && ypos <= 270 && check == 0 )
{
tft.print ( "*" );
cx = cx + 30;

sum = atoi ( ar );
counterNum = 0;
op = 3;

memset( ar, '?', sizeof( ar ) );
}
if ( xpos >= 0 && ypos >= 270 && xpos <= 60 && ypos <= 330 )
{
cls();
check = 0;
cx = 10;
check2 = 0;
memset( ar, '?', sizeof( ar ) );
}
if ( xpos >= 60 && ypos >= 270 && xpos <= 120 && ypos <= 330 && check == 0 )
{
tft.print ( "0" );
cx = cx + 30;

ar[counterNum] = '0';
counterNum = counterNum + 1;
}
if ( xpos >= 120 && ypos >= 270 && xpos <= 180 && ypos <= 330  && check == 0 )
{
check = 1;
cls();
}
if ( xpos >= 180 && ypos >= 270 && xpos <= 240 && ypos <= 330 && check == 0 )
{
tft.print ( "/" );
cx = cx + 30;

sum = atoi ( ar );
counterNum = 0;
op = 4;

memset( ar, '?', sizeof( ar ) );
}
delay ( 200 );
}

if ( check == 1 && check2 != 1 )
{
int n2 = 0;
check2 = check2 + 1;

n2 = atoi ( ar );
floatSum = sum;

switch ( op ) {

case 1:
sum = sum + n2;
break;

case 2:
sum = sum - n2;
break;

case 3:
sum = sum * n2;
break;

case 4:
sum = sum / n2;
floatSum = floatSum / n2;

floatCheck = 0;
if ( floatSum - sum != 0 )
{
floatCheck = 1;
}
break;
}

tft.setCursor ( 10, 45 );
tft.setTextColor ( white );
tft.setTextSize ( 5 );
tft.print ( "=" );
tft.setCursor ( 45, 45 );
if ( floatCheck == 0 ) {
tft.print ( sum );
}
if ( floatCheck == 1 ) {
tft.print ( floatSum );
}

cx = 10;
sum = 0;
counterNum = 0;
floatCheck = 0;
}
}

void cls()
{
tft.fillRect ( 0, 0, 240, 90, black );
tft.drawFastHLine ( 0, 90, 240, white );

tft.fillRect ( 0, 0, 240, 25, yellow );
tft.setCursor ( 35, 1 );
tft.setTextSize ( 3 );
tft.setTextColor ( black );
tft.print ( "Calculator" );
}
``````

Sorry if I leave a lot of space but I usually code like that :D; Code is Auto Formatted.

Wiring: Just plug the shield into the Arduino. ( Nothin’ much )

Hope you all like it :)!!

TheUNOGuy:
…So all code was written by me.

Nice work!

I'm gonna have to locate an LCD I know is around here somewhere and give it a whirl. With any luck I'll find I have the exact same device. With less luck, I'll be able to make some simple changes to accommodate the unit I actually have. Finding it, hmmm, that'll be real luck.

I remember seeing your questions on the programming side, didn't pay much attention to where you were headed.

a7

Thank you!

alto777:
I remember seeing your questions on the programming side, didn't pay much attention to where you were headed.

Towards this

You need some pictures of the thing running.

-jim lee

I will edit the main post soon and add pictures...