OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8292|回复: 11

触摸屏模拟eMwin开关灯实验

[复制链接]

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
发表于 2018-8-15 11:46:55 | 显示全部楼层 |阅读模式
实验环境:战舰V3+4.3寸触摸屏
实验效果:通过修改原子哥的TFT触摸实验,简单实现模拟GUI按键开关灯
实验过程:
   1:对原子哥当中的画圆函数,进行修改,实现模拟填充圆形,任意颜色更换,模拟红绿灯
[mw_shl_code=c,true]//画实心圆
void LCD_Point(u16 x,u16 y,u16 color)
{
        LCD_SetCursor(x,y);                //éèÖÃ1a±êλÖÃ
        LCD_WriteRAM_Prepare();        //¿aê¼D′èëGRAM
        LCD->LCD_RAM=color;
}
void LCD_Circle(u16 x0,u16 y0,u16 color,u8 r)
{
        int a,b;
        int di;
        a=0;b=r;          
        di=3-(r<<1);             //&#197;D&#182;&#207;&#207;&#194;&#184;&#246;μ&#227;&#206;&#187;&#214;&#195;μ&#196;±ê&#214;&#190;
        while(a<=b)
        {
                LCD_Point(x0+a,y0-b,color);             //5
                LCD_Point(x0+b,y0-a,color);             //0
                LCD_Point(x0+b,y0+a,color);             //4               
                LCD_Point(x0+a,y0+b,color);             //6
                LCD_Point(x0-a,y0+b,color);             //1      
                LCD_Point(x0-b,y0+a,color);             //3
                LCD_Point(x0-a,y0-b,color);             //2            
                LCD_Point(x0-b,y0-a,color);             //7                     
                a++;
                //ê1ó&#195;Bresenham&#203;&#227;·¨&#187;-&#212;2     
                if(di<0)di +=4*a+6;          
                else
                {
                        di+=10+4*(a-b);   
                        b--;
                }                                                     
        }
} [/mw_shl_code]   2:对原子哥的画线函数进行修改,实现读取按下坐标,实现模拟按键
[mw_shl_code=c,true]if((tp_dev.x[t]>210)&&(tp_dev.x[t]<410)){
                                               
                                               
                                                        if((tp_dev.y[t]>250)&&(tp_dev.y[t]<350)){//&#212;ú°′&#188;üLED1μ&#196;×&#248;±ê·&#182;&#206;§&#196;ú
                                                                        l0=~l0;
                                                                  if(l0)
                                                                                for(i=0;i<50;i++)LCD_Circle(100,300,RED,i);                                        //&#187;-&#212;2
                                                                  else
                                                                                for(i=0;i<50;i++)LCD_Circle(100,300,GREEN,i);                                        //&#187;-&#212;2       
                                                                       
                                                        }else if((tp_dev.y[t]>550)&&(tp_dev.y[t]<650)){//&#212;ú°′&#188;üLED2μ&#196;×&#248;±ê·&#182;&#206;§&#196;ú
                                                                  l1=~l1;
                                                                        if(l1)
                                                                                for(i=0;i<50;i++)LCD_Circle(100,600,RED,i);
                                                                        else       
                                                                                for(i=0;i<50;i++)LCD_Circle(100,600,GREEN,i);
                                                        }
                                                       
                                        }[/mw_shl_code]
具体实现函数 可以参考附录下的例程
不足:按键暂时还未实现类似硬件按键的消抖,还在更改中。圆形填充并不是很完美,只是简单的实现,具体的算法网上有提到过类似setfillstyle() and floodfill() 填充法,一些资料找起来比较麻烦,暂时还没有找到完整的。。详细的可以看附件中的源码,其它有需要改进的地方,大家可以提出来,可以互相学习,共同进步。
附参考网站: 画圆:https://en.wikipedia.org/wiki/Midpoint_circle_algorithm  
                   填充:https://www.geeksforgeeks.org/setfillstyle-floodfill-c/   
附件: 1.jpg 开关灯.rar (1.54 MB, 下载次数: 167)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
 楼主| 发表于 2018-8-15 11:50:42 | 显示全部楼层
本帖最后由 sodermalm 于 2018-8-15 11:54 编辑

忘了说了,按键的实现原理是:先画一个按键的矩形框 LCD_DrawRectangle(210, 250, 410, 350);        //LED1按键矩形款,这样也就得到了这个按键的坐标范围,X坐标在210~410,Y坐标在250~350之间,所以我们读取到我们触摸下去的坐标  X轴---->tp_dev.x[t]  Y轴---->tp_dev.y[t],判断读取的坐标是否在这个坐标范围内,是的话,也就表示按键被触摸到了,实现开关灯了。                  if((tp_dev.x[t]>210)&&(tp_dev.x[t]<410)){                                               
                                                if((tp_dev.y[t]>250)&&(tp_dev.y[t]<350)){
                                                        l0=~l0;
                                                        if(l0)
                                                           for(i=0;i<50;i++)LCD_Circle(100,300,RED,i);
                                                       else
                                                          for(i=0;i<50;i++)LCD_Circle(100,300,GREEN,i);                                       
                                                }               
                      }

回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2018-8-15 12:07:02 | 显示全部楼层
不错,顶一个
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
 楼主| 发表于 2018-8-16 15:52:47 | 显示全部楼层

      谢谢!!!
回复 支持 反对

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
发表于 2018-8-16 16:21:14 | 显示全部楼层
顶一个,多谢分享
回复 支持 反对

使用道具 举报

10

主题

232

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2269
金钱
2269
注册时间
2012-8-24
在线时间
246 小时
发表于 2018-11-15 11:02:44 | 显示全部楼层
不错,顶起
单片机技术交流请加127034610
回复 支持 反对

使用道具 举报

5

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2011-2-1
在线时间
8 小时
发表于 2019-2-18 07:46:00 | 显示全部楼层
谢谢加油
回复 支持 反对

使用道具 举报

0

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2019-4-15
在线时间
39 小时
发表于 2019-4-26 10:12:32 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2018-11-27
在线时间
90 小时
发表于 2019-5-19 12:56:00 | 显示全部楼层
顶。。。。。。。。
回复 支持 反对

使用道具 举报

4

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-12-14
在线时间
15 小时
发表于 2019-5-24 08:26:06 | 显示全部楼层
楼主的分享很有借鉴意义。最近想做一个用虚拟按键选中参数,然后用实体按键对选中的参数进行增大或减小修改。不知楼主是否做过类似的。
回复 支持 反对

使用道具 举报

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2019-6-28
在线时间
27 小时
发表于 2019-6-30 22:13:54 | 显示全部楼层
谢谢楼主分享,另外请教下 我第一次接触F4及触摸屏  现在也要做界面显示控制这方面开发 能给一个快速入门的建议吗
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2020-10-11
在线时间
24 小时
发表于 2021-7-18 21:29:24 | 显示全部楼层
多谢大神开源
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 22:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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