请选择 进入手机版 | 继续访问电脑版
凡是官网购买产品,均可以获得积分,(积分可以用来下载技术资料)还可以获得精致技术支持。零知实验室可提供全套电子方案定制服务,了解详情请咨询客服。           
查看: 1301|回复: 7

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

[复制链接]
发表于 2019-8-14 14:34:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 零知小技术 于 2019-12-30 15:35 编辑

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

一、工具原料
零知增强板
2.4寸直插式TFT屏

二、硬件连接
零知标准板的引脚和增强板的引脚是可以对应上的,我们只需要对好引脚,将直插式TFT屏按下图所示直接插上增强板即可。
QQ图片20190814113848.jpg

三、工程代码
打开零知开发工具,新建一个项目,输入以下代码:
[C] 纯文本查看 复制代码
/**********************************************************

*    文件: 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 (340.54 KB, 下载次数: 6)
回复

使用道具 举报

 楼主| 发表于 2019-8-14 14:37:17 | 显示全部楼层
回复

使用道具 举报

发表于 2019-9-18 20:24:32 | 显示全部楼层
请提供一下下载链接,谢谢!
回复

使用道具 举报

发表于 2019-9-18 23:19:40 来自手机 | 显示全部楼层
sa18591917652 发表于 2019-9-18 20:24
请提供一下下载链接,谢谢!

哪个下载链接呢?
回复

使用道具 举报

发表于 2019-9-19 07:02:50 | 显示全部楼层
零知开源/项目篇/零知开源小项目-TFT LCD显示屏制作简易计算器,库中找不到,请提供详细链接
回复

使用道具 举报

发表于 2019-9-19 09:17:55 | 显示全部楼层
sa18591917652 发表于 2019-9-19 07:02
零知开源/项目篇/零知开源小项目-TFT LCD显示屏制作简易计算器,库中找不到,请提供详细链接 ...

库在零知开发工具的库管理器中下载,本项目示例需要把上面代码复制到开发工具中仅验证运行
回复

使用道具 举报

发表于 2020-1-16 21:27:36 | 显示全部楼层
我的管脚不对,如何在头文件里修改
回复

使用道具 举报

发表于 2020-2-11 14:15:20 | 显示全部楼层
这个兼容UNO板吗 ?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版| 小黑屋| 零知实验室 ( 粤ICP备17040594号-3 )

GMT+8, 2020-2-25 21:05 , Processed in 0.067273 second(s), 18 queries .

快速回复 返回顶部 返回列表