基于STM32F429 的 FreeRTOS 环境下 LCD1602驱动实现

2023-05-16

本文是基于STM32F429在FreeRTOS下的HAL库开发,并验证在多任务不同优先级情况下运行情况。

LCD1602介绍:

 

 是一个只能显示字母、数字、符号的点阵型液晶模块。一行可以显示16个字符,可以显示两行,所以叫做1602。

 引脚定义:

 

数据和命令发送时序:

cubeMx引脚

引脚定义
LCD1602_D1PB15
LCD1602_D2PA2
LCD1602_D3PA3
LCD1602_D4PA4
LCD1602_D5PA5
LCD1602_D6PA6
LCD1602_D7PA7
LCD1602_D8PA8
LCD1602_RSPB12
LCD1602_RWPB13
LCD1602_ENPB14

创建三个任务,其中任务“Task_100HZ”实现LCD的显示,Task_200HZ 实现数据采集和计算工作,Task_5HZ 显示Task_200HZ 任务计算的结果

  /* definition and creation of Task_200HZ */
  osThreadDef(Task_200HZ, StartTask_200, osPriorityNormal, 0, 128);
  Task_200HZHandle = osThreadCreate(osThread(Task_200HZ), NULL);

  /* definition and creation of Task_100HZ */
  osThreadDef(Task_100HZ, StartTask_100HZ, osPriorityHigh, 0, 128);
  Task_100HZHandle = osThreadCreate(osThread(Task_100HZ), NULL);

  /* definition and creation of Task_5HZ */
  osThreadDef(Task_5HZ, StartTask_5HZ, osPriorityIdle, 0, 128);
  Task_5HZHandle = osThreadCreate(osThread(Task_5HZ), NULL);

 LCD1602.C  代码实现

 /******************************************************************************
  * 函数名称:void GPIO_Configuration()                           *
  * 函数功能:LCD1602引脚初始化                                                        *
  * 输入参数:无                                                   *
  * 返回值  :无                                                                *
  * 其他说明:                                                                    *
  ******************************************************************************/
 /*******************根据自己的硬件引脚做修改*****************************************/
 void GPIO_Configuration()
 {

     *   *
 }
 /******************************************************************************
  * 函数名称:void LCD1602_Init()                         *
  * 函数功能:LCD1602初始化                                                      *
  * 输入参数:无                                                   *
  * 返回值  :无                                                                *
  * 其他说明:                                                                    *
  ******************************************************************************/
 void LCD1602_Init()
 {
     GPIO_Configuration();           //初始化引脚
 
     LCD1602_Write_Cmd( 0x38 );      //显示模式设置
     delay_ms( 5 );
     LCD1602_Write_Cmd( 0x0c );      //显示开及光标设置
     delay_ms( 5 );
     LCD1602_Write_Cmd( 0x06 );      //显示光标移动位置
     delay_ms( 5 );
     LCD1602_Write_Cmd( 0x01 );      //显示清屏
     delay_ms( 5 );  
 }
 void DATAOUT( cmd ){
     HAL_GPIO_WritePin( LCD1602_D1_GPIO_Port, LCD1602_D1_Pin, ((cmd>>0)&0x01));
         HAL_GPIO_WritePin( LCD1602_D2_GPIO_Port, LCD1602_D2_Pin, ((cmd>>1)&0x01));
         HAL_GPIO_WritePin( LCD1602_D3_GPIO_Port, LCD1602_D3_Pin, ((cmd>>2)&0x01));
         HAL_GPIO_WritePin( LCD1602_D4_GPIO_Port, LCD1602_D4_Pin, ((cmd>>3)&0x01));
         HAL_GPIO_WritePin( LCD1602_D5_GPIO_Port, LCD1602_D5_Pin, ((cmd>>4)&0x01));
         HAL_GPIO_WritePin( LCD1602_D6_GPIO_Port, LCD1602_D6_Pin, ((cmd>>5)&0x01));
         HAL_GPIO_WritePin( LCD1602_D7_GPIO_Port, LCD1602_D7_Pin, ((cmd>>6)&0x01));
       HAL_GPIO_WritePin( LCD1602_D8_GPIO_Port, LCD1602_D8_Pin, ((cmd>>7)&0x01));
 }
 
 /******************************************************************************
  * 函数名称:void LCD1602_Write_Cmd(u8 cmd)                          *
  * 函数功能:写命令函数                                                           *
  * 输入参数:    cmd 命令                                                      *
  * 返回值  :无                                                                *
  * 其他说明:                                                                    *
  ******************************************************************************/
 void LCD1602_Write_Cmd( u8 cmd )
 {
     LCD_RS_Clr();
     LCD_RW_Clr();
       DATAOUT( cmd );
       delay_us( 500 );//这个延迟时间是实际调试结果,太短会造成显示不全的问题
     LCD_EN_Set();   
     delay_us( 500 );
     LCD_EN_Clr();
 }
 
 /******************************************************************************
  * 函数名称:void LCD1602_Write_Dat(u8 date)                         *
  * 函数功能:写数据函数                                                           *
  * 输入参数:    date 数据                                                     *
  * 返回值  :无                                                                *
  * 其他说明:                                                                    *
  ******************************************************************************/
 void LCD1602_Write_Dat( u8 data )
 {
     LCD_RS_Set();
     LCD_RW_Clr();
       DATAOUT( data );
     delay_us( 500 );
     LCD_EN_Set();
     delay_us( 500 );
     LCD_EN_Clr();
 }
 
 /******************************************************************************
  * 函数名称:void LCD1602_ClearScreen()                          *
  * 函数功能:1602清屏函数                                                            *
  * 输入参数:无                                                       *
  * 返回值  :无                                                                *
  * 其他说明:                                                                    *
  ******************************************************************************/
 void LCD1602_ClearScreen()
 {
     LCD1602_Write_Cmd( 0x01 );
 }
 
 /******************************************************************************
  * 函数名称:void LCD1602_Set_Cursor(u8 x, u8 y)                         *
  * 函数功能:设置1602位置函数                                                    *
  * 输入参数:x 横坐标 y 纵坐标                                                     *
  * 返回值  :无                                                                *
  * 其他说明:                                                                    *
  ******************************************************************************/
 void LCD1602_Set_Cursor( u8 x, u8 y )
 {
     u8 addr;
 
     if ( y == 0 )
         addr = 0x00 + x;
     else
         addr = 0x40 + x;
     LCD1602_Write_Cmd( addr | 0x80 );
 }
 
 /******************************************************************************
  * 函数名称:void LCD1602_Show_Str( u8 x, u8 y, u8 *str )                            *
  * 函数功能:指定位置显示字符串函数                                                   *
  * 输入参数:x 横坐标 y 纵坐标     *str 字符串                                  *
  * 返回值  :   无                                                             *
  * 其他说明:                                                                    *
  ******************************************************************************/
 void LCD1602_Show_Str( u8 x, u8 y, u8 *str )
 {
     LCD1602_Set_Cursor( x, y );
     while ( *str != '\0' )
     {
         LCD1602_Write_Dat( *str++ );
     }
 }

/* USER CODE BEGIN Header_StartTask_100HZ */
void delay(u16 z)
{
    u16 x,y;
    for(x=z;x>0;x--)
        for(y=114;y>0;y--);
}
/**
* @brief Task_100HZ 任务 驱动 LCD1602
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask_100HZ */

void StartTask_100HZ(void const * argument)
{
  /* USER CODE BEGIN StartTask_100HZ */
    LCD1602_Init();
  /* Infinite loop */
  for(;;)
  {
        
        LCD1602_Write_Cmd(0x01); //清屏
        delay(10);
      LCD1602_Show_Str(0,0,"I want to bring");
        LCD1602_Show_Str(0,1,"out the secret");
        
        delay_ms(1500);
       LCD1602_Write_Cmd(0x01); //清屏
        delay(10);
        
    LCD1602_Show_Str(0,0,"of nature and");
        LCD1602_Show_Str(0,1,"apply them for");
        
        delay_ms(1500);
       LCD1602_Write_Cmd(0x01); //清屏
        delay(10);
        
    LCD1602_Show_Str(0,0,"the happiness of");
        LCD1602_Show_Str(0,1,"man.I don't know");
        
        delay_ms(1500);
       LCD1602_Write_Cmd(0x01); //清屏
        delay(10);        
        
      LCD1602_Show_Str(0,0,"of any better s-");
        LCD1602_Show_Str(0,1,"-ervice to offer");
        
        delay_ms(1500);
       LCD1602_Write_Cmd(0x01); //清屏
        delay(10);    
        
      LCD1602_Show_Str(0,0,"for the short t-");
        LCD1602_Show_Str(0,1,"-ime we are in");
        
        delay_ms(1500);
       LCD1602_Write_Cmd(0x01); //清屏
        delay(10);            

      LCD1602_Show_Str(0,0,"the world.");
        LCD1602_Show_Str(0,1,"---Thomas Edison");
        
        delay_ms(1500);
;                    
        
        printf("LCD1206 test\r\n");

    osDelay(500);
  }
  /* USER CODE END StartTask_100HZ */
}

实验现象:

       以上在 StartTask_100HZ 任务 优先级最高的情况下,由于StartTask_100HZ 的运行时间占用资源好几秒 只有在程序运行到最后  osDelay(500) 之后才进入堵塞状态,释放资源,导致 其他任务不能得到及时的运行。

总结:

在FreeRTOS 中为了避免影响其他任务的实时运行,程序运行时间长的任务尽量降低优先级。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32F429 的 FreeRTOS 环境下 LCD1602驱动实现 的相关文章

随机推荐

  • 在Windows系统中 开机自动运行一个Python脚本 或者自动运行一个软件

    以前做过开机运行 xff0c 但是现在用的时候又给忘了 xff0c 所以本次来写一下步骤 博主做的是一个ftp服务器 xff0c 因为是在自己电脑上 xff0c 希望局域网内可以互相传文件 xff0c 所以希望开机之后能自动运行 对于Win
  • cas5.3.2单点登录-JDBC认证(密码MD5和密码加盐)(二)

    原文地址 xff0c 转载请注明出处 xff1a https blog csdn net qq 34021712 article details 80956047 王赛超 上一章搭建了单点登录的基本骨架 xff0c 但是它的用户名和密码是写
  • 多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测

    多控制器集群环境下 xff0c 基于LLDP和OpenFlow的网络拓扑检测 目录 多控制器集群环境下 xff0c 基于LLDP和OpenFlow的网络拓扑检测 一 实验目的 二 实验原理 三 实验任务 四 实验步骤 4 1 实验环境 4
  • P4连接ONOS——导入ONOS虚拟机

    补充 xff1a 2020年5月11日 13点07分 近期有同学私信我安装过程中有这个报错 xff0c 如下图 根据报错信息 xff0c 似乎是下载这个包服务器501出错 xff0c 很可能是因为内网无法下载这个包 我忘记说了 xff0c
  • ONOS链路发现源码

    ONOS链路发现源码 send LLDP by ynogpu private void sendProbes Long portNumber String portDesc if context packetService 61 61 nu
  • 手把手教你新建一个winform项目(史上最全)

    文章目录 前言 xff1a 第1步 打开Microsoft Visual Studio xff08 简称vs xff09 xff0c 本人这里使用的是Visual Studio 2017 专业版 xff0c 如下图 xff1a 1 2 Vi
  • 2021-01-20

    中文字库液晶模块12864示例程序范例 xff1a 液晶屏型号 xff1a JLX12864G 086 PC 3S 接口 xff1a 串行 中文字库 xff1a 带中文字库IC JLX GB2312 竖置横排 驱动IC UC1701X 与S
  • 前端开发中常见的浏览器兼容性问题及解决方案

    文章目录 前言一 浏览器四大内核二 主流兼容问题 xff08 一 xff09 浏览器引擎 xff08 二 xff09 兼容问题的原因 xff08 三 xff09 为什么浏览器会存在兼容性问题 xff08 四 xff09 处理兼容问题的思路1
  • 论文复现——Sphereface-Pytorch

    最近在写论文 xff0c 要做一些对比实验 xff0c 需要以Sphereface为基础 其实实验早该做了 xff0c 就是一直拖拖拖 唉拖延症患者 今天总算是把github上的代码跑通了 xff0c 赶紧做下小笔记 因为还要赶论文 xff
  • mysql学习-9.如何正确的使用索引

    1 索引的规则 1 1 等值匹配 假设索引 A select from table where A 61 xxx就是走索引的 1 2 最左侧列匹配 假设索引 A B select from table where A 61 xxx and
  • Python/matplotlib之【RuntimeWarning: More than 20 figures have been opened】

    Python matplotlib之 RuntimeWarning More than 20 figures have been opened 当绘图的过程中 xff0c 建立了大量的figure xff0c 就会报错 解决的方法 xff0
  • 【学习】《软件工程》期末考试卷A+参考答案

    2021 福师网院 软件工程 2020年期末考试卷A xff08 参考答案见底部 xff09 1 软件需求分析阶段的工作 xff0c 可以分为以下4个方面 xff1a 对问题的识别 分析与综合 编写需求分析文档以及 xff08 xff09
  • C#自定义控件

    一 开发环境和工具 1 WIN10系统 2 Visual Studio社区版 2019 xff08 C xff09 二 创建自定义控件窗体 添加一个自定义控件 xff0c 右键解决方案 xff0c 点击添加 xff0c 然后点击用户控件 选
  • vdo 虚拟数据优化器详解以及配置

    VDO 我的博客 xff1a https blog itwk cc vdo xff08 虚拟数据优化器 xff09 是一个内核模块 xff0c 目的是通过重删 xff08 重复数据删除 xff09 减少磁盘的的空间占用 xff0c 以及减少
  • ROS 自定义消息类型方法

    流程 1 在package中新建文件夹名为msg 2 在msg文件夹中创建消息 xff08 此处以my msg msg xff09 为例 xff0c 注意的是要以msg为后缀名 内容举例如下 xff1a int32 data1 float6
  • 计算机网络第七版笔记--第一章

    第一章概述 1 1 计算机网络在信息时代中的作用 1 互联网是覆盖全球的 xff0c 具有两个重要基本特点 xff0c 即连通性和共享 1 2互联网的概述 1 2 1网络的网络 1 计算机网络 xff08 简称网络 xff09 由若干结点
  • 0.1+0.2不等于0.3 原因

    在计算机进行数字计算时会先将十进制转化为二进制进行计算 xff0c 由于二进制表示的有限数字不能超过 52 位在 JavaScript 里是不能精确存储的 xff0c 计算机进行了四舍五入这时造成了数字误差导致计算结果不为0 3 总结 xf
  • mac 终端 配置代理

    即使打开代理 xff0c mac终端默认不走 xff0c 需要配置 一 复制终端代理命令 export http proxy 61 http 127 0 0 1 1089 export https proxy 61 http 127 0 0
  • 【linux】安装Linux的交叉编译工具链

    1 linux中装软件的特点 linux中安装软件比windows中复杂 linux中安装软件一般有以下几种方法 xff1a 第一种 xff1a 在线安装 譬如ubuntu中使用apt get install vim来安装vim软件 第二种
  • 基于STM32F429 的 FreeRTOS 环境下 LCD1602驱动实现

    本文是基于STM32F429在FreeRTOS下的HAL库开发 xff0c 并验证在多任务不同优先级情况下运行情况 LCD1602介绍 xff1a 是一个只能显示字母 数字 符号的点阵型液晶模块 一行可以显示16个字符 xff0c 可以显示