zoukankan      html  css  js  c++  java
  • 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、测试结果

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

     

  • 相关阅读:
    JVM内存模型
    学习Spring Boot:(十九)Shiro 中使用缓存
    学习Spring Boot:(十八)Spring Boot 中session共享
    学习Spring Boot:(十七)Spring Boot 中使用 Redis
    学习Spring Boot:(十六)使用Shiro与JWT 实现认证服务
    学习Spring Boot:(十五)使用Lombok来优雅的编码
    学习Spring Boot:(十四)spring-shiro的密码加密
    学习Spring Boot:(十三)配置 Shiro 权限认证
    学习Spring Boot:(十二)Mybatis 中自定义枚举转换器
    学习Spring Boot:(十一) 自定义装配参数
  • 原文地址:https://www.cnblogs.com/foxclever/p/7613015.html
Copyright © 2011-2022 走看看