提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在野火stm32f103vet6驱动3.2寸电阻触摸屏,触摸画板的程序基础上修改的使用电阻触摸屏触摸点亮LED灯。
一、触摸屏是什么?
触摸屏是一种把触摸位置转化成坐标数据的输入设备,根据触摸屏的检测原理,主要分为电阻式触摸屏(我们这里使用就是电阻式触摸屏)和电容式触摸屏。相对来说,电阻屏造价便宜,能适应较恶劣的环境,但它只支持单点触控(一次只能检测面板上的一个触摸位置),触摸时需要一定的压力,使用久了容易造成表面磨损,影响寿命;而电容屏具有支持多点触控、检测精度高的特点,电容屏通过与导电物体产生的电容效应来检测触摸动作,只能感应导电物体的触摸,湿度较大或屏幕表面有水珠时会影响电容屏的检测效果。
二、电阻触摸屏的原理
电阻触摸屏是一种常见的触摸屏技术,其工作原理是利用两个透明的电阻膜层,分别被涂覆上了一层导电性材料,形成一个电阻矩阵,并且在两层电阻膜之间加上一个绝缘层。当用户触摸电阻触摸屏时,手指对两层电阻膜的压力会使得两层电阻膜的导电材料相互接触,形成一个电路,通过读取电路的电阻值,就可以知道用户触摸的位置。
二、软件设计
1.编程要点
这些大部分都不需要在原程序上修改
(1) 编写软件模拟 SPI 协议的驱动;
(2) 编写触摸芯片的控制驱动,如发送命令字,获取触摸坐标等;
(3) 编写触摸校正程序;
(4) 编写测试程序检验驱动。
2.代码分析
代码如下(示例):代码参考的野火触摸画板示例,在此基础上修改。
画板文件:
Touch_Button button[BUTTON_NUM];//按钮结构体数组
/*画笔参数*/
Brush_Style brush;
static void Draw_Color_Button(void *btn);
static void Command_Select_Color(void *btn);
/*画板初始化*/
void Palette_Init(uint8_t LCD_Mode)
{
uint8_t i;
ILI9341_GramScan ( LCD_Mode );
/* 整屏清为白色 */
LCD_SetBackColor(CL_WHITE);
ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);
/* 初始化按钮 */
Touch_Button_Init();
/* 描绘按钮 */
for(i=0;i<BUTTON_NUM;i++)
{
button[i].draw_btn(&button[i]);
}
}
void Touch_Button_Init(void)//初始化按钮参数
{
button[0].start_x = COLOR_BLOCK_WIDTH;//x坐标起始点=矩形宽度
button[0].start_y = COLOR_BLOCK_HEIGHT*1;//y坐标起始点=矩形高度
button[0].end_x = COLOR_BLOCK_WIDTH*2 ;//x坐标终止点=矩形宽度*2
button[0].end_y = COLOR_BLOCK_HEIGHT*2;//y坐标终止点=矩形高度*2
button[0].para = CL_BLUE;//按钮颜色为蓝色
button[0].touch_flag = 0; //按钮按下的标志
button[0].draw_btn = Draw_Color_Button ;//按钮描绘参数(放在下个代码中)
button[0].btn_command = Command_Select_Color ;//按键执行功能,为了让按钮可以持续触摸有反应
button[1].start_x = COLOR_BLOCK_WIDTH;
button[1].start_y = COLOR_BLOCK_HEIGHT*3;
button[1].end_x = COLOR_BLOCK_WIDTH*2 ;
button[1].end_y = COLOR_BLOCK_HEIGHT*4;
button[1].para = CL_RED;
button[1].touch_flag = 0;
button[1].draw_btn = Draw_Color_Button ;
button[1].btn_command = Command_Select_Color ;
button[2].start_x = width+COLOR_BLOCK_WIDTH*2;
button[2].start_y = COLOR_BLOCK_HEIGHT*1;
button[2].end_x = width+COLOR_BLOCK_WIDTH*3;
button[2].end_y = COLOR_BLOCK_HEIGHT*2;
button[2].para =CL_WHITE;
button[2].touch_flag = 0;
button[2].draw_btn = Draw_Color_Button ;
button[2].btn_command = Command_Select_Color ;
button[3].start_x = width+COLOR_BLOCK_WIDTH*2;
button[3].start_y = COLOR_BLOCK_HEIGHT*3;
button[3].end_x = width+COLOR_BLOCK_WIDTH*3 ;
button[3].end_y = COLOR_BLOCK_HEIGHT*4;
button[3].para = CL_GREEN;
button[3].touch_flag = 0;
button[3].draw_btn = Draw_Color_Button ;
button[3].btn_command = Command_Select_Color ;
}
static void Draw_Color_Button(void *btn)//颜色按钮描绘参数
{
Touch_Button *ptr = (Touch_Button *)btn;
/*释放按键*/
if(ptr->touch_flag == 0)
{
LCD_SetColors(ptr->para,CL_WHITE);//ptr是指向结构体或类的指针,para是按钮选择的颜色。
ILI9341_DrawRectangle( ptr->start_x,//画矩形
ptr->start_y,
ptr->end_x - ptr->start_x,
ptr->end_y - ptr->start_y,1);
}
else /*按键按下*/
{
/*白色背景*/
LCD_SetColors(CL_WHITE,CL_WHITE);
ILI9341_DrawRectangle( ptr->start_x,
ptr->start_y,
ptr->end_x - ptr->start_x,
ptr->end_y - ptr->start_y,1);
}
/*按钮边框*/
LCD_SetColors(CL_BLUE4,CL_WHITE);
ILI9341_DrawRectangle( ptr->start_x,
ptr->start_y,
ptr->end_x - ptr->start_x,
ptr->end_y - ptr->start_y,0);
}
void Touch_Button_Down(uint16_t x,uint16_t y)//按键按下的结构函数
{
/* 触摸到了按钮 */
if(x<=button[0].end_x && y<=button[0].end_y && y>=button[0].start_y && x>=button[0].start_x )
{
if(button[0].touch_flag == 0) /*原本的状态为没有按下,则更新状态*/
{
button[0].touch_flag = 1; /* 记录按下标志 */
button[0].draw_btn(&button[0]); /*重绘按钮*/
LED_BLUE;
}
}
else if(button[0].touch_flag == 1) /* 触摸移出了按键的范围且之前有按下按钮 */
{
button[0].touch_flag = 0; /* 清除按下标志,判断为误操作*/
button[0].draw_btn(&button[0]); /*重绘按钮*/
}
if(x<=button[1].end_x && y<=button[1].end_y && y>=button[1].start_y && x>=button[1].start_x )
{
if(button[1].touch_flag == 0) /*原本的状态为没有按下,则更新状态*/
{
button[1].touch_flag = 1; /* 记录按下标志 */
button[1].draw_btn(&button[1]); /*重绘按钮*/
LED_RED;
}
}
else if(button[1].touch_flag == 1) /* 触摸移出了按键的范围且之前有按下按钮 */
{
button[1].touch_flag = 0; /* 清除按下标志,判断为误操作*/
button[1].draw_btn(&button[1]); /*重绘按钮*/
}
if(x<=button[2].end_x && y<=button[2].end_y && y>=button[2].start_y && x>=button[2].start_x )
{
if(button[2].touch_flag == 0) /*原本的状态为没有按下,则更新状态*/
{
button[2].touch_flag = 1; /* 记录按下标志 */
button[2].draw_btn(&button[2]); /*重绘按钮*/
LED_WHITE;
}
}
else if(button[2].touch_flag == 1) /* 触摸移出了按键的范围且之前有按下按钮 */
{
button[2].touch_flag = 0; /* 清除按下标志,判断为误操作*/
button[2].draw_btn(&button[3]); /*重绘按钮*/
}
if(x<=button[3].end_x && y<=button[3].end_y && y>=button[3].start_y && x>=button[3].start_x )
{
if(button[3].touch_flag == 0) /*原本的状态为没有按下,则更新状态*/
{
button[3].touch_flag = 1; /* 记录按下标志 */
button[3].draw_btn(&button[3]); /*重绘按钮*/
LED_GREEN;
}
}
else if(button[3].touch_flag == 1) /* 触摸移出了按键的范围且之前有按下按钮 */
{
button[3].touch_flag = 0; /* 清除按下标志,判断为误操作*/
button[3].draw_btn(&button[3]); /*重绘按钮*/
}
}
void Touch_Button_Up(uint16_t x,uint16_t y)//按钮释放时调用的函数
{
uint8_t i;
for(i=0;i<BUTTON_NUM;i++)
{
/* 触笔在按钮区域释放 */
if((x<button[i].end_x && x>button[i].start_x && y<button[i].end_y && y>button[i].start_y))
{
button[i].touch_flag = 0; /*释放触摸标志*/
button[i].draw_btn(&button[i]); /*重绘按钮*/
button[i].btn_command(&button[i]); /*执行按键的功能命令*/
break;
}
}
}
在主函数中添加显示英文字符和调用画板函数
extern uint16_t lcdid;
void LCD_Test(void)
{
LCD_SetFont(&Font8x16);//选择英文字体
LCD_SetTextColor(BLACK );//字体颜色
ILI9341_DispStringLine_EN(LINE(0),"csdn");
ILI9341_DispStringLine_EN(LINE(1),"yu");
}
int main(void)
{
ILI9341_Init(); //LCD 初始化
XPT2046_Init();//触摸屏初始化
//从FLASH里获取校正参数,若FLASH无参数,则使用模式3进行校正
Calibrate_or_Get_TouchParaWithFlash(3,0);
USART_Config();
LED_GPIO_Config();
ILI9341_GramScan ( 3 );
//绘制触摸画板界面
Palette_Init(LCD_SCAN_MODE);
while ( 1 )
{
//触摸检测函数,本函数至少10ms调用一次
XPT2046_TouchEvenHandler();
LCD_Test();
}
}
实现:
触摸屏控制Led灯点亮