基于stm32驱动电阻屏点亮小灯

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在野火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灯点亮

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值