第44章 STM32F429的LTDC应用之LCD电阻触摸和电容触摸

发布者:快乐飞翔最新更新时间:2022-04-28 来源: eefocus关键字:STM32F429  LTDC  LCD  电容触摸 手机看文章 扫描二维码
随时随地手机看文章

44.1 初学者重要提示

学习本章节前,务必优先学习第40章,需要对LTDC的基础知识和HAL库的几个常用API有个认识。


LTDC驱动设计和相关问题在第41章有详细说明。


电阻触摸支持2点和4点校准,而电容屏无需校准。


电阻触摸校准解决的是触摸板的线性度问题,而飞点要另外处理,当前程序已经做了支持。总的来说,V6配套的电阻触摸方案已经比较成熟,可以放心用于项目。


44.2 电阻触摸和电容触摸相关知识

这部分知识点在第42章的2.2小节有详细说明,必看。


44.3 电阻屏硬件设计

电阻触摸STMPE811的原理图如下:

通过STMPE811的原理图要了解以下几点:


I2C的两根通信线I2C_SCL和I2C_SDA的上拉电阻在V7的主板上。


原理图右侧的GPIO-0到GPIO-7可以作为扩展IO使用,支持输入和输出。其中GPIO-4到GPIO-7用于电阻触摸校准(使用那个IO是可以配置的)。


对于X-,X+,Y-和Y+,只要不是X和Y进行组合,其它组合方式可以随意接,配套的触摸校准算法都可以正常识别。


44.4 电容屏硬件设计

电容触摸主要有三种:FT5X06,GT911和GT811,其中GT811已经停产。下面是FT5X06和GT911触摸板效果(触摸板和触摸芯片是一体的):

触摸芯片已经集成到柔性PCB上,且已经校准好。用户使用的话,直接通过I2C方式读取数据即可。下面是电容触摸板引出的引脚:

注意I2C_SDK和I2C_SCL的上拉电阻在V7主板上。


44.5 电阻触摸驱动设计

下面将电阻触摸程序设计中的相关问题逐一为大家做个说明。


44.5.1 STMPE811的驱动实现

电阻触摸要比电容触摸麻烦很多,因为电阻触摸要做校准,还要做滤波,否则采集回来的触摸值会抖动或者出现飞点,出现这种情况的主要原因是电阻触摸板的线性度不够好。开发板电阻屏使用的触摸芯片是STMPE811,这个芯片其实就是12位分辨率的ADC,用来采集电阻触摸板的X轴ADC值和Y轴ADC值,然后按照一定的线性关系将ADC值转换为实际的坐标值。其中这个线性关系是通过触摸校准建立起来的,每次采集的X轴和Y轴ADC就可以代入这个线性关系,从而获得实际的坐标值。


总的来说,STMPE811的驱动不难实现,可以结合STMPE811的数据手册:http://www.armbbs.cn/forum.php?mod=viewthread&tid=23306 研究开发板提供的驱动配置。配置好后仅需要提供读取的X轴,Y轴的ADC值以及触摸按下状态(判断STMPE811的中断输出引脚就可以了,如果有触摸,这个引脚输出低电平,反之,输出高电平。通过判断这个引脚就可以选择是否读取X轴,Y轴的ADC值,避免不必要的操作)。这些函数在bsp_ts_stmpe811.c文件实现。而触摸值滤波,触摸扫描和触摸校准是在bsp_ts_touch.c文件里面实现。


下面是清除触摸中断标志函数和X轴,Y轴的ADC值读取函数,这些函数被bsp_touch.c文件所调用,而函数TOUCH_PenInt是在bsp_ts_touch.c文件,这里也贴出来。


1.    /*

2.    ******************************************************************************************************

3.    *    函 数 名: TOUCH_PenInt

4.    *    功能说明: 判断触摸按下

5.    *    形    参: 无

6.    *    返 回 值: 0表示无触笔按下,1表示有触笔按下

7.    ******************************************************************************************************

8.    */

9.    uint8_t TOUCH_PenInt(void)

10.    {

11.        if ((TP_INT_GPIO_PORT->IDR & TP_INT_PIN) == 0)

12.        {

13.            return 1;

14.        }

15.        return 0;

16.    }

17.    

18.    /*

19.    ******************************************************************************************************

20.    *    函 数 名: STMPE811_ClearInt

21.    *    功能说明: 清楚触笔中断

22.    *    形    参: 无

23.    *    返 回 值: 无

24.    ******************************************************************************************************

25.    */

26.    void STMPE811_ClearInt(void)

27.    {

28.        STMPE811_WriteReg1(REG811_INT_STA, 0xFF); 

29.    }

30.    

31.    /*

32.    ******************************************************************************************************

33.    *    函 数 名: STMPE811_ReadX

34.    *    功能说明: 读取X坐标adc

35.    *    形    参: 无

36.    *    返 回 值: X坐标值adc

37.    ******************************************************************************************************

38.    */

39.    uint16_t STMPE811_ReadX(void)

40.    {

41.        /* 按照 XY 读取模式,连续读取3字节数据,然后分解出X,Y     

42.         |  byte0   |     byte1      |   byte2  |  

43.         | X[11:4], | X[3:0],Y[11:8] | Y[7:0]   |

44.        */

45.        uint8_t buf[3];

46.        

47.    #if 0

48.        STMPE811_ReadBytes(buf, REG811_TSC_DATA1, 3);

49.        

50.        s_AdcX = ((uint16_t)buf[0] << 4) | (buf[1] >> 4);

51.        s_AdcY = ((uint16_t)(buf[1] & 0xF) << 8) | buf[2];    

52.    #else

53.        if (STMPE811_ReadReg1(REG811_TSC_CTRL) & 0x80)

54.        {    

55.            STMPE811_ReadBytes(buf, REG811_TSC_DATA1, 3);

56.            

57.            s_AdcX = ((uint16_t)buf[0] << 4) | (buf[1] >> 4);

58.            s_AdcY = ((uint16_t)(buf[1] & 0xF) << 8) | buf[2];

59.            

60.            #if 0

61.            /* for debug */

62.            {

63.                static int32_t s_t1 = 0;

64.                int32_t tt;

65.                            

66.                tt = bsp_GetRunTime();

67.                if (tt - s_t1 > 1000)

68.                {

69.                    printf("rn");

70.                    s_t1 = tt;

71.                }

72.                printf("(%7d) %5d %5drn", tt, s_AdcX, s_AdcY);

73.            }

74.            #endif

75.        }

76.        else

77.        {

78.            s_AdcX = 0;

79.            s_AdcY = 0;

80.        }

81.    #endif

82.        

83.        return s_AdcX;

84.    }

85.    

86.    /*

87.    ******************************************************************************************************

88.    *    函 数 名: STMPE811_ReadX

89.    *    功能说明: 读取Y坐标adc

90.    *    形    参: 无

91.    *    返 回 值: Y坐标值adc

92.    ******************************************************************************************************

93.    */

94.    uint16_t STMPE811_ReadY(void)

95.    {

96.        return  s_AdcY;

97.    }

下面将程序设计中的关键地方做个阐释:


  第9-16行,通过判断STMPE811的中断输出引脚的高低电平来判断触摸板是否被按下,如果有触摸,这个引脚输出低电平,反之,输出高电平。通过判断这个引脚就可以选择是否读取X轴,Y轴的ADC值,避免不必要的操作。

  第26-29行,清除触摸中断标志,检测到触摸屏未被按下时,要做清除。

  第39-84行,读取X轴ADC数值。

  第94-97行,读取Y轴ADC数值。

44.5.2        电阻触摸扫描函数TOUCH_Scan

接下来再来看bsp_touch.c文件中STMPE811触摸扫描函数TOUCH_Scan的实现:


1.    /*

2.    ******************************************************************************************************

3.    *    函 数 名: TOUCH_Scan

4.    *    功能说明: 触摸板事件检测程序。该函数被周期性调用,每ms调用1次. 见 bsp_Timer.c

5.    *    形    参:  无

6.    *    返 回 值: 无

7.    ******************************************************************************************************

8.    */

9.    void TOUCH_Scan(void)

10.    {

11.        uint16_t usAdcX;

12.        uint16_t usAdcY;

13.        static uint16_t s_usXBuf[SAMPLE_COUNT];

14.        static uint16_t s_usYBuf[SAMPLE_COUNT];

15.        static uint8_t s_ucPos = 0;

16.        static uint8_t s_count = 0;

17.        static uint8_t s_down = 0;

18.        static uint16_t s_usSaveAdcX, s_usSaveAdcY; /* 用于触笔抬起事件,保存按下和移动的最后采样值 */

19.        static uint8_t s_ms = 0;

20.    

21.        if (g_GT811.Enable == 1)

22.        {

23.            GT811_Timer1ms();    /* 电容触摸屏程序计数器 */

24.            return;

25.        }

26.    

27.        if (g_GT911.Enable == 1)

28.        {

29.            GT911_Timer1ms();    /* 电容触摸屏程序计数器 */

30.            return;

31.        }    

32.        

33.        if (g_tFT5X06.Enable == 1)

34.        {

35.            FT5X06_Timer1ms();    /* 电容触摸屏程序计数器 */

36.            return;

37.        }

38.        

39.        /* 下面用于电阻触摸 */

40.        

41.        if (g_tTP.Enable == 0)    

42.        {

43.            return;

44.        }

45.        

46.        if (++s_ms >= 2)

47.        {

48.            return;

49.        }

50.        

51.        /* 2ms进入一次 */

52.        s_ms = 0;

53.        

54.        /* 触笔中断发生 */

55.        if (TOUCH_PenInt())

56.        {

57.            /* 获得原始的ADC值,未滤波 */

58.            usAdcX = STMPE811_ReadX();

59.            usAdcY = STMPE811_ReadY();

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ..[13]
关键字:STM32F429  LTDC  LCD  电容触摸 引用地址:第44章 STM32F429的LTDC应用之LCD电阻触摸和电容触摸

上一篇:第45章 STM32F429的图形加速器DMA2D的基础知识和HAL库API
下一篇:第43章 STM32F429的LTDC应用之汉字小字库和全字库制作

推荐阅读最新更新时间:2024-11-16 23:35

全球首条10.5代TFT-LCD生产线在安徽合肥封顶
封顶仪式 钟欣 摄   中新网合肥11月29日电(倪奇 赵强)全球首条10.5代TFT-LCD生产线29日上午在安徽合肥新站高新区内正式封顶。据悉,项目建筑面积约128万平米,相当于5个鸟巢体育馆的面积。   京东方合肥第10.5代TFT-LCD生产线投建于2015年12月,总投资400亿元。项目主要生产65英寸以上8K超高分辨率液晶显示屏,设计产能为每月9万片玻璃基板(3370mm×2940mm),预计2018年第一季度量产。   京东方科技集团股份有限公司总裁兼首席运营官刘晓东在致辞时说,该项目是全球第一条10.5代TFT-LCD生产线,建成后将奠定BOE在行业中的领导者地位。“厂房封顶标志着项目第一阶段建设的圆满成功,
[手机便携]
郭明錤:LCD版iPhone X生产受阻 9月才能量产
   苹果分析师郭明錤在早先从凯基证券离职之后,沉寂了很长一段时间。近日,郭明錤任职国内天风国际证券公司,再次曝料了2019年新款iPhone的更多信息。此前据郭明錤曝料,2019年,苹果将有三款iPhone新品推出,并均搭载了Face ID功能,其中一款6.1英寸的LCD版iPhone更是受到业界的广泛关注。   郭明錤表示这款6.1英寸的LCD屏幕的iPhone将会大大推动使用老款iPhone用户升级换代的脚步,因为在配置上,这款iPhone搭载了与iPhone X上相同的Face ID模组,在大多功能上都能够不落伍。此外其售价相比旗舰款的OLED屏幕iPhone而言,600-700美元(约合3958-4618元人民币)的售
[手机便携]
OLED有新对手了,低成本 高亮度优势的OLCD亮相
今年3月,FlexEnable公司正式面向市场推出了OLCD显示技术,近日有媒体报道,FlexEnable公司正在与显示器制造商合作,预计于2021年进行OLCD的批量生产。 在电视机领域,如今活跃在电视市场中的产品,主要分为三种面板类型,分别是QLED、OLED与LCD。 LCD就是我们目前接触最多的液晶技术,该技术高度成熟,在目前阶段产能最高,成品价格更低,在中低端产品中大范围应用。OLED大部分被运用在高端产品中,当然,高端也意味着高价。 目前,LCD技术已趋于成熟,所以生产成本和寿命相对有保障,OLED具备优秀色彩表现,对比度高,响应时间短等优势,但目前OLED有着难以克服的瓶颈,那就是成本和产品寿命问题。
[电源管理]
OLED有新对手了,低成本 高亮度优势的O<font color='red'>LCD</font>亮相
基于ARM9处理器S3C2410的LCD显示系统设计
引言 S3C2410是三星公司生产的基于ARM920T内核的RISC微处理器,其主频可达203MHz ,适用于信息家电、PDA、手持设备、移动终端等领域,本文介绍了基于S3C2410的显示系统的硬件电路及驱动软件设计方法。 TFT-LCD模块的时序要求 本显示模块选用的LQ080V3DG01是Sharp公司的TFT-LCD器件,该器件的分辨率为640×480,控制时序图如图1所示,时间参数如表1所列 。 硬件电路设计 在该显示系统的硬件电路中,S3C2410与LCD模块的连接是关键,S3C2410内部自带一个LCD驱动控制器,其接口可以与单色、灰度、彩色STN型和彩色TFT型的LCD直接相连,但
[电源管理]
s3c2440裸机-电阻触摸屏编程(7.触摸屏校准测试 及优化)
1,防止点击一个点,显示出5个点 Isr_Adc中同理也许要上报数据。 这里在touchscreen.c中还补充了上报压力值,当isr_adc上报data时,同时上报了压力值, 这样在ts_read_raw时能够读到压力值讯息。 分析下面这个函数: 当用户点击校准点A时,进入isr_Tc(), 检测到按下,启动adc,adc转换结束产生adc中断,进入isr_adc。然后adc上报坐标和压力值数据。 补充了rs_read_raw时,只有当松开时,也就是read raw读出来的压力值=0的时候才会返回数据。最上面的do while (pressure == 0)是为了过滤掉上一次松开后,下一次还没来得及点击就进入了get_
[单片机]
s3c2440裸机-<font color='red'>电阻</font><font color='red'>触摸</font>屏编程(7.<font color='red'>触摸</font>屏校准测试 及优化)
TCP/IP的以太网LCD电子标签系统设计
  近年来,由于电子商务的发展,物流业呈现出JIT运送普及化、小批量、多品种、高频率的货物运输等特点。在实际的生产作业中,对小批量、多品种、高频率货物的处理始终是一个难题。现有电子标签系统在控制上都是采用现场总线技术。但这种技术在信息集成方面存在许多不足,如:   ①已有的现场总线标准过多,仅IEC国际标准就包含了8个类型,未能统一到单一标准上来,多种现场总线并存已成定局。   ②不同类型的现场总线设备均配有专用的通信协议,互相之间不能兼容,无法实现互操作,无法协同工作,也无法实现信息的无缝集成。   为了解决同一控制系统中多种现场总线的集成问题,在一些工程中通常是利用某种标准技术(如OPC技术等)开发能够连接其现场总
[电源管理]
TCP/IP的以太网<font color='red'>LCD</font>电子标签系统设计
宸鸿提升LCD模块产能至4倍水平,利用率超过五成
中国台湾触控模块厂商 TPK-KY 宸鸿在2021 年第二季度末将LCD 面板模块产能扩大至4倍水平,不过受客户调整产品线影响,目前产能利用率仅超过50%。 据DIGITIMES报道,宸鸿总经理兼CEO谢立群表示,公司原本预计产能会在今年第三季度得到充分利用,但由于客户受材料供应短缺影响调整了产品线,宸鸿不得不推迟组装中尺英寸液晶模块。他预计,产能将在第四季度晚些时候提升至满载。 另外,据谢立群称,公司已经开始小批量出货大尺寸纳米银线触控产品,目前相关收入比重低于5%;同时也在与客户合作开发中小尺寸纳米银产品,预计今年底将至少有一个项目进入小量试产。 第二季度在大尺寸平板、笔记本电脑等需求强劲需求推动下,宸鸿业绩表现亮眼。当季合并
[手机便携]
便携设备LCD背光LED驱动方案简述
进入二十一世纪,能源消耗日益成为整个人类社会关注的焦点。出于对于照明的基本需求,如何更有效的利用各种能源产生更多的照明,成为探索新的照明技术的巨大驱动力。从原始的燃料照明到白炽灯,从荧光灯到各种发光材料的探索,催生出LED照明技术。在如今社会,各种媒体设备照明环境需求的差异化,进一步促进了人类探索如何利用各种高亮度LED进行照明。LED在照明方面的应用已经吸引广泛关注。 LED基本原理及性能特点 首先我们来介绍一下LED的基本原理以及性能特点。LED的基本结构是一块电致发光的半导体材料,置于一个有引线的架子上,然后四周用环氧树脂密封,起到保护内部芯线的作用,所以LED的抗震性能好。发光二极管的核心部分是由p型半导体
[手机便携]
便携设备<font color='red'>LCD</font>背光LED驱动方案简述

推荐帖子

漏电保护开关的正确选用与运行维护
漏电保护开关的正确选用与运行维护http://www.iacmall.com/news-4-2622.html或下载附件漏电保护开关的正确选用与运行维护
锐特0086 移动便携
DM8148 开发板研发记录
ThistutorialisusefulforHardwareandSoftwareengineers.ForHWengineersitdemonstrateshowtobuildLinuxforaboardandSoftwareengineerswillfindheresomeusefulcommandsforusingTIEZSDK.Beforeyoustart–installTIEZSDKasdesc
DM8148 DSP 与 ARM 处理器
求助 关于AD9854的
小弟自己做了个AD9854的板子,这一上电后线性电源有110MA,寄存器什么都没有操作!还有20M的系统晶振,UD管脚只有153K,应该默认是八分频的吧,请教大侠们这正常吗??求助关于AD9854的现在updata信号输出正常了,就是改写寄存器能改变出正确的UPDATA频率,可是输出就是没有小弟用的是Singletone模式有哪些特别要注意的寄存器使能没,write_register(OSK_S,0x00);20H的寄存器打成00了已经,哪位大侠帮帮忙?!
yufenzhilang DIY/开源硬件专区
纳米CMOS电路和物理设计
本书将纳米工艺、器件可制造性、先进电路设计和相关物理实现等内容整合到一起,形成了一套先进的半导体技术,探讨了器件和工艺的新发展,提供了设计考虑,重点关注了技术与设计的相互影响,并且描述了可制造性设计和波动性的影响。重要的主题包括纳米CMOS工艺缩小问题及其对设计的影响;亚波长光刻;运行问题的物理与理论以及解决方案;可制造性设计和波动性。本书适合集成电路设计者和该领域的专业人员阅读。https://download.eeworld.com.cn/detail/%E6%8A%9B%E7%A0
arui1999 下载中心专版
单片机来电显示器的设计与实现
摘要:介绍一种利用单片机AT89C52接收并显示电话主叫号码的来电显示器。该显示器在被叫挂机状态下接收以频移键控(FSK)方式传送的主叫识别信息,可显示主叫电话号码、呼叫日期、时间等信息,并可存储多达120条的主叫号码信息。用户使用上、下翻转键及删除键可方便地查阅或删除来电信息。关键词:来电显示单片机AT89C52FSKMC145447引言主叫识别信息传送CID(CallingIdentityDelivery)是向被用户电话提供的一种服务业务。其方法是发端交换机
rain 单片机
用20脚2553芯片代替28脚芯片进行DIY的思路
用20脚2553芯片代替28脚芯片进行DIY的思路在收到板子第一天,就想把板子焊好。可是等我一看在TI网站上申请的2553芯片,傻眼了。寄来的是20脚的。怪我当时太粗心,收到申请的芯片时也没进行检查。没有办法,只好看看20脚2553芯片能否使用。下面分别是28脚2553芯片和20脚2553芯片的引脚图:通过对比,可以看出,28脚2553芯片和20脚的最大区别就是多了P3的8个引脚。厨房部分电路原理图如下:上图中,最下面8个脚对应的分别是两个按键、温湿
exiao DIY/开源硬件专区
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved