STM32L476应用开发之四:触摸屏驱动与数据交互

数据交互可以说是任何一台仪器都需要的功能。我们的便携式气体分析仪,需要人来操作和配置,所以触摸屏就是我们必然的一个选择。本次我们计划采用3.5寸显示屏,串口通讯。

1、硬件设计

前面我们实验了串行通讯,这次来使用屏实现显示。这次我们计划使用的3.5寸触摸屏采用RS232串行通讯接口,其接口排布如下:

对于RS232接口我们采用了周立功RSM232模块来做实验,其推荐的连接方式如下图:

在实验过程中我们不需要这些保护措施,根据以上的分析我们可以对串口通讯做如下设计。RS232接口原理图如下:

2、软件设计

首先对串口部分做参数配置,波特率、数据位、停止位、奇偶校验等按要求配置好。接下来编写测试代码。

static void LCD_UART_Configuration(void)
{
  huart1.Instance = USART1;

  huart1.Init.BaudRate = 115200;

  huart1.Init.WordLength = UART_WORDLENGTH_8B;

  huart1.Init.StopBits = UART_STOPBITS_1;

  huart1.Init.Parity = UART_PARITY_NONE;

  huart1.Init.Mode = UART_MODE_TX_RX;

  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart1.Init.OverSampling = UART_OVERSAMPLING_16;

  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }

这次我们使用的屏串行通讯的协议是厂家自己定义的,不过数据帧结构较为简单,如下图所示:

而且功能也比较简单,只有5中功能码:访问寄存器的0x80和0x81、访问变量存储器的0x82和0x83以及访问曲线缓冲区的0x84,具体描述如下图所示:

根据以上描述我们可以编写对应不同对象访问的程序了。

(1)、写数据变量存储器

void WriteDataToLCD(uint16_t startAddress,uint8_t txData[],uint16_t length)
{
  /*命令的长度由帧头(2个字节)+数据长度(1个字节)+指令(1个字节)+起始地址(2个字节)+数据(长度为length)*/

  uint16_t cmd_Length=length+6;

  uint8_t cmd_VAR_Write[WriteDataCommandLength];

  cmd_VAR_Write[0]=0x5A;

  cmd_VAR_Write[1]=0xA5;

  cmd_VAR_Write[2]=(uint8_t)(length+3);

  cmd_VAR_Write[3]= FC_VAR_Write;

  cmd_VAR_Write[4]=(uint8_t)(startAddress>>8);//起始地址

  cmd_VAR_Write[5]=(uint8_t)startAddress;//起始地址

  for(int dataIndex=0;dataIndex<length;dataIndex++)
  {
    cmd_VAR_Write[dataIndex+6]=txData[dataIndex];
  }
  SendData(cmd_VAR_Write,cmd_Length);
}

(2)、读变量存储器数据

void ReadDataFromLCD(uint16_t startAddress,uint8_t readWordLength)
{
  //命令的长度由帧头(2个字节)+数据长度(1个字节)+指令(1个字节)+起始地址(2个字节)+读取的字长度(1个字节)

  uint16_t cmd_Length=7;

  uint8_t cmd_VAR_Read[]={0x5A,0xA5,0x04,FC_VAR_Read,0x00,0x00,0x00};//读数据命令

  cmd_VAR_Read[4]=(uint8_t)(startAddress>>8);//起始地址

  cmd_VAR_Read[5]=(uint8_t)startAddress;//起始地址

  cmd_VAR_Read[6]=readWordLength;//读取长度

  SendData(cmd_VAR_Read,cmd_Length);
}

(3)、写曲线缓冲区

void WriteCurveToLCD(uint8_t txData[],uint16_t length,uint8_t channelMode)
{
  //命令的长度由帧头(2个字节)+数据长度(1个字节)+指令(1个字节)+通道模式(1个字节)+数据(length,最多8个字)

  uint16_t cmd_Length=length+5;

  uint8_t cmd_Curve_Write[WriteCurveCommandLength];//写曲线缓冲区命令

  cmd_Curve_Write[0]=0x5A;

  cmd_Curve_Write[1]=0xA5;

  cmd_Curve_Write[2]=(uint8_t)(length+2);

  cmd_Curve_Write[3]= FC_Curve_Write;

  cmd_Curve_Write[4]=channelMode;

  for(int dataIndex=0;dataIndex<length;dataIndex++)
  {
    cmd_Curve_Write[dataIndex+5]=txData[dataIndex];
  }

  SendData(cmd_Curve_Write,cmd_Length);
}

(4)、写寄存器数据

void SetRegisterData(uint8_t regAddress,uint8_t txData[],uint16_t length)
{
  //命令的长度由帧头(2个字节)+数据长度(1个字节)+指令(1个字节)+寄存器地址(1个字节)+写的数据

  uint16_t cmd_Length=length+5;

  uint8_t cmd_Reg_Write[WriteCurveCommandLength];//写曲线缓冲区命令

  cmd_Reg_Write[0]=0x5A;

  cmd_Reg_Write[1]=0xA5;

  cmd_Reg_Write[2]=(uint8_t)(length+2);

  cmd_Reg_Write[3]= FC_REG_Write;

  cmd_Reg_Write[4]=regAddress;

  for(int dataIndex=0;dataIndex<length;dataIndex++)
  {
    cmd_Reg_Write[dataIndex+5]=txData[dataIndex];
  }

  SendData(cmd_Reg_Write,cmd_Length);
}

(5)、读寄存器数据

void GetRegisterData(uint8_t regAddress,uint8_t readByteLength)
{
  //命令的长度由帧头(2个字节)+数据长度(1个字节)+指令(1个字节)+寄存器地址(1个字节)+读取寄存器的字节长度(1个字节)

  uint16_t cmd_Length=6;

  uint8_t cmd_Reg_Read[]={0x5A,0xA5,0x03,FC_REG_Read,0x00,0x00};//读数据命令

  cmd_Reg_Read[4]=regAddress;

  cmd_Reg_Read[5]=readByteLength;

  SendData(cmd_Reg_Read,cmd_Length);
}

3、测试结果

完成上述编写后,接上显示屏下装,我们来查看显示效果:

时间: 2024-10-08 12:36:50

STM32L476应用开发之四:触摸屏驱动与数据交互的相关文章

UWP开发:APP之间的数据交互(以微信为例)

目录 说明 UWP应用唤醒方式 跟微信APP交互数据 APP之间交互数据的前提 说明 我们经常看到,在手机上不需要退到桌面,APP之间就可以相互切换,并且可以传递数据.比如我在使用知乎APP的时候,需要使用新浪微博账号登录,点击“微博登录”后,系统自动唤醒新浪微博APP,并将知乎请求登录的数据传给了微博APP(微博APP界面上可以看到是知乎请求登录授权),见下图:    如上所示,依次点击“微博登录”.“确定”,手机界面自动来回切换,不需要人为干预.另外,如果我们在知乎看到一篇有意思的文章,需要

S3C2440触摸屏驱动实例开发讲解

出处:http://www.embeddedlinux.org.cn/html/yingjianqudong/ 一.开发环境 主  机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二.前提知识 1.Linux输入子系统(Input Subsystem): 在Linux中,输入子系统是由输入子系统设备驱动层.输入子系统核心层(Input Core)和输入子系统事件处理层(Even

转载: linux2.6.37.4内核在XC2440开发板上移植(六)之触摸屏驱动移植

来自:http://blog.chinaunix.net/uid-22030783-id-3023527.html 内核自带s3c2440的触摸屏控制器驱动,属于input子系统的驱动,触摸屏驱动需要ADC驱动的支持,触摸屏驱动文件为:drivers/input/touchscreen/s3c2410_ts.c 在mach-xc2440.c文件中加入对触摸屏驱动的支持, 创建s3c2410_ts_mach_info平台数据 加入必要的头文件: #include <plat/ts.h> xc24

【视频】嵌入式Linux/Android驱动开发揭秘(1)触摸屏驱动开发

嵌入式Linux/Android驱动开发揭秘(1)触摸屏驱动开发 专题简介:自1971年,美国人SamHurst发明了世界上第一个触摸传感器以来,触摸屏技术不断革新,给了程序设计师和UI工程师无限的想象空间,它极大改善了终端用户对各种设备的操作方便程度,现在我们的日常生活如手机.平板等,已经很大程度上依赖于和习惯于使用和操作触摸屏.做为工程师,我们很有必要掌握触摸屏的工作原理和软件驱动方法,如果您对一窥如何在嵌入式中操控和使用触摸屏这一司空见惯却又神奇的技术感兴趣,敬请关注! 1.LINUX驱动

【转】树莓派3代3.5寸触摸屏驱动的安装(通过ssh安装)

这是用到的配件的树莓派3代 烧录好系统后,启动的树莓派,我的树莓派已经在一开始通过路由器和局域网,登陆了ssh,设置好了开机就能自动连接到电脑的360wifi,所以无论到哪 里,只要自己的笔记本电脑还在,就能连上树莓派,方便快捷的连上ssh.接下来,把触摸屏安装到树莓派上,登陆ssh,进入树莓派系统的命令行.  在这之后,我参考了淘宝网上一个专门卖kedei3.5寸触摸屏的教程,具体是哪个大神写的我也不知道,也不好放出淘宝链接给别人做免费广告.我就将教程简要的打一下吧! 本产品由KeDei开发,

NUC970平台触摸屏驱动移植

原理概述 1.首先要区分lcd和触摸屏,lcd是一个屏幕,触摸屏是贴在lcd上的两层膜. 2.四线电阻触摸屏的原理:触摸屏就是上下两层膜,比如上层代表x轴(XM:负端,XP:正端),下层代表y轴(YM:负端,YP:正端).当读取x轴坐标时,XP接3.3v,XM接地,从YM读取按下点的电压值作为模拟输入信号,再经过AD转换后就得到了x轴坐标.同理,当读取y轴坐标时,YP接3.3v,YM接地,从XM读取按下点的电压值作为模拟输入,再经过AD转换后就得到了y轴坐标. 触摸屏驱动程序采用中断方式对触摸笔

基于Windows CE6.0和 AK4182触摸屏驱动实现

本驱动实现了FreescaleImx515平台下的AK4182A 触摸屏采样功能.通过在WINDOWS CE平台上按照WINDOWS CE TOUCH DDSI 接口标准完成了所有的12 bit精度的数据采样功能. 该驱动实现了一个标准的WINDOWS CE 触摸屏驱动,使用中断(Interrupt)实现PEN DOWN 检测,通过定时器(Timer)中断采集Pen Move数据,并同时判断是否PEN UP状态.在此过程中,会通过点过滤算法和压力检测算法去除杂点和平滑,最后有效的原始位置数据会发

AM335x(TQ335x)学习笔记——触摸屏驱动编写

前面几篇文章已经通过配置DTS的方式完成了多个驱动的移植,接下来我们解决TQ335x的触摸驱动问题.由于种种原因,TQ335x的触摸屏驱动是以模块方式提供的,且Linux官方内核中也没有带该触摸屏的驱动源码,单纯的配置DTS是无法完成TQ335x的触摸驱动移植工作的,因此,本文参考内核中原有的pixcir_i2c_ts驱动编写TQ335x的触摸屏(TN92)驱动. 在之前移植TQ210时,我已经编写过TQ210的触摸屏驱动,我的TQ335x还是使用的TQ210的屏,因此,难度不是很大.这里需要说

Chrome扩展开发之四——核心功能的实现思路

目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式 3.Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载 4.Chrome扩展开发之四——核心功能的实现思路 如果你对GmailAssist感兴趣,可以在chrome商店中搜索“Gmail助手”,或点击这里直接访问商店来安装试用:如果你对GmailAssist的源码感兴趣,