基于stm32驱动电阻屏点亮小灯
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
一、触摸屏是什么?
二、电阻触摸屏的原理
二、软件设计
1.编程要点
2.代码分析
前言
在野火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
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坐标终止点=矩形宽度*2button[0].end_y = COLOR_BLOCK_HEIGHT*2;//y坐标终止点=矩形高度*2button[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;ibutton[i].start_x && y
在主函数中添加显示英文字符和调用画板函数
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灯点亮
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
