找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8244|回复: 10
收起左侧

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

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

制作出来的实物图如下:
开机界面.png LED1开.jpg LED2开.png 两个LED开.png 两个LED关.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. }
复制代码

所有资料51hei提供下载:
虚拟按键 控制LED.7z (354.19 KB, 下载次数: 228)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:521481 发表于 2019-4-25 16:25 | 显示全部楼层
很不错,参考一下
回复

使用道具 举报

ID:486936 发表于 2019-5-14 08:57 | 显示全部楼层
请问如果用STC89C52可以吗?有什么需要注意的地方吗??
回复

使用道具 举报

ID:416208 发表于 2019-7-3 11:38 | 显示全部楼层
用在F103上需要注意哪些地方,修改那些地方,
回复

使用道具 举报

ID:416208 发表于 2019-7-3 13:56 | 显示全部楼层
如果是F103需要修改那些地方
回复

使用道具 举报

ID:662900 发表于 2019-12-16 08:26 来自手机 | 显示全部楼层
你好,请问程序中“sting.h”这个什么头文件
回复

使用道具 举报

ID:676739 发表于 2019-12-29 16:55 | 显示全部楼层
十分感谢,参考一下
回复

使用道具 举报

ID:921528 发表于 2021-5-15 02:24 来自手机 | 显示全部楼层
楼主优秀,参考一下
回复

使用道具 举报

ID:921528 发表于 2021-5-15 02:25 来自手机 | 显示全部楼层
wyl2937808789 发表于 2019-12-16 08:26
你好,请问程序中“sting.h”这个什么头文件

是string.h
回复

使用道具 举报

ID:899094 发表于 2021-5-18 15:28 | 显示全部楼层
关于触摸区域弄的头都大了
回复

使用道具 举报

ID:942056 发表于 2023-3-27 07:43 来自手机 | 显示全部楼层
谢谢大佬的奉献
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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