之前零知增强板上没有直插式TFT LCD屏的库,现在已将对应的库移植到了增强板上,相关的库文件可以再零知IDE的库管理界面下载,现在我们就用零知增强板和TFT LCD屏来制作一个简易的计算器。
零知增强板(点击购买)
2.4寸直插式TFT屏(点击购买)
零知标准板的引脚和增强板的引脚是可以对应上的,我们只需要对好引脚,将直插式TFT屏按下图所示直接插上增强板即可。
/**********************************************************
* 文件: 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(点击下载)