最近因?yàn)橐恍┬枰,需要用到觸摸屏控制,作為一個(gè)小白,看著例程里面的拼音九鍵那么多程序,看著都害怕(靜下來(lái)懂了之后其實(shí)不難),可是又必須邁過這道坎,來(lái)論壇搜了一下相關(guān)的資料,好多相關(guān)的都是17年之前的了,大多數(shù)也都是基于F1的,相信很多初學(xué)者和我一樣,可能雖然只是移植,也會(huì)出現(xiàn)各種問題。無(wú)賴之下,又回過頭去啃例程,經(jīng)過一番折騰,也搞懂了,想著可能也許有網(wǎng)友可能用的上,就在例程上面精簡(jiǎn)了一下,并做了部分的改動(dòng)。 需要注意的是,板子是自己做的,所以的LED與開發(fā)板是不同的,記得修改IO口。
硬件基礎(chǔ):STM32F407 4.3寸電容屏 程序?qū)崿F(xiàn)的功能是 橫屏顯示
(1)當(dāng)按下LED1 時(shí)綠燈亮;
(2)當(dāng)按下LED2 時(shí)綠燈亮;
(3)當(dāng)按下LED_ON 時(shí)兩燈亮;
(4)當(dāng)按下LED_OFF時(shí)兩燈熄;
同時(shí),因?yàn)樵闯绦蛑杏幸徊糠直蛔⑨尩,所以按鍵按下后的狀態(tài)就被會(huì)被記錄下來(lái)。此程序僅僅只是用于起個(gè)引導(dǎo)作用,不是什么高端的操作。作為一個(gè)潛水黨,也想為論壇的發(fā)展貢獻(xiàn)一點(diǎn)微薄之力哈哈哈,不喜勿噴。
雙手奉上整個(gè)工程文件。
制作出來(lái)的實(shí)物圖如下:
開機(jī)界面.png (362.65 KB, 下載次數(shù): 56)
下載附件
2019-3-28 00:51 上傳
LED1開.jpg (18.7 KB, 下載次數(shù): 60)
下載附件
2019-3-28 00:51 上傳
LED2開.png (421.07 KB, 下載次數(shù): 66)
下載附件
2019-3-28 00:51 上傳
兩個(gè)LED開.png (509.53 KB, 下載次數(shù): 61)
下載附件
2019-3-28 00:51 上傳
兩個(gè)LED關(guān).jpg (24.25 KB, 下載次數(shù): 56)
下載附件
2019-3-28 00:51 上傳
STM32單片機(jī)源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "lcd.h"
- #include "key.h"
- #include "touch.h"
- #include "string.h"
-
- //加載鍵盤控制界面
- //x,y:界面起始坐標(biāo)
- void py_load_ui(u16 x,u16 y)
- {
- POINT_COLOR=RED;
- LCD_DrawRectangle(x,y,x+300,y+200);
- LCD_DrawLine(x,y+100,x+300,y+100);
- LCD_DrawLine(x+150,y,x+150,y+200);
- LCD_Fill(x+2,y+2,x+148,y+98,WHITE);//控制LED1
- LCD_Fill(x+152,y+2,x+298,y+98,WHITE);//控制LED2
- LCD_Fill(x+2,y+102,x+148,y+198,WHITE);//控制LED1 LED2 開
- LCD_Fill(x+152,y+102,x+298,y+198,WHITE);//控制LED1 LED2 關(guān)
- POINT_COLOR=BLACK;
- LCD_ShowString(x+51,y+38,lcddev.width,lcddev.height,24,"LED1");
- LCD_ShowString(x+201,y+38,lcddev.width,lcddev.height,24,"LED2");
- LCD_ShowString(x+39,y+138,lcddev.width,lcddev.height,24,"LED_ON");
- LCD_ShowString(x+183,y+138,lcddev.width,lcddev.height,24,"LED_OFF");
- }
- //按鍵狀態(tài)設(shè)置
- //x,y:鍵盤坐標(biāo)
- //key:鍵值(0~8)
- //sta:狀態(tài),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*150+1,y+i*100+1,x+j*150+149,y+i*100+99,GREEN);
- else LCD_Fill(x+j*150+1,y+i*100+1,x+j*150+149,y+i*100+99,WHITE);
- POINT_COLOR=BLACK;
- LCD_ShowString(x+51,y+38,lcddev.width,lcddev.height,24,"LED1");
- LCD_ShowString(x+201,y+38,lcddev.width,lcddev.height,24,"LED2");
- LCD_ShowString(x+39,y+138,lcddev.width,lcddev.height,24,"LED_ON");
- LCD_ShowString(x+183,y+138,lcddev.width,lcddev.height,24,"LED_OFF");
- }
- //得到觸摸屏的輸入
- //x,y:鍵盤坐標(biāo)
- //返回值:按鍵鍵值(1~9有效;0,無(wú)效)
- u8 py_get_keynum(u16 x,u16 y)
- {
- u16 i,j;
- static u8 key_x=0;//0,沒有任何按鍵按下;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*150+150)&&tp_dev.x[0]>(x+j*150)&&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;
- }
- }
- }
- //如果要記錄按下后的狀態(tài) 這句話需要被注釋掉
- // else if(key_x)
- // {
- // py_key_staset(x,y,key_x-1,0);
- // key_x=0;
- // }
- return key;
- }
- int main(void)
- {
- u8 key;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
- delay_init(168); //初始化延時(shí)函數(shù)
- uart_init(115200); //初始化串口波特率為115200
-
- LED_Init(); //初始化LED
- LCD_Init(); //LCD初始化
- KEY_Init(); //按鍵初始化
- tp_dev.init(); //初始化觸摸屏
- LCD_ShowString(328,72,lcddev.width,lcddev.height,16,"LED CONTROL SYSTEM");
- py_load_ui(250,140);
- while(1)
- {
- delay_ms(10);
- key=py_get_keynum(250,140);
- switch(key)
- {
- case 1 :LED0=!LED0;break;
- case 2 :LED1=!LED1;break;
- case 3 :GPIO_ResetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5);break;
- case 4 :GPIO_SetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5);break;
- }
- //可以用來(lái)控制開關(guān)機(jī)等
- // key=KEY_Scan(0);
- // if(key==KEY2_PRES)//KEY2按下
- // {
- // }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
虛擬按鍵 控制LED.7z
(354.19 KB, 下載次數(shù): 235)
2019-3-28 05:04 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|