第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  电容触摸 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic567922.html

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

推荐阅读

利用DS18B20测温,并通过LCD1602 显示 proteus仿真 +DS1302时钟模块
main.c#include<reg52.h>#include<onewire.h>#include<LCD.h>#include<ds1302.h>#define uchar unsigned char#define uint unsigned intuchar code Write_addr [] ={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写地址uchar code Read_addr [] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读地址uchar Time [7] = {0x50,0x59,0x23,
发表于 2022-08-11
利用DS18B20测温,并通过<font color='red'>LCD</font>1602 显示 proteus仿真 +DS1302时钟模块
51单片机脉冲信号的计数和LCD显示
设计目标和思路在个人剂量仪开发的过程中,从探头输出的核脉冲信号经过后期放大,成形,滤波以及甄别之后,成为一系列脉冲信号输出,这种脉冲信号由于衰变的随机性,并不是固定频率的脉冲信号。我们本次设计就是针对这种脉冲进形脉冲信号的计数以及在LCD1602显示屏上面的显示。这是C语言的代码部分#include"reg51.h" #include <stdio.h>#include <math.h>#include <string.h>#include <intrins.h>#define uint8_t unsigned char //0-255#define uint16
发表于 2022-08-10
51单片机脉冲信号的计数和<font color='red'>LCD</font>显示
HLK-W801-LVGL8之LCD驱动
前言接着开始第二部分,LCD驱动的移植工作链接:第一部分源码移植这一篇主要说明在LCD移植中的思路及遇到问题的解决方案LCD驱动思路了解显示驱动芯片的基本使用和寄存器的说明显示屏的默认参数为:尺寸:240 RBG x320 dots; 默认水平240,垂直320使用16bit数据接口并口驱动(8080并口),控制时序显示屏的初始化配置,电源相关,显示基本参数(显示方向,帧率,时钟等)这些相关寄存器说明移植平台GPIO驱动到显示驱动芯片的适配与调试主要为GPIO的驱动移植,参考硬件引脚,需要完成控制IO和16bit并口IO驱动读写,这里考虑到IO设置执行速度,未使用SDK中的IO应用接口,而是重新通过宏定义方式来完成GPIO的驱动设置
发表于 2022-08-09
HLK-W801-LVGL8之<font color='red'>LCD</font>驱动
嵌入式开发(S5PV210)——LCD显示器
1、LCD介绍1.LCD(Liquid Crystal Display)俗称液晶,这种材料的一大特点就是在电信号的驱动下液晶分子进行旋转,旋转会影响透光性,不同的透光性会透过不同的颜色的光,于是我们便看到显示屏上五颜六色的画面。2.LCD是被动发光,LCD显示屏有一个背光板发出白光,液晶分子只是决定哪些波长的光透过去被人看到,但液晶本身并不会发光。这有点像月亮,本身不发光,被人们看到发光是反射太阳的光。3.与之相对就有主动发光,比如CRT显示器和LED显示器。4.应用领域:液晶显示器使用在电视机、手机、电脑等;户外大屏幕基本是使用LED,因为液晶是被动发光,背光强度有限,在户外光照这么强的境况下,根本看不清。2、LCD显示的主要相关
发表于 2022-08-01
嵌入式开发(S5PV210)——<font color='red'>LCD</font>显示器
lcd 接入 FSMC 的理解
一: fsmc不用GPIO口直接驱动液晶,是因为这种方法速度太慢,而FSMC是用来外接各种存储芯片的,所以其数据通信速度是比普通GPIO口要快得多的。TFT-LCD 驱动芯片的读写时序和SRAM的差不多,所以就可以用FSMC四块中的SRAM块来驱动LCD。SRAM有数据线和地址线,所以FSMC跟它匹配同样也有数据线和地址线,而LCD数据线跟地址线共用,通信时用RS端来区分线上是数据还是指令,RS高是数据,RS低是指令。fsmc的含义:fsmc简单的理解就是 存储控制器作用: 将总线事务转为存取器指令 简单地说就是翻译cpu指令控制存储器fsmc的框图:二: lcd部分//最重要的一点是 fsmc的sram跟lcd的时序是一致的 主要
发表于 2022-08-01
<font color='red'>lcd</font> 接入 FSMC 的理解
STM32F429 Cubemx配置Timer实现5ms一个中断
目的:在STM32F429实现一个5ms一个interrupt的中断,并且重复触发我们选用TIM2,可以看到TIM2是在APB1总线上,也可以看到APB1总线的 Clock是90M整个Cube的配置为:其中我要来说下几个参数:预分频器值(Prescaler value):此部分就是把clock source分频到一个你想要的频率,计数器时钟频率CK_CNT 等于fCK_PSC/ (PSC[15:0] + 1)比如我们APB1是90M,我们此部分设置90-1,得到的最终频率是90M/((90-1)+1) = 1MHz定时器周期(Period):我们设置预分频后得到1MHz,此部分想得到5ms,就是1M Hz/5000 = 200Hz,
发表于 2022-07-29
<font color='red'>STM32F429</font> Cubemx配置Timer实现5ms一个中断

推荐帖子

multisim里有没有可变直流信号源啊?从哪找啊?
multisim里有没有可变直流信号源啊?从哪找啊?multisim里有没有可变直流信号源啊?从哪找啊?
zhuxiaoying 嵌入式系统
有人询问NANDFLASH的寻址方式,简单说下
NandFlash结构与读写分析 NANDFlash的数据是以bit的方式保存在memorycell,一般来说,一个cell中只能存储一个bit。这些cell以8个或者16个为单位,连成bitline,形成所谓的byte(x8)/word(x16),这就是NANDDevice的位宽。这些Line会再组成Page,(NandFlash有多种结构,我使用的NandFlash是K9F1208,下面内容针对三星的K9F1208U0M),每页528Byte,每32个p
leang521 嵌入式系统
无线控制模块使用不同厂家的能否通用
现在无线遥控模块的使用越来越普遍,无线遥控模块的使用给我们的工业现场、家庭家居都带来了极大的便利,在带来方便的同时,很多人也对这些模块存在一些困惑。 无线遥控模块广泛地运用在车辆监控、遥控、遥测、小型无线网络、无线抄表、门禁系统、小区传呼、工业数据采集系统、无线标签、身份识别、非接触RF智能卡、小型无线数据终端、安全防火系统、无线遥控系统、生物信号采集、水文气象监控、机器人控制、无线485数据通信、数字音频、数字图像传输等领域中。 不同型号的433无线遥控模块可以通用的吗
dwzt 模拟电子
labview串口与硬件板卡(如果是launchpad SCI需添加一个RS232接口)的连接方法【转】
转一个对于初学者比较容易理解的labview串口连接方法,其可以方便的利用 串口查看dsp输出的温度信号,ADC转换结果,这比串口助手更能理解 dsp板卡与PC串口的通信, [本帖最后由平湖秋月于2013-1-2423:20编辑]labview串口与硬件板卡(如果是launchpadSCI需添加一个RS232接口)的连接方法【转】
平湖秋月 微控制器 MCU
Xilinx为器件添加二维码标记(转)
原文地址 想必大家对二维码都已经非常熟悉了,在我们的日常生活中处处都能和二维码打交道,随着智能手机的普及,我们可以扫描二维码完成收款/付款交易、查看商品或者商家信息等,可以说方便了大家的生活。 二维码其实是用某种特定的几何图形按照一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。其优点是存储数据量大,可以包含数字、字符以及中文文本等混合内容,有一定的容错性(在部分损坏以后可以正常读取),空间利用率高。 近日Xilinx宣布在其7系列器件(包括FPGA和Zynq-7000)
白丁 FPGA/CPLD
电容放电会寻找最短的回路?
电容放电会寻找最短的回路吗?如果专门安排一个泄放电阻,给它泄放电荷,那我想问,为什么该电荷非要走泄放电阻回路呢?为什么不会向后端的负载泄放? 电容放电会寻找最短的回路?
小太阳yy 模拟电子
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved