触摸屏模拟按键

简介: 该项目较为简单,功能需求是用触摸屏模拟20个按键,按下一次打开继电器,再次按下关闭继电器,最多可以同时打开三个,主页面能够显示总电流I。


🎀 文章作者:二土电子
🐸 期待大家一起学习交流!


一、项目简介

该项目较为简单,功能需求是用触摸屏模拟20个按键,按下一次打开继电器,再次按下关闭继电器,最多可以同时打开三个,主页面能够显示总电流。

这里简单做了一下UI。

f5ac12131d0badc9e3b9366e7834e2b3_ea52a3d46b0b403fa91d5cee2ba1cc3b.jpeg

二、实现内容

实现内容主要有以下内容:

1、按键GUI绘制;
2、按键按下一次开启,再次按下关闭;
3、最多同时开启三个;

三、程序实现

1、GUI绘制

初始GUI程序如下

void Gui_Init(void)   // 初始GUI
{
   
    u16 keyXYTemp = 0;   // 按键Y坐标循环变量

    Gui_Drawbmp16(10,3,gImage_qq);   // Logo显示
    LCD_DrawLine(20,60,300,60);   // 分割线

    // 键盘横线
    for (keyXYTemp = 110;keyXYTemp < 240;keyXYTemp += 60)
    {
   
        LCD_DrawLine(20,keyXYTemp,300,keyXYTemp);
    }
    // 键盘横线
    for (keyXYTemp = 20;keyXYTemp < 320;keyXYTemp += 70)
    {
   
        LCD_DrawLine(keyXYTemp,110,keyXYTemp,230);
    }

    // 显示第一排按键值
    LCD_ShowNum(48,125,1,1,24);
    LCD_ShowNum(118,125,2,1,24);
    LCD_ShowNum(188,125,3,1,24);
    LCD_ShowNum(258,125,4,1,24);
    // 显示第二排按键值
    LCD_ShowNum(48,185,5,1,24);
    LCD_ShowNum(118,185,6,1,24);
    LCD_ShowNum(188,185,7,1,24);
    LCD_ShowNum(258,185,8,1,24);

    LCD_ShowFontHZ(30,70,"当前总电流");

2、触摸按键检测

这里给出一个触摸检测的框架

    tp_dev.scan(0);          
    if(tp_dev.sta&TP_PRES_DOWN)            //触摸屏被按下
    {
       
        if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
        {
       
            // 按下按键1
            if(20<tp_dev.x[0]&&tp_dev.x[0]<90&&110<tp_dev.y[0]&&tp_dev.y[0]<170)
            {
   
                // 松手检测
                while(tp_dev.sta&TP_PRES_DOWN)
                {
   
                   tp_dev.scan(0);
                }
                // 执行相关代码
            }
        }
    }

在网上看到过其他博主的程序,对于触摸屏并没有添加松手检测,而是用了简单的延时,这在实际应用时很容易出问题,这里加入了松手检测,只有松开手才会执行按键对应的程序。

3、开启关闭控制

对于如何实现按下一次开启,再次按下关闭也非常简单,这里不做过多的语言描述,直接上程序

u8 gKey1PutCount = 0;   // 按键1按下计次变量

tp_dev.scan(0);          
if(tp_dev.sta&TP_PRES_DOWN)            //触摸屏被按下
{
   
    if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
    {
       
        // 按下按键1
        if(20<tp_dev.x[0]&&tp_dev.x[0]<90&&110<tp_dev.y[0]&&tp_dev.y[0]<170)
        {
   
            // 松手检测
            while(tp_dev.sta&TP_PRES_DOWN)
            {
   
                tp_dev.scan(0);
            }
            gKey1PutCount = gKey1PutCount + 1;   // 按下计次变量加1

            if (gKey1PutCount <= 1)
            {
   
                // 开启
            }
            if (gKey1PutCount >= 2)
            {
   
                // 关闭
                gKey1PutCount = 0;   // 清零计次变量
            }
         }
     }
}

4、开启上限

限制开启上限也很简单,只需要定义一个变量用来记录开启的个数,在准备开启下一个负载时会判断是否当前已经开启了三个,然后判断下一个是否要开启,程序如下

值得注意的是,当检测到当前开启数量已经达到三个时,需要将按键计次变量和负载开启数量减1。

u8 gLoadOpenNum = 0;   // 负载开启数量

u8 gKey1PutCount = 0;   // 按键1按下计次变量

tp_dev.scan(0);          
if(tp_dev.sta&TP_PRES_DOWN)            //触摸屏被按下
{
   
    if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
    {
       
        // 按下按键1
        if(20<tp_dev.x[0]&&tp_dev.x[0]<90&&110<tp_dev.y[0]&&tp_dev.y[0]<170)
        {
   
            // 松手检测
            while(tp_dev.sta&TP_PRES_DOWN)
            {
   
                tp_dev.scan(0);
            }
            gKey1PutCount = gKey1PutCount + 1;   // 按下计次变量加1

            if (gKey1PutCount <= 1)
            {
   
                gLoadOpenNum = gLoadOpenNum + 1;   // 开启负载数加1

                if (gLoadOpenNum > 3)   // 如果开启数量即将超过三个
                {
   
                    gKey1PutCount = gKey1PutCount - 1;   // 按下计次变量减1
                    gLoadOpenNum = gLoadOpenNum - 1;   // 开启负载数减1
                }
                else
                {
   
                    // 开启
                }
            }
            if (gKey1PutCount >= 2)
            {
   
                gLoadOpenNum = gLoadOpenNum - 1;   // 开启负载数减1
                // 关闭
                gKey1PutCount = 0;   // 清零计次变量
            }
         }
     }
}
相关文章
|
机器学习/深度学习
神经网络与深度学习---验证集(测试集)准确率高于训练集准确率的原因
神经网络与深度学习---验证集(测试集)准确率高于训练集准确率的原因
4662 2
|
1月前
|
人工智能 API 开发工具
Coding Plan百科:阿里云百炼Coding Plan订阅套餐介绍、购买链接及使用注意事项解析
阿里云百炼Coding Plan是面向AI编程的订阅制服务,开通百炼官网:https://t.aliyun.com/U/fPVHqY 现仅售Pro版(200元/月),限量抢购(每日9:30开售)。整合Qwen、Kimi、GLM等多模型,提供每月9万次请求额度,支持主流AI开发工具。开通百炼可免费领7000万Tokens。注意:Lite版已下架,首月优惠活动暂停,不支持退款。
1634 7
|
10月前
|
算法 搜索推荐 Java
拼多多与抖音电商 API 接口,哪个更适合带货?
在数字化营销时代,拼多多与抖音电商API成为带货关键工具。拼多多API集成简便,适合低价、团购型商品推广;抖音电商API则依托短视频与直播,实现高互动内容带货。本文对比两者功能、优势与适用场景,助你选择更高效带货方案。
346 0
|
7月前
|
SQL 存储 数据库
App Inventor 2 SQLite 拓展:超流行兼容主流SQL语法的迷你本地数据库引擎,支持事务
中文网开发的SQLite拓展基于开源项目,支持数据库创建、增删改查等操作,查询结果优化为标准二维列表,提供导入导出功能,适用于AppInventor开发,不支持中文库名表名。
475 0
|
存储 缓存 前端开发
聊聊公众号联动扫码登录功能如何实现
【10月更文挑战第30天】公众号联动扫码登录功能的实现涉及前端、后端与微信平台的交互。前端设计二维码展示区和轮询机制,后端负责生成二维码、处理微信推送、用户身份验证及登录。整个过程需确保数据交互安全顺畅,提升用户体验。
592 1
|
存储 SQL 机器学习/深度学习
MySQL高级篇——索引、视图、存储过程和函数、触发器的相关概念及操作(上)
MySQL高级篇——索引、视图、存储过程和函数、触发器的相关概念及操作(上)
MySQL高级篇——索引、视图、存储过程和函数、触发器的相关概念及操作(上)
|
索引 Python
%g是什么
`%g` 是 Python 字符串格式化中的一种格式说明符,用于表示浮点数或整数,能自动选择最合适的表示法。当数值为整数时,它显示整数;当数值较大或含小数时,它选择科学记数法或小数点记数法,并去掉无用的零。例如:
2204 1
JSTL组件的下载链接地址
这篇文章提供了JSTL(JavaServer Pages Standard Tag Library)组件的下载链接地址,并指导如何配置JSTL到web应用程序的WEB-INF/lib目录下。
凭借左程云(左神)的这份 “程序员代码面试指南”我入职了字节
左程云,本科就读于华中科技大学、硕士毕业于在芝加哥大学。先后在IBM、百度、GrowingIO和亚马逊工作,是一个刷题7年的算法爱好者,也是马士兵教育的算法授课老师。2014年起专职做程序员算法和数据结构培训,代码面试培训,刷题交流等相关工作。
|
Java 数据库 容器
J2EE的体系架构
J2EE是Java2平台企业版(Java 2 Platform,Enterprise Edition),它的核心是一组技术规范与指南,提供基于组件的方式来设计、开发、组装和部署企业应用。J2EE使用多层分布式的应用模型。
2952 0