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

QQ登錄

只需一步,快速開始

搜索
查看: 10426|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

STM32F407觸摸屏虛擬按鍵控制LED燈源程序 帶拼音九鍵

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
最近因?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í)物圖如下:


STM32單片機(jī)源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"  
  3. #include "usart.h"   
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "key.h"  
  7. #include "touch.h"
  8. #include "string.h"

  9.   
  10. //加載鍵盤控制界面
  11. //x,y:界面起始坐標(biāo)
  12. void py_load_ui(u16 x,u16 y)
  13. {
  14.         POINT_COLOR=RED;
  15.         LCD_DrawRectangle(x,y,x+300,y+200);                                                  
  16.         LCD_DrawLine(x,y+100,x+300,y+100);
  17.         LCD_DrawLine(x+150,y,x+150,y+200);
  18.         LCD_Fill(x+2,y+2,x+148,y+98,WHITE);//控制LED1
  19.         LCD_Fill(x+152,y+2,x+298,y+98,WHITE);//控制LED2
  20.         LCD_Fill(x+2,y+102,x+148,y+198,WHITE);//控制LED1 LED2 開
  21.         LCD_Fill(x+152,y+102,x+298,y+198,WHITE);//控制LED1 LED2 關(guān)
  22.         POINT_COLOR=BLACK;
  23.         LCD_ShowString(x+51,y+38,lcddev.width,lcddev.height,24,"LED1");
  24.         LCD_ShowString(x+201,y+38,lcddev.width,lcddev.height,24,"LED2");
  25.         LCD_ShowString(x+39,y+138,lcddev.width,lcddev.height,24,"LED_ON");
  26.         LCD_ShowString(x+183,y+138,lcddev.width,lcddev.height,24,"LED_OFF");                                                             
  27. }
  28. //按鍵狀態(tài)設(shè)置
  29. //x,y:鍵盤坐標(biāo)
  30. //key:鍵值(0~8)
  31. //sta:狀態(tài),0,松開;1,按下;
  32. void py_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
  33. {                  
  34.         u16 i=keyx/2,j=keyx%2;
  35.         if(keyx>8)return;
  36.         if(sta)LCD_Fill(x+j*150+1,y+i*100+1,x+j*150+149,y+i*100+99,GREEN);
  37.         else LCD_Fill(x+j*150+1,y+i*100+1,x+j*150+149,y+i*100+99,WHITE);
  38.         POINT_COLOR=BLACK;
  39.         LCD_ShowString(x+51,y+38,lcddev.width,lcddev.height,24,"LED1");
  40.         LCD_ShowString(x+201,y+38,lcddev.width,lcddev.height,24,"LED2");
  41.         LCD_ShowString(x+39,y+138,lcddev.width,lcddev.height,24,"LED_ON");
  42.         LCD_ShowString(x+183,y+138,lcddev.width,lcddev.height,24,"LED_OFF");
  43. }
  44. //得到觸摸屏的輸入
  45. //x,y:鍵盤坐標(biāo)
  46. //返回值:按鍵鍵值(1~9有效;0,無(wú)效)
  47. u8 py_get_keynum(u16 x,u16 y)
  48. {
  49.         u16 i,j;
  50.         static u8 key_x=0;//0,沒有任何按鍵按下;1~4,1~4號(hào)按鍵按下
  51.         u8 key=0;
  52.         tp_dev.scan(0);                  
  53.         if(tp_dev.sta&TP_PRES_DOWN)                        //觸摸屏被按下
  54.         {       
  55.                 for(i=0;i<2;i++)
  56.                 {
  57.                         for(j=0;j<2;j++)
  58.                         {
  59.                                  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))
  60.                                 {       
  61.                                         key=i*2+j+1;         
  62.                                         break;                           
  63.                                 }
  64.                         }
  65.                         if(key)
  66.                         {          
  67.                                 if(key_x==key)key=0;
  68.                                 else
  69.                                 {
  70.                                         py_key_staset(x,y,key_x-1,0);
  71.                                         key_x=key;
  72.                                         py_key_staset(x,y,key_x-1,1);
  73.                                 }
  74.                                 break;
  75.                         }
  76.                 }  
  77.         }
  78.         //如果要記錄按下后的狀態(tài) 這句話需要被注釋掉
  79. //        else if(key_x)
  80. //        {
  81. //                py_key_staset(x,y,key_x-1,0);
  82. //                key_x=0;
  83. //        }
  84.         return key;
  85. }
  86. int main(void)
  87. {        
  88.         u8 key;
  89.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
  90.         delay_init(168);  //初始化延時(shí)函數(shù)
  91.         uart_init(115200);                //初始化串口波特率為115200
  92.        
  93.         LED_Init();                                        //初始化LED
  94.         LCD_Init();                                        //LCD初始化  
  95.         KEY_Init();                                        //按鍵初始化
  96.         tp_dev.init();                                //初始化觸摸屏
  97.         LCD_ShowString(328,72,lcddev.width,lcddev.height,16,"LED CONTROL SYSTEM");
  98.         py_load_ui(250,140);               
  99.         while(1)
  100.         {
  101.                 delay_ms(10);
  102.                 key=py_get_keynum(250,140);
  103.                 switch(key)
  104.                 {
  105.                         case 1 :LED0=!LED0;break;
  106.                         case 2 :LED1=!LED1;break;
  107.                         case 3 :GPIO_ResetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5);break;
  108.                         case 4 :GPIO_SetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5);break;
  109.                 }
  110.                 //可以用來(lái)控制開關(guān)機(jī)等
  111. //                key=KEY_Scan(0);
  112. //                if(key==KEY2_PRES)//KEY2按下
  113. //                {

  114. //                }  
  115.         }                                                                                                                      
  116. }
復(fù)制代碼

所有資料51hei提供下載:
虛擬按鍵 控制LED.7z (354.19 KB, 下載次數(shù): 235)


評(píng)分

參與人數(shù) 2黑幣 +130 收起 理由
wpppmlah + 30 共享資料的黑幣獎(jiǎng)勵(lì)!
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:521481 發(fā)表于 2019-4-25 16:25 | 只看該作者
很不錯(cuò),參考一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:486936 發(fā)表于 2019-5-14 08:57 | 只看該作者
請(qǐng)問如果用STC89C52可以嗎?有什么需要注意的地方嗎??
回復(fù)

使用道具 舉報(bào)

地板
ID:416208 發(fā)表于 2019-7-3 11:38 | 只看該作者
用在F103上需要注意哪些地方,修改那些地方,
回復(fù)

使用道具 舉報(bào)

5#
ID:416208 發(fā)表于 2019-7-3 13:56 | 只看該作者
如果是F103需要修改那些地方
回復(fù)

使用道具 舉報(bào)

6#
ID:662900 發(fā)表于 2019-12-16 08:26 來(lái)自手機(jī) | 只看該作者
你好,請(qǐng)問程序中“sting.h”這個(gè)什么頭文件
回復(fù)

使用道具 舉報(bào)

7#
ID:676739 發(fā)表于 2019-12-29 16:55 | 只看該作者
十分感謝,參考一下
回復(fù)

使用道具 舉報(bào)

8#
ID:921528 發(fā)表于 2021-5-15 02:24 來(lái)自手機(jī) | 只看該作者
樓主優(yōu)秀,參考一下
回復(fù)

使用道具 舉報(bào)

9#
ID:921528 發(fā)表于 2021-5-15 02:25 來(lái)自手機(jī) | 只看該作者
wyl2937808789 發(fā)表于 2019-12-16 08:26
你好,請(qǐng)問程序中“sting.h”這個(gè)什么頭文件

是string.h
回復(fù)

使用道具 舉報(bào)

10#
ID:899094 發(fā)表于 2021-5-18 15:28 | 只看該作者
關(guān)于觸摸區(qū)域弄的頭都大了
回復(fù)

使用道具 舉報(bào)

11#
ID:942056 發(fā)表于 2023-3-27 07:43 來(lái)自手機(jī) | 只看該作者
謝謝大佬的奉獻(xiàn)
回復(fù)

使用道具 舉報(bào)

12#
ID:1143069 發(fā)表于 2025-1-15 15:38 | 只看該作者
大佬,這邊板子不亮是什么原因呢?用的是野火stm32f407
回復(fù)

使用道具 舉報(bào)

13#
ID:1077913 發(fā)表于 2025-1-18 22:43 | 只看該作者
小白正在學(xué)習(xí),下載下來(lái)參考一下大佬的作品
回復(fù)

使用道具 舉報(bào)

14#
ID:66862 發(fā)表于 2025-4-8 23:25 | 只看該作者
程序?qū)?yīng)的液晶觸摸屏驅(qū)動(dòng)型號(hào)多少?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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