最近因為一些需要,需要用到觸摸屏控制,作為一個小白,看著例程里面的拼音九鍵那么多程序,看著都害怕(靜下來懂了之后其實不難),可是又必須邁過這道坎,來論壇搜了一下相關的資料,好多相關的都是17年之前的了,大多數也都是基于F1的,相信很多初學者和我一樣,可能雖然只是移植,也會出現各種問題。無賴之下,又回過頭去啃例程,經過一番折騰,也搞懂了,想著可能也許有網友可能用的上,就在例程上面精簡了一下,并做了部分的改動。 需要注意的是,板子是自己做的,所以的LED與開發板是不同的,記得修改IO口。
硬件基礎:STM32F407 4.3寸電容屏 程序實現的功能是 橫屏顯示
(1)當按下LED1 時綠燈亮;
(2)當按下LED2 時綠燈亮;
(3)當按下LED_ON 時兩燈亮;
(4)當按下LED_OFF時兩燈熄;
同時,因為源程序中有一部分被注釋掉,所以按鍵按下后的狀態就被會被記錄下來。此程序僅僅只是用于起個引導作用,不是什么高端的操作。作為一個潛水黨,也想為論壇的發展貢獻一點微薄之力哈哈哈,不喜勿噴。
雙手奉上整個工程文件。
制作出來的實物圖如下:
開機界面.png (362.65 KB, 下載次數: 56)
下載附件
2019-3-28 00:51 上傳
LED1開.jpg (18.7 KB, 下載次數: 60)
下載附件
2019-3-28 00:51 上傳
LED2開.png (421.07 KB, 下載次數: 66)
下載附件
2019-3-28 00:51 上傳
兩個LED開.png (509.53 KB, 下載次數: 61)
下載附件
2019-3-28 00:51 上傳
兩個LED關.jpg (24.25 KB, 下載次數: 56)
下載附件
2019-3-28 00:51 上傳
STM32單片機源程序如下:
- #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:界面起始坐標
- 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 關
- 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:鍵盤坐標
- //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*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:鍵盤坐標
- //返回值:按鍵鍵值(1~9有效;0,無效)
- 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*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;
- }
- }
- }
- //如果要記錄按下后的狀態 這句話需要被注釋掉
- // 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);//設置系統中斷優先級分組2
- delay_init(168); //初始化延時函數
- 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;
- }
- //可以用來控制開關機等
- // key=KEY_Scan(0);
- // if(key==KEY2_PRES)//KEY2按下
- // {
- // }
- }
- }
復制代碼
所有資料51hei提供下載:
虛擬按鍵 控制LED.7z
(354.19 KB, 下載次數: 235)
2019-3-28 05:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|