找回密码
 注册

QQ登录

只需一步,快速开始

搜索

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

[复制链接]
路漫漫 发表于 2020-5-20 22:20:00 | 显示全部楼层 |阅读模式
本实验代码,开机的时候先通过LCD ID检测是电容屏(ALIENTEK 4.3寸/7寸电容触摸屏)还是电阻屏(ALIENTEK 2.4/2.8/3.5寸电阻屏),然后进入相关的测试。如果是电阻屏,则通过24C02的数据判断触摸屏是否已经校准过,如果没有校准,则执行校准程序,校准过后再进入手写程序。如果已经校准了,就直接进入手写程序,此时可以通过按动屏幕来实现手写输入。屏幕上会有一个清空的操作区域(RST),点击这个地方就会将输入全部清除,恢复白板状态。程序会设置一个强制校准,就是通过按KEY0来实现,只要按下KEY0就会进入强制校准程序。
如果是电容屏,则直接进入手写测试程序,电容触摸屏支持ALIENTEK 4.3寸/新款(SSD1963驱动版本)7寸TFTLCD模块,支持5点触摸。电容触摸屏不需要校准,其他操作同电阻触摸屏的测试。
电阻屏校准方法:
        1,下载本代码。
        2,按KEY0。
        3,依次点击屏幕上的4个十字架(十字+小圈圈)的最中央(最好用笔尖)
        4,直到屏幕提示:"Touch Screen Adjust OK!"字样。
        5,校准完成。该程序是论坛某位大佬的,不过是F4的。稍加修改,适用于F103系列(2.8寸触摸屏)。
完整源码: 触摸屏虚拟按键程序.7z (246.82 KB)
部分源程序如下
  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. }

复制代码


露月弓 发表于 2023-4-10 11:10:49 | 显示全部楼层
和正点原子官方的触摸屏显示一模一样,跑完了就只有个rst,根本没有虚拟按键

补充内容 (2023-4-10 16:52):
不好意思,弄错了,这个就是虚拟按键,是我的问题,我没看清楚
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-27 07:37

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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