嵌入式开发—触摸屏模拟按键

一、项目简介

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

这里简单做了一下UI。

UI

二、实现内容

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

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;   // 清零计次变量
            }
	     }
	 }
}

猜你喜欢

转载自blog.csdn.net/qq_45217381/article/details/129196181