触摸屏按键控制----LCD显示

目录

一、项目要求

二、触摸屏的分类 

三、电容屏模组组成 

四、电容式触摸屏工作原理 

五、MCU读取触摸坐标 

六、代码部分 

1、创建四个按键 

2、按键外观初始化 

3、main函数部分

4、触摸屏按下时 

5、触摸屏松开时 


一、项目要求

触摸屏上显示四个按键分别为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();
 	}
    }
}

  • 22
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在1602 LCD显示屏上显示仿手机键盘按键字符,首先需要了解1602 LCD显示屏的基本原理和操作步骤。1602 LCD显示屏有16列和2行的字符显示区域,每个字符由5x8像素的点阵组成。其工作原理是通过控制液晶中的液晶分子的方向来显示字符。 为了显示仿手机键盘按键字符,我们可以使用Arduino等开发控制1602 LCD显示屏。首先,需要将手机键盘按键字符的数据存储到程序中。可以使用数组或字符串的形式保存按键字符的数据。比如,我们可以定义一个字符数组来存储手机键盘按键的字符数据。 然后,需要利用编程语言(如C++)编写程序,通过逐个字符地读取字符数组中的数据,并将其传输给1602 LCD显示屏。可以使用LCD库函数来实现1602 LCD显示屏的驱动。在循环中,可以使用for循环来逐个显示字符,以确保所有字符都能够在屏幕显示。 在编写程序的过程中,还需要设置LCD显示屏的基本参数,比如显示模式、显示光标、光标位置等。可以使用LCD库函数来设置和控制这些参数,以满足显示需求。 最后,通过连接Arduino等开发和1602 LCD显示屏,将程序烧录到开发中,并将开发LCD屏幕相连。通过电源供电,开发将按照程序中的指令,逐个显示出手机键盘按键字符。 通过上述步骤,就可以在1602 LCD显示屏上显示出仿手机键盘按键字符了。这样,用户只需通过触摸按键,就能够在LCD屏幕上看到相应的字符显示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值