国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標(biāo)題:
STM32虛擬按鍵觸摸屏實(shí)驗(yàn)程序源碼
[打印本頁(yè)]
作者:
路漫漫
時(shí)間:
2020-5-20 22:20
標(biāo)題:
STM32虛擬按鍵觸摸屏實(shí)驗(yàn)程序源碼
本實(shí)驗(yàn)代碼,開(kāi)機(jī)的時(shí)候先通過(guò)LCD ID檢測(cè)是電容屏(ALIENTEK 4.3寸/7寸電容觸摸屏)還是電阻屏(ALIENTEK 2.4/2.8/3.5寸電阻屏),然后進(jìn)入相關(guān)的測(cè)試。如果是電阻屏,則通過(guò)24C02的數(shù)據(jù)判斷觸摸屏是否已經(jīng)校準(zhǔn)過(guò),如果沒(méi)有校準(zhǔn),則執(zhí)行校準(zhǔn)程序,校準(zhǔn)過(guò)后再進(jìn)入手寫(xiě)程序。如果已經(jīng)校準(zhǔn)了,就直接進(jìn)入手寫(xiě)程序,此時(shí)可以通過(guò)按動(dòng)屏幕來(lái)實(shí)現(xiàn)手寫(xiě)輸入。屏幕上會(huì)有一個(gè)清空的操作區(qū)域(RST),點(diǎn)擊這個(gè)地方就會(huì)將輸入全部清除,恢復(fù)白板狀態(tài)。程序會(huì)設(shè)置一個(gè)強(qiáng)制校準(zhǔn),就是通過(guò)按KEY0來(lái)實(shí)現(xiàn),只要按下KEY0就會(huì)進(jìn)入強(qiáng)制校準(zhǔn)程序。
如果是電容屏,則直接進(jìn)入手寫(xiě)測(cè)試程序,電容觸摸屏支持ALIENTEK 4.3寸/新款(SSD1963驅(qū)動(dòng)版本)7寸TFTLCD模塊,支持5點(diǎn)觸摸。電容觸摸屏不需要校準(zhǔn),其他操作同電阻觸摸屏的測(cè)試。
電阻屏校準(zhǔn)方法:
1,下載本代碼。
2,按KEY0。
3,依次點(diǎn)擊屏幕上的4個(gè)十字架(十字+小圈圈)的最中央(最好用筆尖)
4,直到屏幕提示:"Touch Screen Adjust OK!"字樣。
5,校準(zhǔn)完成。該程序是論壇某位大佬的,不過(guò)是F4的。稍加修改,適用于F103系列(2.8寸觸摸屏)。
完整源碼:
觸摸屏虛擬按鍵程序.7z
(246.82 KB)
2020-5-20 22:18 上傳
點(diǎn)擊文件名下載附件
部分源程序如下
#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"
//兩個(gè)數(shù)之差的絕對(duì)值
//x1,x2:需取差值的兩個(gè)數(shù)
//返回值:|x1-x2|
u16 my_abs(u16 x1,u16 x2)
{
if(x1>x2)return x1-x2;
else return x2-x1;
}
////////////////////////////////////////////////////////////////////////////////
//5個(gè)觸控點(diǎn)的顏色
const u16 POINT_COLOR_TBL[CT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};
//電阻觸摸屏測(cè)試函數(shù)
/*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); //畫(huà)圖
}
}else delay_ms(10); //沒(méi)有按鍵按下的時(shí)候
if(key==KEY0_PRES) //KEY0按下,則執(zhí)行校準(zhǔn)程序
{
LCD_Clear(WHITE);//清屏
TP_Adjust(); //屏幕校準(zhǔn)
Load_Drow_Dialog();
}
i++;
if(i%20==0)LED0=!LED0;
}
}*/
//加載鍵盤(pán)控制界面
//x,y:界面起始坐標(biāo)
//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 開(kāi)
LCD_Fill(x+122,y+102,x+238,y+198,WHITE);//控制LED1 LED2 關(guān)
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");
}
//按鍵狀態(tài)設(shè)置
//x,y:鍵盤(pán)坐標(biāo)
//key:鍵值(0~8)
//sta:狀態(tài),0,松開(kāi);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:鍵盤(pán)坐標(biāo)
//返回值:按鍵鍵值(1~9有效;0,無(wú)效)
//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,沒(méi)有任何按鍵按下;1~4,1~4號(hào)按鍵按下
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) //如果要記錄按下后的狀態(tài) 這句話需要被注釋掉
{
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); //電容屏測(cè)試
else rtp_test(); //電阻屏測(cè)試
}*/
int main(void)
{
u8 key;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
delay_init(); //初始化延時(shí)函數(shù)
uart_init(115200); //初始化串口波特率為115200
LED_Init(); //初始化LED
LCD_Init(); //LCD初始化
KEY_Init();
tp_dev.init(); //初始化觸摸屏
TP_Adjust(); //屏幕校準(zhǔn)
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;*/
}
//可以用來(lái)控制開(kāi)關(guān)機(jī)等
// key=KEY_Scan(0);
// if(key==KEY2_PRES)//KEY2按下
// {
// }
}
}
復(fù)制代碼
作者:
露月弓
時(shí)間:
2023-4-10 11:10
和正點(diǎn)原子官方的觸摸屏顯示一模一樣,跑完了就只有個(gè)rst,根本沒(méi)有虛擬按鍵
補(bǔ)充內(nèi)容 (2023-4-10 16:52):
不好意思,弄錯(cuò)了,這個(gè)就是虛擬按鍵,是我的問(wèn)題,我沒(méi)看清楚
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0