第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-12 16:41

LCD12864 C语言驱动
#include reg52.h sbit RS=P2^0; sbit RW=P2^1; sbit EN=P2^2; sbit CS1=P2^3; sbit CS2=P2^4; sbit RST=P2^5; #define databus P0 #define uchar unsigned char #define startline 0xc0 #define displayon 0x3f #define startcolumn 0x40 #define page 0xb8 void init(); void clearscreen(uchar); void readbusy(); void writecmd(uchar); v
[单片机]
<font color='red'>LCD</font>12864 C语言驱动
献礼LCD诞生50周年:LG Display SID特别展馆迎未来
2018年5月22日,北京讯——一年一度的SID(The Society for information Display,国际信息显示学会)将于5月22日至25日在美国洛杉矶会展中心举办,在LCD诞生50周年的背景下,今年的SID也被赋予了特殊的意义。50年前,LCD掀起了平板显示的浪潮,改变了整个显示行业;今天,OLED正大步走来,显示行业又将迎来新的变革。 作为平板显示行业的领军者,LG Display以“Display Your Lifestyle” 为主题,在SID上专门设立了OLED TV、车载及移动显示、LCD 50周年纪念展三大特别展区,完美诠释了显示产业的过去与未来。 OLED闪耀SID 自发声电视再获年度
[家用电子]
献礼<font color='red'>LCD</font>诞生50周年:LG Display SID特别展馆迎未来
SEP3203与伪彩LCD驱动SSD1770的接口设计
简介: SSD1770是晶门科技公司于2005年推出的一款用于点阵显示系统的单片CMOS彩色STN LCD驱动控制器。目前,SSD1770已经应用于传统的工控机领域8080系列微控制器的连接,而在32位嵌入式系统领域内的应用还很少,本文主要研究LCD控制器SSD1770与ARM7TDMI内核的嵌入式微处理器SEP3203之间的系数连接及底层、上层软件开发,并最终在产品中得到应用。 1 系统介绍 1.1 系统构成 系统主要由SEP3203处理器和伪彩点阵型图形LCD控制器SSD1770组成,系统接口示意图如图1所示。 1.2 SEP3203概述 SEP3203是由东南大学国家专用集成电路(ASIC)与系统工
[单片机]
SEP3203与伪彩<font color='red'>LCD</font>驱动SSD1770的接口设计
单片机第14课:LCD使用
下面是LCD的电路,其中RD接P2^6;LCDE接P2^7,WR接P2^5。 #include reg51.h #define uint unsigned int #define uchar unsigned char sbit lcd_E = P2^7; sbit lcd_RS = P2^6; sbit lcd_WR = P2^5; uchar code table_show1 = Hello! ; uchar code table_show2 = I am ChenLu! ; void delay(uint time); void init_lcd(); void write_lcd_command(uchar comm
[单片机]
单片机第14课:<font color='red'>LCD</font>使用
单片机GPS定位LCD1602液晶显示经纬度海拔及时间日期实物制作
制作出来的实物图如下: 单片机源程序如下: #include main.h #include LCD1602.h #include GPS.h //定义变量 unsigned char KEY_NUM = 0; bit Page = 0; unsigned char xdata Display_GPGGA_Buffer ; unsigned char xdata Display_GPRMC_Buffer ; bit Flag_OV = 0; bit Flag_Calc_GPGGA_OK = 0; bit Flag_Calc_GPRMC_OK = 0; //****************************
[单片机]
单片机GPS定位<font color='red'>LCD</font>1602液晶显示经纬度海拔及时间日期实物制作
LCD和控制器接口电路
LCD和控制器接口电路图:在接口电路设计中,由于LM320160CCW液晶显示模块为5 V供电,而单片机为3.3 V供电,所以不能简单的彼此连接在一起,需要做电平处理。本次设计中选用741S245作为总线驱动器,并在单片机引脚加入5 V上拉电阻,这样即可保证信号的驱动能力,接口电路原理图如图3所示,其中P3和P7为单片机的I/O端口,RV1为可调电阻,用于调节液晶模块背光对比度。
[电源管理]
<font color='red'>LCD</font>和控制器接口电路
单片机中不带字库LCD液晶屏显示少量汉字
单片机中不带字库LCD液晶屏如何显示少量汉字,一般显示汉字的方法有1.使用带字库的LCD屏,2.通过SD卡或者外挂spi flash存中文字库,3.直接将需要的汉字取模存入mcu的flash中。 第一种方式最方便,带字库的液晶屏价格稍贵,第二种方式电路复杂价格也不便宜,第三种方法可以存储少量必要的汉字,经济实用。将汉字字模数据存储到大数组中,通过偏移值来取出需要的汉字显示。 typedef struct _GB16 // 汉字字模数据结构 { char Index ; // 汉字内码索引 char Msk ; // 点阵码数据 }GB16_Typedef; const GB16_Typedef GB
[单片机]
集创推出4K2K 大尺寸LCD TV全系列驱动芯片
北京集创北方科技有限公司 (ChipOne Technology (Beijing) Co., Ltd.) (以下简称集创)今日推出支持 4K2K 大尺寸LCD TV全系列驱动芯片,此次同时发布4颗LCD驱动芯片,其中包含2颗Source Driver: ICN9305,ICN9306。 2颗Gate Driver: ICN9506,ICN9508。相互搭配可以满足市面上最新的4K2K 大尺寸LCD驱动芯片的技术要求和应用需求,同时也可满足普通LCD 驱动芯片的技术要求和应用需求。 随着高分辨率面板在一些设备上的应用,不少用户对于4K2K高清液晶电视的期待也逐步升温,但要真的达到4K2K分辨率并非那么简单。集创这4颗支持4
[家用电子]
集创推出4K2K 大尺寸<font color='red'>LCD</font> TV全系列驱动芯片

推荐帖子

引脚接一个电容再接地
一个引脚接一个电容再接地,这个电容是在滤波吗?如果是的话其原理是什么?正在积累基础知识,请各位大神能否回答的详细一些。先谢谢了。引脚接一个电容再接地坛子里这方面的帖子很多,,,想积累知识,要多来浏览啊随便给你找个电容的帖子,好好积累知识十说电容经典https://bbs.eeworld.com.cn/forum....=%CB%B5%B5%E7%C8%DD电容的目的就是允许交流通过,阻断直流。虽然都是一个原理,但是根据用途名字比较多,是不是滤波就不清楚了。 谢谢
electrics 模拟电子
忙里偷闲发一下:开关电源PCB排版基本要点
摘要:开关电源排版是开发电源产品中的一个重要过程。许多情况下,一个在纸上设计得非常完美的电源可能在初次调试时无法正常工作,原因是该电源的排版存在着许多问题.详细讨论了开关电源排版的基本要点,并描述了一些实用的排版例子。关键词:排版;开关电源引言为了适应电子产品飞快的更新换代节奏,产品设计工程师更倾向于选择在市场上很容易采购到的AC/DC适配器,并把多组直流电源直接安装在系统的线路板上。由于开关电源产生的电磁干扰会影响到其电子产品的正常工作,正确的电源PCB排版就变得非常重要。开关电源PCB
framchina 电源技术
msp430FR5739最后一贴:PWM控制LED的测试
我的测试证明,MSP430FR5739中的PxSELC寄存器是个废品,没有意义的存在着。不知手中有5739板子的同僚们,你们的PxSELC是否起作用了呢?我的结论并不权威,甚至可能是谬论,不知道坛子里是否有权威人士出来解释一下,是我不会用还是这个片子确实存在这样的问题,强烈要求TI的专家出来给个解释。举个例子:按手册的描述,PxSELC是用来同时置位PxSEL0和PxSEL1的例如可以用P2SELC|=BIT0;来代替下面这两句P2SEL0|=BIT0;P2
lcofjp 微控制器 MCU
如何关闭窗口
我用WINCE开发了一个MFC窗口函数,在关闭窗口时程序还在执行,如果想退出的程序的话,要重载哪个函数?谢谢。。。如何关闭窗口是否有线程没有关闭,如果有的话,重载OnClose,之前先关闭所有的线程.另外在WM上,点叉确实是不关闭程序,只把程序放后台.如果我想点叉就关闭程序,应该重载哪个函数啊?。。。谢谢您的回复对窗口发WM_CLOSE的消息这样做的话必须重载这个点叉调用的函数,但是我现在就是不知道点叉的时候调用的是哪个函数?。。谢谢
莽原 嵌入式系统
[已解决]点灯都出问题了.
解决方案靠最前吧,主要是看错原理图:韵达不太给力,今早才到货,发完贴去淘宝确认.之前就完全没用过FPGA,好不容易编译通过了,却发现LED都没亮.结果是4个LED都是灭的.我的引脚绑定.IO第二功能复用KEY4是复位引脚,24脚是有源晶振LED低电平低电平点亮可是我一个LED都没亮还说我缺少了时序文件还有一个警告:Warning(15714):SomepinshaveincompleteI/Oassignments.RefertotheI/OAssi
cl17726 FPGA/CPLD
4个G 的AD封装库免费下载
有官方的,也有第三方的。非常全。应网友要求,做成了几个压缩包。因为压缩文件比较大,建议使用下载工具进行下载,以免下载中断造成文件下载不全而无法使用。3DConnector封装库3D元件封装库AD标准封装库AD官方封装库AD元件封装库1AD元件封装库2AD元件封装库3AD元件封装库4AD元件封装库5AD元件库:EDIF如何导入,使用封装库,请扫一扫帖中二维码,查看原文《一分钟学会使用AltiumDes
兰博 下载中心专版
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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