触摸屏模拟按键

简介: 该项目较为简单,功能需求是用触摸屏模拟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;   // 清零计次变量
            }
         }
     }
}
相关文章
|
5月前
|
Linux
GEC6818开发板触摸屏---点击屏幕获取触摸屏坐标
GEC6818开发板触摸屏---点击屏幕获取触摸屏坐标
day28-开发板触屏操作(2022.2.25)
day28-开发板触屏操作(2022.2.25)
|
Android开发 开发者
多点触控
多点触控
97 0
多点触控与多鼠标支持
原文:多点触控与多鼠标支持 多点触控与多鼠标支持   最进将工作流平台进行了升级,除了用WF4重新构建了后台,最大的改变就是全部图形化了用户界面 原计划在用户界面中全面启用多点触控技术,但发现多点触控的效果没有想象中的那么绚.
1085 0
|
C# Windows
触摸屏:屏幕键盘(虚拟键盘)解决方案
原文:触摸屏:屏幕键盘(虚拟键盘)解决方案  最近需要在win XP系统的工控机上进行程序的开发,工控机是电阻式触摸屏,需要在上面使用触摸键盘,使工控机可以脱离鼠标和键盘独立运行程序。调研后得到一系列的解决方案,mark如下: (1)自己在程序中开发虚拟键盘 这个是最先想到的,本人用C#进行开发,所以只关注C#相关的虚拟键盘开发。
2562 0
|
存储 Android开发 iOS开发