你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 4345|回复: 0

【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第三十一章 触摸屏实验

[复制链接]

50

主题

7

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2013-3-19 22:47:53 | 显示全部楼层 |阅读模式
 
<div style="padding-bottom: 5px; line-height: 1.5; background-color: rgb(255,255,255); margin: 0px; padding-left: 5px; padding-right: 5px; color: rgb(0,0,0); font-size: 12px; padding-top: 5px">
第三十一章 触摸屏实验

       本章,我们将介绍如何使用STM32来驱动触摸屏,ALIENTEK战舰STM32开发板本身并没有触摸屏控制器,但是它支持触摸屏,可以通过外接带触摸屏的LCD模块(比如ALIENTEK TFTLCD模块),来实现触摸屏控制。在本章中,我们将向大家介绍STM32控制ALIENTKE TFTLCD模块,使用软件模拟SPI来实现对TFTLCD模块的触摸屏控制,最终实现一个手写板的功能。本章分为如下几个部分:
31.1 触摸屏简介
31.2 硬件设计
31.3 软件设计
31.4 下载验证


31.1 触摸屏简介    
我们一般液晶所用的触摸屏,最多的就是电阻式触摸屏了(多点触摸属于电容式触摸屏,比如几乎所有智能机都支持多点触摸,它们所用的屏就是电容式的触摸屏),ALIENTEK TFTLCD自带的触摸屏属于电阻式触摸屏,下面简单介绍下电阻式触摸屏的原理。
电阻式触摸屏利用压力感应进行控制。电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层透明氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层、它的内表面也涂有一层涂层、在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把两层导电层隔开绝缘。 当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在X和Y两个方向上产生信号,然后送触摸屏控制器。控制器侦测到这一接触并计算出(X,Y)的位置,再根据获得的位置模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。
电阻屏的特点有:
1)是一种对外界完全隔离的工作环境,不怕灰尘、水汽和油污。
2)可以用任何物体来触摸,可以用来写字画画,这是它们比较大的优势。
3)电阻触摸屏的精度只取决于A/D转换的精度,因此都能轻松达到4096*4096。
从以上介绍可知,触摸屏都需要一个AD转换器, 一般来说是需要一个控制器的。ALIENTEK TFTLCD模块选择的是四线电阻式触摸屏,这种触摸屏的控制芯片有很多,包括:ADS7843、ADS7846、TSC2046、XPT2046和AK4182等。这几款芯片的驱动基本上是一样的,也就是你只要写出了ADS7843的驱动,这个驱动对其他几个芯片也是有效的。而且封装也有一样的,完全PIN TO PIN兼容。所以在替换起来,很方便。
ALIENTEK TFTLCD模块自带的触摸屏控制芯片为XPT2046。XPT2046是一款4导线制触摸屏控制器,内含12位分辨率125KHz转换速率逐步逼近型A/D转换器。XPT2046支持从1.5V到5.25V的低电压I/O接口。XPT2046能通过执行两次A/D转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。内部自带2.5V参考电压可以作为辅助输入、温度测量和电池监测模式之用,电池监测的电压范围可以从0V到6V。XPT2046片内集成有一个温度传感器。 在2.7V的典型工作状态下,关闭参考电压,功耗可小于0.75mW。XPT2046采用微小的封装形式:TSSOP-16,QFN-16(0.75mm厚度)和VFBGA-48。工作温度范围为-40℃~+85℃。
该芯片完全是兼容ADS7843和ADS7846的,关于这个芯片的详细使用,可以参考这两个芯片的datasheet。


31.2 硬件设计
本章实验功能简介:开机的时候先通过24C02的数据判断触摸屏是否已经校准过,如果没有校准,则执行校准程序,校准过后再进入手写程序。如果已经校准了,就直接进入手写程序,此时可以通过按动屏幕来实现手写输入。屏幕上会有一个清空的操作区域(RST),点击这个地方就会将输入全部清除,恢复白板状态。程序会设置一个强制校准,就是通过按KEY0来实现,只要按下KEY0就会进入强制校准程序。
所要用到的硬件资源如下:
1)  指示灯DS0
2)  KEY0按键
3) TFTLCD模块(带触摸屏)
4)  24C02
所有这些资源与STM32的连接图,在前面都已经介绍了,这里我们只针对TFTLCD模块与STM32的连接端口再说明一下,TFTLCD模块的触摸屏总共有5跟线与STM32连接,连接电路图如图31.2.1所示:

<span style="font-size: small">
图31.2.1 触摸屏与STM32的连接图    从图中可以看出,T_MISO、T_PEN、T_CS、T_MOSI和T_SCK分别连接在STM32的:PF8、PF10、PB2、PF9和PB1上。
31.3 软件设计
打开上一章的工程,首先在HARDWARE文件夹下新建一个TOUCH文件夹。然后新建一个touch.c和touch.h的文件保存在TOUCH文件夹下,并将这个文件夹加入头文件包含路径。
打开touch.c文件,在里面输入与触摸屏相关的代码,这里我们也不全部贴出来了,仅介绍几个重要的函数。
首先我们要介绍的是TP_Read_XY2这个函数,该函数专门用于从触摸屏控制IC读取坐标的值(0~4095),TP_Read_XY2的代码如下:
//连续2次读取触摸屏IC,且这两次的偏差不能超过
//ERR_RANGE,满足条件,则认为读数正确,否则读数错误.       
//该函数能大大提高准确度
//x,y:读取到的坐标值
//返回值:0,失败;1,成功。
#define ERR_RANGE 50 //误差范围
u8 TP_Read_XY2(u16 *x,u16 *y)
{
       u16 x1,y1;
      u16 x2,y2;
      u8 flag;   
    flag=TP_Read_XY(&x1,&y1);  
    if(flag==0)return(0);
    flag=TP_Read_XY(&x2,&y2);       
    if(flag==0)return(0);  
    if(((x21000)
              {
                     TP_Get_Adjdata();
                     break;
             }
      }
}    
TP_Adjust是此部分最核心的代码,在这里,给大家介绍一下我们这里所使用的触摸屏校正原理:我们传统的鼠标是一种相对定位系统,只和前一次鼠标的位置坐标有关。而触摸屏则是一种绝对坐标系统,要选哪就直接点哪,与相对定位系统有着本质的区别。绝对坐标系统的特点是每一次定位坐标与上一次定位坐标没有关系,每次触摸的数据通过校准转为屏幕上的坐标,不管在什么情况下,触摸屏这套坐标在同一点的输出数据是稳定的。不过由于技术原理的原因,并不能保证同一点触摸每一次采样数据相同,不能保证绝对坐标定位,点不准,这就是触摸屏最怕出现的问题:漂移。对于性能质量好的触摸屏来说,漂移的情况出现并不是很严重。所以很多应用触摸屏的系统启动后,进入应用程序前,先要执行校准程序。 通常应用程序中使用的LCD坐标是以像素为单位的。比如说:左上角的坐标是一组非0的数值,比如(20,20),而右下角的坐标为(220,300)。这些点的坐标都是以像素为单位的,而从触摸屏中读出的是点的物理坐标,其坐标轴的方向、XY值的比例因子、偏移量都与LCD坐标不同,所以,需要在程序中把物理坐标首先转换为像素坐标,然后再赋给POS结构,达到坐标转换的目的。
校正思路:在了解了校正原理之后,我们可以得出下面的一个从物理坐标到像素坐标的转换关系式:
                                          LCDx=xfac*Px+xoff;
                                          LCDy=yfac*Py+yoff;
其中(LCDx,LCDy)是在LCD上的像素坐标,(Px,Py)是从触摸屏读到的物理坐标。xfac,yfac分别是X轴方向和Y轴方向的比例因子,而xoff和yoff则是这两个方向的偏移量。
这样我们只要事先在屏幕上面显示4个点(这四个点的坐标是已知的),分别按这四个点就可以从触摸屏读到4个物理坐标,这样就可以通过待定系数法求出xfac、yfac、xoff、yoff这四个参数。我们保存好这四个参数,在以后的使用中,我们把所有得到的物理坐标都按照这个关系式来计算,得到的就是准确的屏幕坐标。达到了触摸屏校准的目的。
TP_Adjust就是根据上面的原理设计的校准函数,注意该函数里面多次使用了lcddev.width和lcddev.height,用于坐标设置,主要是为了兼容不同尺寸的LCD(比如320*480和320*240的屏都可以兼容)。其他的函数我们这里就不多介绍了,保存touch.c文件,并把该文件加入到HARDWARE组下。接下来打开touch.h文件,在该文件里面输入如下代码:
#ifndef __TOUCH_H__
#define __TOUCH_H__
#include "sys.h"
#define TP_PRES_DOWN 0x80  //触屏被按下  
#define TP_CATH_PRES 0x40  //有按键按下了                      
//触摸屏控制器
typedef struct
{
       u8 (*init)(void);                   //初始化触摸屏控制器
       u8 (*scan)(u8);                    //扫描触摸屏.0,屏幕扫描;1,物理坐标;      
       void (*adjust)(void);             //触摸屏校准
       u16 x0;                               //原始坐标(第一次按下时的坐标)
       u16 y0;
       u16 x;                                //当前坐标(此次扫描时,触屏的坐标)
       u16 y;                                                 
       u8  sta;                              //笔的状态
                                                 //b7:按下1/松开0;
                               //b6:0,没有按键按下;1,有按键按下.
////////////////////////触摸屏校准参数/////////////////////////                                                    
       float xfac;                                  
       float yfac;
       short xoff;
       short yoff;        
//新增的参数,当触摸屏的左右上下完全颠倒时需要用到.
//touchtype=0的时候,适合左右为X坐标,上下为Y坐标的TP.
//touchtype=1的时候,适合左右为Y坐标,上下为X坐标的TP.
       u8 touchtype;
}_m_tp_dev;
extern _m_tp_dev tp_dev;          //触屏控制器在touch.c里面定义
//与触摸屏芯片连接引脚       
#define PEN        PFin(10)       //PF10 INT
#define DOUT      PFin(8)        //PF8  MISO
#define TDIN        PFout(9)       //PF9  MOSI
#define TCLK       PBout(1)       //PB1  SCLK
#define TCS         PBout(2)       //PB2  CS 
void TP_Write_Byte(u8 num);                                  //向控制芯片写入一个数据
u16 TP_Read_AD(u8 CMD);                                    //读取AD转换值
u16 TP_Read_XOY(u8 xy);                                     //带滤波的坐标读取(X/Y)
u8 TP_Read_XY(u16 *x,u16 *y);                             //双方向读取(X+Y)
u8 TP_Read_XY2(u16 *x,u16 *y);                           //带加强滤波的双方向坐标读取
void TP_Drow_Touch_Point(u16 x,u16 y,u16 color);  //画一个坐标校准点
void TP_Draw_Big_Point(u16 x,u16 y,u16 color);      //画一个大点
u8 TP_Scan(u8 tp);                                                        //扫描
void TP_Save_Adjdata(void);                                   //保存校准参数
u8 TP_Get_Adjdata(void);                                       //读取校准参数
void TP_Adjust(void);                                             //触摸屏校准
u8 TP_Init(void);                                                    //初始化                                           
void TP_Adj_Info_Show(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2,u16 x3,u16 y3,u16 fac);
//显示校准信息             
#endif
上述代码,我们定义了_m_tp_dev结构体,用于管理和记录触摸屏相关信息,在外部调用的时候,我们一般直接调用tp_dev的相关成员函数/变量屏即可达到需要的效果。这样种设计简化了接口,另外管理和维护也比较方便,大家可以效仿一下。其他部分我们不做多的介绍,最后我们打开test.c,修改代码如下:
//清屏,重新装载对话界面                                    
void Load_Drow_Dialog(void)
{
       LCD_Clear(WHITE);//清屏  
      POINT_COLOR=BLUE;//设置字体为蓝色
       LCD_ShowString(lcddev.width-24,0,200,16,16,"RST");//显示清屏区域
      POINT_COLOR=RED;//设置画笔蓝色
}                                                         
int main(void)
{           
       u8 key;
       u8 i=0;      
      Stm32_Clock_Init(9);    //系统时钟设置
       uart_init(72,9600);      //串口初始化为9600
       delay_init(72);                  //延时初始化
       LED_Init();                 //初始化与LED连接的硬件接口
       LCD_Init();                  //初始化LCD
       usmart_dev.init(72);      //初始化USMART       
       KEY_Init();                //按键初始化          
      POINT_COLOR=RED;//设置字体为红色
       LCD_ShowString(60,50,200,16,16,"WarShip STM32");   
       LCD_ShowString(60,70,200,16,16,"TOUCH TEST");      
       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
       LCD_ShowString(60,110,200,16,16,"2012/9/11");
     LCD_ShowString(60,130,200,16,16,&quotress KEY0 to Adjust"); 
      tp_dev.init();
       delay_ms(1500);
       Load_Drow_Dialog();                                                                         
       while(1)
       {
             key=KEY_Scan(0);
              tp_dev.scan(0);              
              if(tp_dev.sta&TP_PRES_DOWN)               //触摸屏被按下
              {    
<span style="background-color: rgb(229,229,229)"><span style="font-size: small">                    if(tp_dev.x

《STM32开发指南》第三十一章 触摸屏实验.rar

下载

622.08 KB, 下载次数: 51, 下载积分: ST金币 -1

实验26 触摸屏实验.rar

下载

142.04 KB, 下载次数: 49, 下载积分: ST金币 -1

回复

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版