目录
一、项目要求
触摸屏上显示四个按键分别为Beep、Red、Blue、Green来控制蜂鸣器响和红蓝绿灯的亮灭。
二、触摸屏的分类
常用触摸屏分两种:
1、电阻触摸屏校正原理:导电ITO层及整个电路电阻值会随时间电压等轻微偏移,为了更精确与LCD显示屏上的功能图案相对应,重新校正计算标准位置。不校正可能会线性偏移,好的触摸屏一般无需校正,或是校正一次会稳定好久。
2、电容触摸屏一般无需校正,比较稳定;有的要校正,同理在因电容量or转换电路的轻微变化,触摸校正获得基准。
三、电容屏模组组成
触摸屏:也就是我们手触摸操作的透明部分;
触摸IC:当电容屏触摸到时,要解析到触点的位置坐标,就是通过这颗芯片去计算处理的。
四、电容式触摸屏工作原理
触摸屏的工作原理概括来说就是上报坐标值,X轴、Y轴的值。前面我们分析了电阻触摸屏,它是通过ADC来检测计算X、Y轴坐标值,下面我们分析一下电容触摸屏的工作原理,看它是如何去检测计算X、Y坐标的值。
与电阻式触摸屏不同,电容式触摸屏不依靠手指按力创造、改变电压值来检测坐标的。电容屏通过任何持有电荷的物体包括人体皮肤工作。(人体所带的电荷)电容式触摸屏是由诸如合金或是銦錫氧化物(ITO)这样的材料构成,电荷存储在一根根比头发还要细的微型静电网中。当手指点击屏幕,会从接触点吸收小量电流,造成角落电极的压降,利用感应人体微弱电流的方式来达到触控的目的。(这是为什么当你带上手套触摸屏幕时,没有反应的原因),下图可以清晰的说明电容屏的工作原理。
五、MCU读取触摸坐标
MCU通过IIC接口和触摸屏进行通信,IIC和串口一样,是一种串行传输方式,IIC是一种总线传输方式,可以在上边同时连接多个设备,但是同一时间只能和一个设备通信。
因为IIC总线能连接多个设备的缘故,所以IIC读写时要先发送想要通信的设备的地址,双方建立连接后才能进一步通信。
1、添加IIC通信支持文件,该文件(bsp_i2c_touch.c和bsp_i2c_touch.h)用来初始化MCU与触摸屏连接的引脚,并通过IIC发送或者读取数据 。
模块接口处的代码:
//向设备发送数据
uint32_t I2C_WriteBytes(uint8_t ClientAddr,uint8_t* pBuffer, uint8_t NumByteToWrite);
//读取设备数据
uint32_t I2C_ReadBytes(uint8_t ClientAddr,uint8_t* pBuffer, uint16_t NumByteToRead);
//初始化触摸芯片通信
void I2C_Touch_Init(void);
//复位触摸芯片通信
void I2C_ResetChip(void);
2、添加触摸屏驱动。 (以gt9xx.c和gt9xx.h作为驱动)
模块接口处代码:
//初始化触摸芯片
int32_t GTP_Init_Panel(void);
//复位触摸芯片
int8_t GTP_Reset_Guitar(void);
//读取触摸芯片型号和版本
int32_t GTP_Read_Version(void);
//向触摸芯片发送信号
int8_t GTP_Send_Command(uint8_t command);
//触摸屏被按下时该函数被调用,内部弱声明,主模块内重新定义,x,y为按下时坐标
void GTP_Press_Event(int32_t x,int32_t y);
//触摸屏松开时该函数被调用,内部弱声明,主模块内重新定义,x,y为松开时坐标
void GTP_Release_Event(int32_t x,int32_t y);
六、代码部分
1、创建四个按键
#define BUTTON_NUM 4
My_Button button_list[BUTTON_NUM] = {0};
void button_0_clicked()
{
if(beep_state ==0)
{
GPIO_SetBits(GPIOI,GPIO_Pin_11);
beep_state = 1;
}
else
{
GPIO_ResetBits(GPIOI,GPIO_Pin_11);
beep_state = 0;
}
}
void button_1_clicked()
{
if(led_state == 0)
{
LED_Red_Ctrl(LED_ON);
led_state = 1;
}
else{
LED_Red_Ctrl(LED_OFF);
led_state = 0;
}
}
void button_2_clicked()
{
if(led_state == 0)
{
LED_Blue_Ctrl(LED_ON);
led_state = 1;
}
else{
LED_Blue_Ctrl(LED_OFF);
led_state = 0;
}
}
void button_3_clicked()
{
if(led_state == 0)
{
LED_Green_Ctrl(LED_ON);
led_state = 1;
}
else{
LED_Green_Ctrl(LED_OFF);
led_state = 0;
}
}
2、按键外观初始化
void Button_UI_init()
{
uint8_t i = 0;
//第一个按键初始化 40,190,150,80
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;
///第二个按键初始化
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_RED;
button_list[1].text_color = LCD_COLOR_BLACK;
button_list[1].text = "RGB-R";
button_list[1].clicked = button_1_clicked;
///第三个按键初始化
button_list[2].x = 300;
button_list[2].y = 100;
button_list[2].width = 100;
button_list[2].height = 60;
button_list[2].release_color = LCD_COLOR_WHITE;
button_list[2].press_color = LCD_COLOR_BLUE;
button_list[2].text_color = LCD_COLOR_BLACK;
button_list[2].text = "RGB-B";
button_list[2].clicked = button_2_clicked;
///第四个按键初始化
button_list[3].x = 300;
button_list[3].y = 200;
button_list[3].width = 100;
button_list[3].height = 60;
button_list[3].release_color = LCD_COLOR_WHITE;
button_list[3].press_color = LCD_COLOR_GREEN;
button_list[3].text_color = LCD_COLOR_BLACK;
button_list[3].text = "RGB-G";
button_list[3].clicked = button_3_clicked;
for(i = 0;i<BUTTON_NUM;i++)
{
if(button_list[i].width == 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);
}
}
3、main函数部分
int main(void)
{
GPIO_InitTypeDef gpio_info;
GTP_Init_Panel();
Delay_init();
UART_init(115200);
LED_init();
LCD_Init();
LCD_LayerInit();
LTDC_Cmd(ENABLE);
LCD_SetLayer(LCD_BACKGROUND_LAYER);
LCD_Clear(LCD_COLOR_BLACK);
LCD_SetLayer(LCD_FOREGROUND_LAYER);
LCD_SetTransparency(0xFF);
LCD_Clear(LCD_COLOR_BLACK);
#if 1
//PI11
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);
gpio_info.GPIO_Mode = GPIO_Mode_OUT;
gpio_info.GPIO_OType = GPIO_OType_PP;
gpio_info.GPIO_Pin = GPIO_Pin_11;
gpio_info.GPIO_PuPd = GPIO_PuPd_UP;
gpio_info.GPIO_Speed = GPIO_Low_Speed;
GPIO_Init(GPIOI,&gpio_info);
#endif
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
LCD_SetFont(&Font16x24);
LCD_SetZNFont(&ZN_Font24x24);
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
Button_UI_init();
}
4、触摸屏按下时
uint8_t press_flag = 0;
//触摸屏被按下时,调用x,y坐标轴
void GTP_Press_Event(int32_t x,int32_t y)
{
uint8_t i = 0;
uint8_t buf[100] = {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].press_color);
//在矩形框上写字
LCD_DrawCharCN(button_list[i].x+10,button_list[i].y+10,(uint8_t *)button_list[i].text);
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
}
}
}
5、触摸屏松开时
//触摸屏松开时,调用x,y轴坐标
void GTP_Release_Event(int32_t x,int32_t y)
{
uint8_t i = 0;
uint8_t buf[100] = {0};
sprintf((char*)buf,"Release 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].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);
button_list[i].clicked();
}
}
}