🎀 文章作者:二土电子
🐸 期待大家一起学习交流!
一、项目简介
该项目较为简单,功能需求是用触摸屏模拟20个按键,按下一次打开继电器,再次按下关闭继电器,最多可以同时打开三个,主页面能够显示总电流。
这里简单做了一下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; // 清零计次变量
}
}
}
}