找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6032|回復(fù): 2
收起左側(cè)

STM32虛擬按鍵觸摸屏實(shí)驗(yàn)程序

[復(fù)制鏈接]
ID:517510 發(fā)表于 2020-5-9 16:30 | 顯示全部樓層 |閱讀模式
該程序是論壇某位大佬的,不過(guò)是F4的。稍加修改,適用于F103系列(2.8寸觸摸屏)。

單片機(jī)源程序如下:
  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. //兩個(gè)數(shù)之差的絕對(duì)值
  11. //x1,x2:需取差值的兩個(gè)數(shù)
  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個(gè)觸控點(diǎn)的顏色                                                                                                 
  20. const u16 POINT_COLOR_TBL[CT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};  
  21. //電阻觸摸屏測(cè)試函數(shù)

  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);                //畫(huà)圖                                    
  36.                         }
  37.                 }else delay_ms(10);        //沒(méi)有按鍵按下的時(shí)候             
  38.                 if(key==KEY0_PRES)        //KEY0按下,則執(zhí)行校準(zhǔn)程序
  39.                 {
  40.                         LCD_Clear(WHITE);//清屏
  41.                     TP_Adjust();          //屏幕校準(zhǔn)  
  42.                         Load_Drow_Dialog();
  43.                 }
  44.                 i++;
  45.                 if(i%20==0)LED0=!LED0;
  46.         }
  47. }*/
  48. //加載鍵盤(pán)控制界面
  49. //x,y:界面起始坐標(biāo)
  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 開(kāi)
  60.         LCD_Fill(x+122,y+102,x+238,y+198,WHITE);//控制LED1 LED2 關(guān)
  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. //按鍵狀態(tài)設(shè)置
  68. //x,y:鍵盤(pán)坐標(biāo)
  69. //key:鍵值(0~8)
  70. //sta:狀態(tài),0,松開(kāi);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:鍵盤(pán)坐標(biāo)
  88. //返回值:按鍵鍵值(1~9有效;0,無(wú)效)
  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,沒(méi)有任何按鍵按下;1~4,1~4號(hào)按鍵按下
  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) //如果要記錄按下后的狀態(tài) 這句話(huà)需要被注釋掉
  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);        //電容屏測(cè)試
  136.                 else rtp_test();                                                 //電阻屏測(cè)試
  137. }*/
  138. int main(void)
  139. {
  140.               u8 key;
  141.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
  142.         delay_init();  //初始化延時(shí)函數(shù)
  143.         uart_init(115200);                //初始化串口波特率為115200
  144.                     
  145.         LED_Init();                                        //初始化LED
  146.         LCD_Init();                                        //LCD初始化  
  147.         KEY_Init();      
  148.         tp_dev.init();                                //初始化觸摸屏
  149.                                 TP_Adjust();          //屏幕校準(zhǔn)
  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.                 //可以用來(lái)控制開(kāi)關(guān)機(jī)等
  164. //                key=KEY_Scan(0);
  165. //                if(key==KEY2_PRES)//KEY2按下
  166. //                {

  167. //                }  
  168.         }                                                                                                                     
  169. }
復(fù)制代碼

所有資料51hei提供下載:
觸摸屏虛擬按鍵程序.7z (246.82 KB, 下載次數(shù): 94)


回復(fù)

使用道具 舉報(bào)

ID:921528 發(fā)表于 2021-5-15 02:23 來(lái)自手機(jī) | 顯示全部樓層
見(jiàn)過(guò)相同的帖子
回復(fù)

使用道具 舉報(bào)

ID:899094 發(fā)表于 2021-5-17 22:20 | 顯示全部樓層
學(xué)到了一種新的代碼寫(xiě)法
謝謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表