本實驗代碼,開機的時候先通過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)
2020-5-20 22:18 上傳
點擊文件名下載附件
部分源程序如下
- #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "lcd.h"
- #include "usart.h"
- #include "24cxx.h"
- #include "w25qxx.h"
- #include "touch.h"
- //兩個數之差的絕對值
- //x1,x2:需取差值的兩個數
- //返回值:|x1-x2|
- u16 my_abs(u16 x1,u16 x2)
- {
- if(x1>x2)return x1-x2;
- else return x2-x1;
- }
- ////////////////////////////////////////////////////////////////////////////////
- //5個觸控點的顏色
- const u16 POINT_COLOR_TBL[CT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};
- //電阻觸摸屏測試函數
- /*void rtp_test(void)
- {
- u8 key;
- u8 i=0;
- while(1)
- {
- key=KEY_Scan(0);
- tp_dev.scan(0);
- if(tp_dev.sta&TP_PRES_DOWN) //觸摸屏被按下
- {
- if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
- {
- if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog();//清除
- else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED); //畫圖
- }
- }else delay_ms(10); //沒有按鍵按下的時候
- if(key==KEY0_PRES) //KEY0按下,則執行校準程序
- {
- LCD_Clear(WHITE);//清屏
- TP_Adjust(); //屏幕校準
- Load_Drow_Dialog();
- }
- i++;
- if(i%20==0)LED0=!LED0;
- }
- }*/
- //加載鍵盤控制界面
- //x,y:界面起始坐標
- //py_load_ui(0,0)
- void py_load_ui(u16 x,u16 y)
- {
- POINT_COLOR=RED;
- LCD_DrawRectangle(x,y,x+240,y+200);
- LCD_DrawLine(x,y+100,x+240,y+100);
- LCD_DrawLine(x+120,y,x+120,y+200);
- LCD_Fill(x+2,y+2,x+118,y+98,WHITE);//控制LED1
- LCD_Fill(x+122,y+2,x+238,y+98,WHITE);//控制LED2
- LCD_Fill(x+2,y+102,x+118,y+198,WHITE);//控制LED1 LED2 開
- LCD_Fill(x+122,y+102,x+238,y+198,WHITE);//控制LED1 LED2 關
- POINT_COLOR=BLACK;
- LCD_ShowString(x+39,y+38,lcddev.width,lcddev.height,24,"LED1");
- LCD_ShowString(x+153,y+38,lcddev.width,lcddev.height,24,"LED2");
- LCD_ShowString(x+39,y+138,lcddev.width,lcddev.height,24,"LED_ON");
- LCD_ShowString(x+153,y+138,lcddev.width,lcddev.height,24,"LED_OFF");
- }
- //按鍵狀態設置
- //x,y:鍵盤坐標
- //key:鍵值(0~8)
- //sta:狀態,0,松開;1,按下;
- void py_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
- {
- u16 i=keyx/2,j=keyx%2;
- if(keyx>8)return;
-
- if(sta)
- LCD_Fill(x+j*120+1,y+i*100+1,x+j*120+119,y+i*100+99,GREEN);//按鍵按下
- else
- LCD_Fill(x+j*120+1,y+i*100+1,x+j*120+119,y+i*100+99,WHITE);
- POINT_COLOR=BLACK;
- LCD_ShowString(x+39,y+38,lcddev.width,lcddev.height,24,"LED1");
- LCD_ShowString(x+153,y+38,lcddev.width,lcddev.height,24,"LED2");
- LCD_ShowString(x+39,y+138,lcddev.width,lcddev.height,24,"LED_ON");
- LCD_ShowString(x+153,y+138,lcddev.width,lcddev.height,24,"LED_OFF");
- }
- //得到觸摸屏的輸入
- //x,y:鍵盤坐標
- //返回值:按鍵鍵值(1~9有效;0,無效)
- //key=py_get_keynum(250,140); 640*320
- u8 py_get_keynum(u16 x,u16 y)
- {
- u16 i,j;
- static u8 key_x=0;//0,沒有任何按鍵按下;1~4,1~4號按鍵按下
- u8 key=0;
- tp_dev.scan(0); //屏幕掃描
- if(tp_dev.sta&TP_PRES_DOWN) //觸摸屏被按下
- {
- for(i=0;i<2;i++)
- {
- for(j=0;j<2;j++)
- {
- 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))
- {
- key=i*2+j+1;
- break;
- }
- }
- if(key)
- {
- if(key_x==key)key=0;
- else
- {
- py_key_staset(x,y,key_x-1,0);
- key_x=key;
- py_key_staset(x,y,key_x-1,1);
- }
- break;
- }
- }
- }
-
- else if(key_x) //如果要記錄按下后的狀態 這句話需要被注釋掉
- {
- py_key_staset(x,y,key_x-1,0);
- key_x=0;
- }
- return key;
- }
- /*
- tp_dev.init();
- LCD_ShowString(60,130,200,16,16,"Press KEY0 to Adjust");
- if(tp_dev.touchtype!=0XFF)LCD_ShowString(60,130,200,16,16,"Press KEY0 to Adjust");//電阻屏才顯示
- delay_ms(1500);
- Load_Drow_Dialog();
- if(tp_dev.touchtype&0X80); //電容屏測試
- else rtp_test(); //電阻屏測試
- }*/
- int main(void)
- {
- u8 key;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
- delay_init(); //初始化延時函數
- uart_init(115200); //初始化串口波特率為115200
-
- LED_Init(); //初始化LED
- LCD_Init(); //LCD初始化
- KEY_Init();
- tp_dev.init(); //初始化觸摸屏
- TP_Adjust(); //屏幕校準
- LCD_ShowString(120,72,lcddev.width,lcddev.height,16,"LED CONTROL SYSTEM");
- py_load_ui(0,0);
- while(1)
- {
- delay_ms(10);
- key=py_get_keynum(0,0);
- switch(key)
- {
- case 1 :LED0=!LED0;break;
- case 2 :LED1=!LED1;break;
- case 3 :LED0=LED1=1;break;/*GPIO_ResetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5)*/
- case 4 :LED0=LED1=0;break;/*GPIO_SetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5);break;*/
- }
- //可以用來控制開關機等
- // key=KEY_Scan(0);
- // if(key==KEY2_PRES)//KEY2按下
- // {
- // }
- }
- }
復制代碼
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|