本文包含源代码、原理图、PCB、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
最近因为一些需要,需要用到触摸屏控制,作为一个小白,看着例程里面的拼音九键那么多程序,看着都害怕(静下来懂了之后其实不难),可是又必须迈过这道坎,来论坛搜了一下相关的资料,好多相关的都是17年之前的了,大多数也都是基于F1的,相信很多初学者和我一样,可能虽然只是移植,也会出现各种问题。无赖之下,又回过头去啃例程,经过一番折腾,也搞懂了,想着可能也许有网友可能用的上,就在例程上面精简了一下,并做了部分的改动。 需要注意的是,板子是自己做的,所以的LED与开发板是不同的,记得修改IO口。
硬件基础:STM32F407 4.3寸电容屏 程序实现的功能是 横屏显示
(1)当按下LED1 时绿灯亮;
(2)当按下LED2 时绿灯亮;
(3)当按下LED_ON 时两灯亮;
(4)当按下LED_OFF时两灯熄;
同时,因为源程序中有一部分被注释掉,所以按键按下后的状态就被会被记录下来。此程序仅仅只是用于起个引导作用,不是什么高端的操作。作为一个潜水党,也想为论坛的发展贡献一点微薄之力哈哈哈,不喜勿喷。
双手奉上整个工程文件。
制作出来的实物图如下:
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按下
- // {
-
- // }
- }
- }
复制代码
所有资料MCU智学网提供下载:
MCU智学网_虚拟按键控制LED.7z
(354.19 KB, 下载次数: 2)
|