零知开源小项目-TFT LCD显示屏制作简易计算器

之前零知增强板上没有直插式TFT LCD屏的库,现在已将对应的库移植到了增强板上,相关的库文件可以再零知IDE的库管理界面下载,现在我们就用零知增强板和TFT LCD屏来制作一个简易的计算器。

1、材料

零知增强板(点击购买)
2.4寸直插式TFT屏(点击购买)

2、硬件连接

零知标准板的引脚和增强板的引脚是可以对应上的,我们只需要对好引脚,将直插式TFT屏按下图所示直接插上增强板即可。

2、程序


											
	/**********************************************************
	 
	*    文件: TFT.ino      by 零知实验室([url=http://www.lingzhilab.com]www.lingzhilab.com[/url])
	*    -^^- 零知开源,让电子制作变得更简单! -^^-
	*    时间: 2019/08/14 11:43
	*    说明:
	************************************************************/
	 
	#include <Adafruit_GFX.h>
	#include <Adafruit_TFTLCD_8bit_STM32.h>
	#include <TouchScreen_STM32.h>
	 
	#define YP TFT_CS
	#define XM TFT_RS
	#define YM 9
	#define XP 8
	 
	#define MINPRESSURE 10   //设置最小和最大按压力度
	#define MAXPRESSURE 1000
	 
	TouchScreen ts = TouchScreen(XP, YP, XM, YM);
	Adafruit_TFTLCD_8bit_STM32 tft;
	 
	String symbol[4][4] = {
	{ "7", "8", "9", "/" },
	{ "4", "5", "6", "*" },
	{ "1", "2", "3", "-" },
	{ "C", "0", "=", "+" }
	};
	 
	int X,Y;
	long Num1,Num2,Number;
	char action; //用于判断进行那种运算
	boolean result = false; //用于判断是否进行计算
	 
	void setup() {
	        Serial.begin(9600);
	        tft.begin(0x9341); //使用lil9341的LCD屏
	        tft.setRotation(2); // 设置屏幕方向
	        tft.fillScreen(BLACK); //填充屏幕为黑色
	        ts.rangeSet(TFTWIDTH, TFTHEIGHT); //设置屏幕宽高
	        initScreen();
	         
	        draw_BoxNButtons();
	}
	void loop() {
	        TSPoint p = waitTouch();
	        X = p.x; Y = p.y;
	        TouchButtons();
	        if (result==true)
	        CalculateResult();
	        DisplayResult();
	        delay(200);
	}
	 
	TSPoint waitTouch() {  //获取触摸点的坐标,并返回
	        TSPoint p;
	        while((p.z < MINPRESSURE )|| (p.z > MAXPRESSURE))
	        {
	                ts.getPoint(&p);
	        }
	        return p;
	}
	 
	void TouchButtons()
	{
	         
	        if (X<60 && X>0) //第一列按钮的x坐标范围
	        {
	                if (Y>230 && Y<280) //按钮C的y坐标范围
	                {
	                         
	                        Serial.println ("Button Cancel");
	                        Number=Num1=Num2=0;
	                        result=false;
	                }
	                 
	                if (Y>180 && Y<230) //按钮1
	                {
	                         
	                        Serial.println ("Button 1");
	                        if (Number==0)
	                        Number=1;
	                        else
	                        Number = (Number*10) + 1; //按两次
	                }
	                 
	                if (Y>130 && Y<180) //按钮4
	                {
	                         
	                        Serial.println ("Button 4");
	                        if (Number==0)
	                        Number=4;
	                        else
	                        Number = (Number*10) + 4; //按两次
	                }
	                 
	                if (Y>80 && Y<130) //按钮7
	                {
	                         
	                        Serial.println ("Button 7");
	                        if (Number==0)
	                        Number=7;
	                        else
	                        Number = (Number*10) + 7;
	                }
	        }
	        if (X<115 && X>65) //第二列
	        {
	                if (Y>230 && Y<280)//按钮0
	                {
	                         
	                        Serial.println ("Button 0");
	                        if (Number==0)
	                        Number=0;
	                        else
	                        Number = (Number*10) + 0;
	                }
	                 
	                if (Y>180 && Y<230)//按钮2
	                {
	                         
	                        Serial.println ("Button 2");
	                        if (Number==0)
	                        Number=2;
	                        else
	                        Number = (Number*10) + 2;
	                }
	                 
	                if (Y>130 && Y<180)//按钮5
	                {
	                         
	                        Serial.println ("Button 5");
	                        if (Number==0)
	                        Number=5;
	                        else
	                        Number = (Number*10) + 5;
	                }
	                 
	                if (Y>80 && Y<130)
	                {
	                         
	                        Serial.println ("Button 8");
	                        if (Number==0)
	                        Number=8;
	                        else
	                        Number = (Number*10) + 8;
	                }
	        }
	        if (X<170 && X>120) //第三列
	        {
	                if (Y>230 && Y<280)
	                {
	                         
	                        Serial.println ("Button Equal");
	                        Num2=Number;
	                        result = true;
	                }
	                 
	                if (Y>180 && Y<230)
	                {
	                         
	                        Serial.println ("Button 3");
	                        if (Number==0)
	                        Number=3;
	                        else
	                        Number = (Number*10) + 3;
	                }
	                 
	                if (Y>130 && Y<180)
	                {
	                         
	                        Serial.println ("Button 6");
	                        if (Number==0)
	                        Number=6;
	                        else
	                        Number = (Number*10) + 6;
	                }
	                 
	                if (Y>80 && Y<130)
	                {
	                         
	                        Serial.println ("Button 9");
	                        if (Number==0)
	                        Number=9;
	                        else
	                        Number = (Number*10) + 9;
	                }
	        }
	        if (X<225 && X>175) //第四列
	        {
	                Num1 = Number;
	                Number =0;
	                tft.setCursor(200, 20);
	                tft.setTextColor(WHITE);
	                if (Y>230 && Y<280)
	                {
	                         
	                        Serial.println ("Addition");
	                        action = 1;
	                        tft.println('+');
	                }
	                if (Y>180 && Y<230)
	                {
	                         
	                        Serial.println ("Subtraction");
	                        action = 2;
	                        tft.println('-');
	                }
	                if (Y>130 && Y<180)
	                {
	                         
	                        Serial.println ("Multiplication");
	                        action = 3;
	                        tft.println('*');
	                }
	                if (Y>80 && Y<130)
	                {
	                         
	                        Serial.println ("Devesion");
	                        action = 4;
	                        tft.println('/');
	                }
	                delay(300);
	        }
	}
	void CalculateResult() // 此函数计算结果
	{
	        switch(action)
	        {
	                case 1:
	                Number = Num1+Num2;
	                break;
	                case 2:
	                Number = Num1-Num2;
	                break;
	                case 3:
	                Number = Num1*Num2;
	                break;
	                case 4:
	                Number = Num1/Num2;
	                break;
	        }
	}
	void DisplayResult() //此函数显示计算结果
	{
	        tft.fillRect(0, 0, 240, 80, RED);  //清除输入框
	        tft.setCursor(10, 20);
	        tft.setTextSize(4);
	        tft.setTextColor(WHITE);
	        tft.println(Number); //显示结果
	}
	void initScreen()
	{
	        tft.setCursor (55, 100);
	        tft.setTextSize (3);
	        tft.setTextColor(RED);
	        tft.println("LingZhi");
	        tft.setCursor (30, 180);
	        tft.println("Calculator");
	        delay(1800);
	}
	void draw_BoxNButtons() //此函数画出布局
	{
	         
	        tft.fillRect(0, 0, 240, 80, RED); //输入框
	         
	        for (int a=200; a>=80; a-=60) //第一列和第三列
	        {
	                tft.fillRect  (0,a,60,60,WHITE);
	                tft.fillRect  (120,a,60,60,WHITE);
	        }
	        tft.fillRect  (0,260,60,60,BLUE);
	        tft.fillRect  (120,260,60,60,GREEN);
	         
	        for (int b=260; b>=80; b-=60) //第二列和第四列
	        {
	                tft.fillRect  (60,b,60,60,WHITE);
	                tft.fillRect  (180,b,60,60,YELLOW);
	        }
	         
	        for (int h=80; h<=320; h+=60) //画横线
	        tft.drawFastHLine(0, h, 240, BLACK);
	         
	        for (int v=0; v<=240; v+=60) //画竖线
	        tft.drawFastVLine(v, 80, 240, BLACK);
	         
	        for (int j=0;j<4;j++) //显示按钮标签
	        {
	                for (int i=0;i<4;i++) {
	                        tft.setCursor(22 + (60*i), 100 + (60*j));
	                        tft.setTextSize(3);
	                        tft.setTextColor(BLACK);
	                        tft.println(symbol[j][i]);
	                }
	        }
	}					
						

然后点击验证,通过后再点击上传,将程序上传到零知标准板中。

库文件可在零知IDE库管理器下载或点击下载:TFTLCD.zip(点击下载)