发新帖

STM32F407驱动触摸屏 虚拟按键控制LED灯源程序 带拼音九键

[复制链接]
3917 2

本文包含源代码、原理图、PCB、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近因为一些需要,需要用到触摸屏控制,作为一个小白,看着例程里面的拼音九键那么多程序,看着都害怕(静下来懂了之后其实不难),可是又必须迈过这道坎,来论坛搜了一下相关的资料,好多相关的都是17年之前的了,大多数也都是基于F1的,相信很多初学者和我一样,可能虽然只是移植,也会出现各种问题。无赖之下,又回过头去啃例程,经过一番折腾,也搞懂了,想着可能也许有网友可能用的上,就在例程上面精简了一下,并做了部分的改动。 需要注意的是,板子是自己做的,所以的LED与开发板是不同的,记得修改IO口。
硬件基础:STM32F407  4.3寸电容屏  程序实现的功能是  横屏显示
(1)当按下LED1 时绿灯亮;
(2)当按下LED2 时绿灯亮;
(3)当按下LED_ON 时两灯亮;
(4)当按下LED_OFF时两灯熄;
同时,因为源程序中有一部分被注释掉,所以按键按下后的状态就被会被记录下来。此程序仅仅只是用于起个引导作用,不是什么高端的操作。作为一个潜水党,也想为论坛的发展贡献一点微薄之力哈哈哈,不喜勿喷。
双手奉上整个工程文件。


制作出来的实物图如下:
005133vphhqwjzemfwqzqj.png
005138e2884lxbnl5rxanl.jpg
005143m491q8uelqqj7twg.png
005148fjalq799jibm8mta.png
005153xl6ggvw2bvavlyf6.jpg

STM32单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"  
  3. #include "usart.h"   
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "key.h"  
  7. #include "touch.h"
  8. #include "string.h"
  9.   
  10. //加载键盘控制界面
  11. //x,y:界面起始坐标
  12. void py_load_ui(u16 x,u16 y)
  13. {
  14.         POINT_COLOR=RED;
  15.         LCD_DrawRectangle(x,y,x+300,y+200);                                                   
  16.         LCD_DrawLine(x,y+100,x+300,y+100);
  17.         LCD_DrawLine(x+150,y,x+150,y+200);
  18.         LCD_Fill(x+2,y+2,x+148,y+98,WHITE);//控制LED1
  19.         LCD_Fill(x+152,y+2,x+298,y+98,WHITE);//控制LED2
  20.         LCD_Fill(x+2,y+102,x+148,y+198,WHITE);//控制LED1 LED2 开
  21.         LCD_Fill(x+152,y+102,x+298,y+198,WHITE);//控制LED1 LED2 关
  22.         POINT_COLOR=BLACK;
  23.         LCD_ShowString(x+51,y+38,lcddev.width,lcddev.height,24,"LED1");
  24.         LCD_ShowString(x+201,y+38,lcddev.width,lcddev.height,24,"LED2");
  25.         LCD_ShowString(x+39,y+138,lcddev.width,lcddev.height,24,"LED_ON");
  26.         LCD_ShowString(x+183,y+138,lcddev.width,lcddev.height,24,"LED_OFF");                                                              
  27. }
  28. //按键状态设置
  29. //x,y:键盘坐标
  30. //key:键值(0~8)
  31. //sta:状态,0,松开;1,按下;
  32. void py_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
  33. {                  
  34.         u16 i=keyx/2,j=keyx%2;
  35.         if(keyx>8)return;
  36.         if(sta)LCD_Fill(x+j*150+1,y+i*100+1,x+j*150+149,y+i*100+99,GREEN);
  37.         else LCD_Fill(x+j*150+1,y+i*100+1,x+j*150+149,y+i*100+99,WHITE);
  38.         POINT_COLOR=BLACK;
  39.         LCD_ShowString(x+51,y+38,lcddev.width,lcddev.height,24,"LED1");
  40.         LCD_ShowString(x+201,y+38,lcddev.width,lcddev.height,24,"LED2");
  41.         LCD_ShowString(x+39,y+138,lcddev.width,lcddev.height,24,"LED_ON");
  42.         LCD_ShowString(x+183,y+138,lcddev.width,lcddev.height,24,"LED_OFF");
  43. }
  44. //得到触摸屏的输入
  45. //x,y:键盘坐标
  46. //返回值:按键键值(1~9有效;0,无效)
  47. u8 py_get_keynum(u16 x,u16 y)
  48. {
  49.         u16 i,j;
  50.         static u8 key_x=0;//0,没有任何按键按下;1~4,1~4号按键按下
  51.         u8 key=0;
  52.         tp_dev.scan(0);                  
  53.         if(tp_dev.sta&TP_PRES_DOWN)                        //触摸屏被按下
  54.         {        
  55.                 for(i=0;i<2;i++)
  56.                 {
  57.                         for(j=0;j<2;j++)
  58.                         {
  59.                                  if(tp_dev.x[0]<(x+j*150+150)&&tp_dev.x[0]>(x+j*150)&&tp_dev.y[0]<(y+i*100+100)&&tp_dev.y[0]>(y+i*100))
  60.                                 {        
  61.                                         key=i*2+j+1;         
  62.                                         break;                           
  63.                                 }
  64.                         }
  65.                         if(key)
  66.                         {           
  67.                                 if(key_x==key)key=0;
  68.                                 else
  69.                                 {
  70.                                         py_key_staset(x,y,key_x-1,0);
  71.                                         key_x=key;
  72.                                         py_key_staset(x,y,key_x-1,1);
  73.                                 }
  74.                                 break;
  75.                         }
  76.                 }  
  77.         }
  78.         //如果要记录按下后的状态 这句话需要被注释掉
  79. //        else if(key_x)
  80. //        {
  81. //                py_key_staset(x,y,key_x-1,0);
  82. //                key_x=0;
  83. //        }
  84.         return key;
  85. }
  86. int main(void)
  87. {         
  88.         u8 key;
  89.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  90.         delay_init(168);  //初始化延时函数
  91.         uart_init(115200);                //初始化串口波特率为115200
  92.         
  93.         LED_Init();                                        //初始化LED
  94.          LCD_Init();                                        //LCD初始化  
  95.          KEY_Init();                                        //按键初始化
  96.         tp_dev.init();                                //初始化触摸屏
  97.         LCD_ShowString(328,72,lcddev.width,lcddev.height,16,"LED CONTROL SYSTEM");
  98.         py_load_ui(250,140);               
  99.         while(1)
  100.         {
  101.                 delay_ms(10);
  102.                 key=py_get_keynum(250,140);
  103.                 switch(key)
  104.                 {
  105.                         case 1 :LED0=!LED0;break;
  106.                         case 2 :LED1=!LED1;break;
  107.                         case 3 :GPIO_ResetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5);break;
  108.                         case 4 :GPIO_SetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5);break;
  109.                 }
  110.                 //可以用来控制开关机等
  111. //                key=KEY_Scan(0);
  112. //                if(key==KEY2_PRES)//KEY2按下
  113. //                {
  114. //                }  
  115.         }                                                                                                                       
  116. }
复制代码
所有资料MCU智学网提供下载:
MCU智学网_虚拟按键控制LED.7z (354.19 KB, 下载次数: 2)

精彩评论2

七井 手机认证  初级工程师  发表于 2019-11-6 16:53:42 | 显示全部楼层
谢谢楼主分享,学习了。正愁UI怎么实现呢
随风不留痕 手机认证  初级工程师  发表于 2019-11-12 12:43:47 | 显示全部楼层
感谢分享,学习了!
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

更多

客服中心

微信扫描二维码 服务时间:周一至周日 8:30-22:00
快速回复 返回顶部 返回列表