找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5175|回复: 2
打印 上一主题 下一主题
收起左侧

STM32虚拟按键触摸屏实验程序

[复制链接]
跳转到指定楼层
楼主
ID:517510 发表于 2020-5-9 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
该程序是论坛某位大佬的,不过是F4的。稍加修改,适用于F103系列(2.8寸触摸屏)。

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"         
  7. #include "24cxx.h"
  8. #include "w25qxx.h"
  9. #include "touch.h"

  10. //两个数之差的绝对值
  11. //x1,x2:需取差值的两个数
  12. //返回值:|x1-x2|
  13. u16 my_abs(u16 x1,u16 x2)
  14. {                         
  15.         if(x1>x2)return x1-x2;
  16.         else return x2-x1;
  17. }  
  18. ////////////////////////////////////////////////////////////////////////////////
  19. //5个触控点的颜色                                                                                                 
  20. const u16 POINT_COLOR_TBL[CT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};  
  21. //电阻触摸屏测试函数

  22. /*void rtp_test(void)
  23. {
  24.         u8 key;
  25.         u8 i=0;          
  26.         while(1)
  27.         {
  28.                  key=KEY_Scan(0);
  29.                 tp_dev.scan(0);                  
  30.                 if(tp_dev.sta&TP_PRES_DOWN)                        //触摸屏被按下
  31.                 {       
  32.                          if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
  33.                         {       
  34.                                 if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog();//清除
  35.                                 else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED);                //画图                                    
  36.                         }
  37.                 }else delay_ms(10);        //没有按键按下的时候             
  38.                 if(key==KEY0_PRES)        //KEY0按下,则执行校准程序
  39.                 {
  40.                         LCD_Clear(WHITE);//清屏
  41.                     TP_Adjust();          //屏幕校准  
  42.                         Load_Drow_Dialog();
  43.                 }
  44.                 i++;
  45.                 if(i%20==0)LED0=!LED0;
  46.         }
  47. }*/
  48. //加载键盘控制界面
  49. //x,y:界面起始坐标
  50. //py_load_ui(0,0)
  51. void py_load_ui(u16 x,u16 y)
  52. {
  53.         POINT_COLOR=RED;
  54.         LCD_DrawRectangle(x,y,x+240,y+200);                                                  
  55.         LCD_DrawLine(x,y+100,x+240,y+100);
  56.         LCD_DrawLine(x+120,y,x+120,y+200);
  57.         LCD_Fill(x+2,y+2,x+118,y+98,WHITE);//控制LED1
  58.         LCD_Fill(x+122,y+2,x+238,y+98,WHITE);//控制LED2
  59.         LCD_Fill(x+2,y+102,x+118,y+198,WHITE);//控制LED1 LED2 开
  60.         LCD_Fill(x+122,y+102,x+238,y+198,WHITE);//控制LED1 LED2 关
  61.         POINT_COLOR=BLACK;
  62.         LCD_ShowString(x+39,y+38,lcddev.width,lcddev.height,24,"LED1");
  63.         LCD_ShowString(x+153,y+38,lcddev.width,lcddev.height,24,"LED2");
  64.         LCD_ShowString(x+39,y+138,lcddev.width,lcddev.height,24,"LED_ON");
  65.         LCD_ShowString(x+153,y+138,lcddev.width,lcddev.height,24,"LED_OFF");                                                            
  66. }
  67. //按键状态设置
  68. //x,y:键盘坐标
  69. //key:键值(0~8)
  70. //sta:状态,0,松开;1,按下;
  71. void py_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
  72. {                  
  73.         u16 i=keyx/2,j=keyx%2;
  74.         if(keyx>8)return;
  75.        
  76.         if(sta)
  77.                                         LCD_Fill(x+j*120+1,y+i*100+1,x+j*120+119,y+i*100+99,GREEN);//按键按下
  78.         else
  79.                                         LCD_Fill(x+j*120+1,y+i*100+1,x+j*120+119,y+i*100+99,WHITE);
  80.                                         POINT_COLOR=BLACK;
  81.         LCD_ShowString(x+39,y+38,lcddev.width,lcddev.height,24,"LED1");
  82.         LCD_ShowString(x+153,y+38,lcddev.width,lcddev.height,24,"LED2");
  83.         LCD_ShowString(x+39,y+138,lcddev.width,lcddev.height,24,"LED_ON");
  84.         LCD_ShowString(x+153,y+138,lcddev.width,lcddev.height,24,"LED_OFF");
  85. }
  86. //得到触摸屏的输入
  87. //x,y:键盘坐标
  88. //返回值:按键键值(1~9有效;0,无效)
  89. //key=py_get_keynum(250,140);  640*320
  90. u8 py_get_keynum(u16 x,u16 y)
  91. {
  92.         u16 i,j;
  93.         static u8 key_x=0;//0,没有任何按键按下;1~4,1~4号按键按下
  94.         u8 key=0;
  95.         tp_dev.scan(0);      //屏幕扫描            
  96.         if(tp_dev.sta&TP_PRES_DOWN)      //触摸屏被按下
  97.         {      
  98.                 for(i=0;i<2;i++)
  99.                 {
  100.                         for(j=0;j<2;j++)
  101.                         {
  102.                                  if(tp_dev.x[0]<(x+j*120+120)&&tp_dev.x[0]>(x+j*120)&&tp_dev.y[0]<(y+i*100+100)&&tp_dev.y[0]>(y+i*100))
  103.                                 {      
  104.                                         key=i*2+j+1;         
  105.                                         break;                           
  106.                                 }
  107.                         }
  108.                         if(key)
  109.                         {         
  110.                                 if(key_x==key)key=0;
  111.                                 else
  112.                                 {
  113.                                         py_key_staset(x,y,key_x-1,0);
  114.                                         key_x=key;
  115.                                         py_key_staset(x,y,key_x-1,1);
  116.                                 }
  117.                                 break;
  118.                         }
  119.                 }  
  120.         }
  121.       
  122.         else if(key_x) //如果要记录按下后的状态 这句话需要被注释掉
  123.         {
  124.                 py_key_staset(x,y,key_x-1,0);
  125.                 key_x=0;
  126.         }
  127.         return key;
  128. }
  129. /*
  130.         tp_dev.init();
  131.            LCD_ShowString(60,130,200,16,16,"Press KEY0 to Adjust");       
  132.            if(tp_dev.touchtype!=0XFF)LCD_ShowString(60,130,200,16,16,"Press KEY0 to Adjust");//电阻屏才显示
  133.                 delay_ms(1500);
  134.                 Load_Drow_Dialog();                
  135.                 if(tp_dev.touchtype&0X80);        //电容屏测试
  136.                 else rtp_test();                                                 //电阻屏测试
  137. }*/
  138. int main(void)
  139. {
  140.               u8 key;
  141.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  142.         delay_init();  //初始化延时函数
  143.         uart_init(115200);                //初始化串口波特率为115200
  144.                     
  145.         LED_Init();                                        //初始化LED
  146.         LCD_Init();                                        //LCD初始化  
  147.         KEY_Init();      
  148.         tp_dev.init();                                //初始化触摸屏
  149.                                 TP_Adjust();          //屏幕校准
  150.         LCD_ShowString(120,72,lcddev.width,lcddev.height,16,"LED CONTROL SYSTEM");
  151.         py_load_ui(0,0);               
  152.         while(1)
  153.         {
  154.                 delay_ms(10);
  155.                 key=py_get_keynum(0,0);
  156.                 switch(key)
  157.                 {
  158.                         case 1 :LED0=!LED0;break;
  159.                         case 2 :LED1=!LED1;break;
  160.                         case 3 :LED0=LED1=1;break;/*GPIO_ResetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5)*/
  161.                         case 4 :LED0=LED1=0;break;/*GPIO_SetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5);break;*/
  162.                 }
  163.                 //可以用来控制开关机等
  164. //                key=KEY_Scan(0);
  165. //                if(key==KEY2_PRES)//KEY2按下
  166. //                {

  167. //                }  
  168.         }                                                                                                                     
  169. }
复制代码

所有资料51hei提供下载:
触摸屏虚拟按键程序.7z (246.82 KB, 下载次数: 93)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:921528 发表于 2021-5-15 02:23 来自手机 | 只看该作者
见过相同的帖子
回复

使用道具 举报

板凳
ID:899094 发表于 2021-5-17 22:20 | 只看该作者
学到了一种新的代码写法
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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