目录
一、项目主题
液晶显示电容屏触摸屏幕实现控制功能
二、实现功能
使用开发板里的液晶显示电容屏显示功能按钮;再通过显示功能按钮,实现控制红灯、蓝灯、绿灯和蜂鸣器的开关。
三、开发板
野火STMF429(挑战者)开发板
四、电容屏介绍
电容屏,又称电容式触摸屏,是一种采用电容原理来检测触摸的屏幕技术。它利用导电性的电容体来进行人体接触的检测,当有手指或者其他带有电荷的物体接触屏幕表面时,会对电容体产生影响,从而实现触摸操作的检测。电容屏利用人体电流感应的触摸屏,它由一块玻璃屏和一层覆盖在玻璃上的透明导电层组成,当手指或其他导体接触屏幕时,会在接触点形成一个电容,通过测量电容的变化,确定触摸位置。
电容屏的优点包括对触摸体积、位置和速度的响应更加敏捷,同时还可以支持多点触控功能,使得用户可以更便捷地进行手势操作。在现代智能手机、平板电脑和其他电子设备中,电容屏已成为主流的触摸屏幕技术之一。
五、编程软件
Keil uVision5
六、编程语言
C语言
七、代码展示
#include "stm32F4xx.h"
#include "stm32F4xx_conf.h"
#include "stdio.h"
#include "led.h"
#include "Key.h"
#include "delay.h"
#include "uart.h"
#include "adc.h"
#include "bsp_lcd.h"
#include "fonts.h"
#include "bsp_sdram.h"
#include "lcd_show_zn.h"
#include "lcd_show_zn_font.h"
#include "gt9xx.h"
#include "bsp_i2c_touch.h"
int counter=0;
uint8_t Key1;
uint8_t Key2;
int8_t color=0;
uint32_t delay_time=0;
uint32_t system_time=0;
uint16_t select_index=0;
uint8_t beep_state=0;//表示蜂鸣器状态开关 0表示关闭
uint8_t led_state=0;
#define USER_NEW_METHOD 1 //1使用新方法 0使用旧方法
#define USER_KEY_EXIT 1 //1表示按键外部中断
extern znsFONT ZN_Font48x48;
//定义一个结构体
typedef struct
{
uint16_t x;
uint16_t y;
uint16_t width; //按键的宽
uint16_t height; //按键的高
uint16_t release_color; //按键松开时的颜色
uint16_t press_color; //按键按下时的颜色
uint16_t text_color; //文字颜色的颜色
char *text; //按键显示的文字
void(*clicked)(); //按键的执行函数
}My_Button;
#define BUTTON_NUM 4
My_Button button_list[BUTTON_NUM]={0}; //创建四个按键
//定义按键0的处理函数事件
void button_0_clicked()
{
}
//定义按键1的处理函数事件
void button_1_clicked()
{
}
//按键外观初始化
void Button_UI_init()
{
uint8_t i=0;
//对第一个按键信息初始化
button_list[0].x=100;
button_list[0].y=100;
button_list[0].width=100;
button_list[0].height=60;
button_list[0].release_color=LCD_COLOR_WHITE ;
button_list[0].press_color=LCD_COLOR_YELLOW;
button_list[0].text_color=LCD_COLOR_BLACK;
button_list[0].text="BEEP";
button_list[0].clicked=button_0_clicked;
//对第2个按键信息初始化
button_list[1].x=100;
button_list[1].y=200;
button_list[1].width=100;
button_list[1].height=60;
button_list[1].release_color=LCD_COLOR_WHITE ;
button_list[1].press_color=LCD_COLOR_YELLOW;
button_list[1].text_color=LCD_COLOR_BLACK;
button_list[1].text="RGB_R";
button_list[1].clicked=button_1_clicked;
for(i=0;i<BUTTON_NUM;i++)
{
if(button_list[i].width ==0) //如果按键的宽度是0,则认为按键没有被定义
continue ;
//将画笔颜色更改为矩形框未按下时的颜色
LCD_SetColors(button_list[i].release_color,LCD_COLOR_BLACK);
LCD_DrawFullRect(button_list[i].x,button_list[i].y,button_list[i].width,button_list[i].height);
//将画笔颜色更改为字体需要的颜色
LCD_SetColors(button_list[i].text_color,button_list[i].release_color);
LCD_DrawCharCN(button_list[i].x+10,button_list[i].y+10,(uint8_t *)button_list[i].text);//在矩形框上写字
//将画笔改回默认颜色
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
}
}
//编写中断服务函数
void EXTI0_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line0)!=RESET)//证明触发了中断
{
// delay_time+=10000;
// color++;
// if(color>5)
// color=0;
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
void EXTI15_10_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line13)!=RESET)//证明触发了中断
{
EXTI_ClearITPendingBit(EXTI_Line13);
}
}
void MyLCD_DisplayStringLine(uint16_t Line,uint8_t *ptr,uint8_t mode)
{
if(mode==1)
{
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
LCD_DisplayStringLine(Line,ptr);
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
}
else if(mode==0)
{
LCD_DisplayStringLine (Line,ptr);
}
}
uint8_t press_flag=0;
//触摸屏被按下时该函数被调用,x,y是按下时的坐标值
void GTP_Press_Event(int32_t x,int32_t y)
{
uint8_t buf[100] = {0};
uint8_t i=0;
sprintf((char*)buf,"Press point:%d %d ",x,y); //构造字符串,显示按下时的坐标
LCD_DisplayStringLine(LINE(0),(uint8_t* )buf);
for(i=0;i<BUTTON_NUM;i++)
{
if(x> button_list[i].x
&& x< button_list[i].x+button_list[i].width
&& y>button_list[i].y
&& y< button_list[i].y+button_list[i].height )
{
//将画笔颜色更改为矩形框未按下时的颜色
LCD_SetColors(button_list[i].press_color,LCD_COLOR_BLACK);
LCD_DrawFullRect(button_list[i].x,button_list[i].y,button_list[i].width,button_list[i].height);
//将画笔颜色更改为字体需要的颜色
LCD_SetColors(button_list[i].text_color,button_list[i].release_color);
LCD_DrawCharCN(button_list[i].x+10,button_list[i].y+10,(uint8_t *)button_list[i].text);//在矩形框上写字
//将画笔改回默认颜色
// LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
//执行按键事件
button_list[i].clicked();
}
else
{
// LCD_DrawRect(100,200,100,60);
// press_flag = 0;
}
//红色
if(x>100&&x<200&&y>200&&y<310)
{
LCD_SetColors(LCD_COLOR_RED,LCD_COLOR_BLACK); //更改颜色
LCD_DrawFullRect(100,200,100,60);//画一个新的矩形框覆盖旧的矩形框
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//把颜色改回来
press_flag = 1;
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_RED);
LCD_DrawCharCN(110,210,"RGB-R");//在矩形框上写字
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
}
else
{
// LCD_DrawRect(100,200,100,60);
// press_flag = 0;
}
if(x>100&&x<200&&y>300&&y<410)
{
LCD_SetColors(LCD_COLOR_BLUE,LCD_COLOR_BLACK); //更改颜色
LCD_DrawFullRect(100,300,100,60);//画一个新的矩形框覆盖旧的矩形框
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//把颜色改回来
press_flag = 1;
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_BLUE);
LCD_DrawCharCN(110,310,"RGB-B");//在矩形框上写字
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
}
else
{
// LCD_DrawRect(100,300,100,60);
// press_flag = 0;
}
if(x>100&&x<200&&y>400&&y<510)
{
LCD_SetColors(LCD_COLOR_GREEN,LCD_COLOR_BLACK); //更改颜色
LCD_DrawFullRect(100,400,100,60);//画一个新的矩形框覆盖旧的矩形框
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//把颜色改回来
press_flag = 1;
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_GREEN);
LCD_DrawCharCN(110,410,"RGB-G");//在矩形框上写字
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
}
else
{
// LCD_DrawRect(100,400,100,60);
// press_flag = 0;
}
}
}
//触摸屏松开时该函数被调用,x,y是松开时的坐标值
void GTP_Release_Event(int32_t x,int32_t y)
{
uint8_t buf[100] = {0};
sprintf((char*)buf,"Release point:%d %d ",x,y);//构造字符串,显示松开时的坐标
LCD_DisplayStringLine(LINE(0),(uint8_t* )buf);
if(x>100 && x<200 && y>100 && y<160 )
{
if(beep_state == 0)
{
GPIO_SetBits(GPIOI,GPIO_Pin_11);//开启蜂鸣器
beep_state = 1;//更新蜂鸣器的状态
}
else
{
GPIO_ResetBits(GPIOI,GPIO_Pin_11);//关闭蜂鸣器
beep_state = 0;//更新蜂鸣器的状态
}
LCD_DrawFullRect(100,100,100,60);
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
LCD_DrawCharCN(110,110,"BEEP");//在矩形框上写字
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
}
//hong
if(x>100&&x<200&&y>200&&y<310)
{
if(led_state==0)
{
LED_Red_Ctrl(LED_ON );//开启
LED_Blue_Ctrl(LED_OFF);
LED_Green_Ctrl(LED_OFF);
led_state =1;
}
else
{
LED_Red_Ctrl(LED_OFF);
led_state =0;
}
LCD_DrawFullRect(100,200,100,60);
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
LCD_DrawCharCN(110,210,"RGB-R");//在矩形框上写字
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
}
if(x>100&&x<200&&y>300&&y<410)
{
if(led_state==0)
{
LED_Green_Ctrl(LED_ON );//开启
led_state =1;
LED_Blue_Ctrl(LED_OFF);
LED_Red_Ctrl(LED_OFF);
}
else
{
LED_Green_Ctrl(LED_OFF);
led_state =0;
}
LCD_DrawFullRect(100,300,100,60);
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
LCD_DrawCharCN(110,310,"RGB-B");//在矩形框上写字
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
}
if(x>100&&x<200&&y>400&&y<510)
{
if(led_state==0)
{
LED_Blue_Ctrl(LED_ON );//开启
led_state =1;
LED_Green_Ctrl(LED_OFF);
LED_Red_Ctrl(LED_OFF);
}
else
{
LED_Blue_Ctrl(LED_OFF);
led_state =0;
}
LCD_DrawFullRect(100,400,100,60);
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
LCD_DrawCharCN(110,410,"RGB-G");//在矩形框上写字
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
}
}
int main(void)
{
//初始化串口 USART1
//因为要用到PA9 PA10 所有先初始化IO口
GPIO_InitTypeDef gpioinit_info;
GTP_Init_Panel();
LED_init();
Key1_init();
Key2_init();
Delay_init();
UART_init(115200);
ADC_init();
LCD_Init(); //屏幕初始化
LCD_LayerInit(); //屏幕显示层初始化
LTDC_Cmd(ENABLE); //LTCD外设初始化
LCD_SetLayer(LCD_BACKGROUND_LAYER); //把背景层刷黑色,选定控制背景层
LCD_Clear(LCD_COLOR_BLACK); //清除屏幕并用黑色填充
LCD_SetLayer(LCD_FOREGROUND_LAYER);
LCD_SetTransparency(0xFF);
LCD_Clear(LCD_COLOR_BLACK); //清除屏幕并用黑色填充
//PI11 蜂鸣器
//初始化GPIOI时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);
gpioinit_info.GPIO_Mode=GPIO_Mode_OUT;
gpioinit_info.GPIO_OType=GPIO_OType_PP;
gpioinit_info.GPIO_Pin=GPIO_Pin_11;
gpioinit_info.GPIO_PuPd=GPIO_PuPd_UP;
gpioinit_info.GPIO_Speed=GPIO_Low_Speed;
GPIO_Init(GPIOI,&gpioinit_info);
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
LCD_SetFont(&Font16x24);
GPIO_SetBits(GPIOH,LED_RED);//关闭红灯
GPIO_SetBits(GPIOH,LED_BLUE);
GPIO_SetBits(GPIOH,LED_GREEN);
LCD_SetZNFont(&ZN_Font48x48);
Button_UI_init();
while(1)
{
}
}
主要代码框架解释
1.全局变量定义
定义多个全局变量,如计数器counter
、按键状态Key1
和Key2
、颜色color
、延时时间delay_time
、系统时间system_time
、选择索引select_index
、蜂鸣器状态beep_state
和LED状态led_state
等。这些变量用于在程序的不同部分之间共享数据。
2.自定义结构体My_Button
定义了一个名为My_Button
的结构体,用于描述一个按键的多个属性,如位置、大小、颜色、显示的文字以及点击时执行的函数等。
3.按键处理函数
定义了button_0_clicked
和button_1_clicked
两个函数,用于处理按键点击事件。目前这两个函数体为空,意味着在实际使用中需要添加相应的处理逻辑。
4.按键界面初始化函数Button_UI_init
这个函数用于初始化按键的外观,包括设置按键的位置、大小、颜色等属性。通过遍历button_list
数组,为已定义的按键(即宽度不为0的按键)设置初始值。
八、效果实现
按下液晶显示电容屏的“BEEP”功能按钮,蜂鸣器开,再按一次蜂鸣器关;
按下液晶显示电容屏的“RGB_R”功能按钮,红色LED灯开,再按一次红色LED灯关;
按下液晶显示电容屏的“RGB_G”功能按钮,绿色LED灯开,再按一次绿色LED灯关;
按下液晶显示电容屏的“RGB_B”功能按钮,蓝色LED灯开,再按一次蓝色LED灯关。
九、总结
以上就是实现液晶显示电容屏触摸实现控制功能的全部内容了。希望读者可以更全面地了解液晶显示电容屏实现控制功能的方方面面,从理论到实践,拓展发挥出STM32的更多可能。