欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 【瑞萨RA4L1-SENSOR套件测评】LCD 自定义数字显示

【瑞萨RA4L1-SENSOR套件测评】LCD 自定义数字显示

2025/5/2 11:37:38 来源:https://blog.csdn.net/qq_36654593/article/details/147652790  浏览:    关键词:【瑞萨RA4L1-SENSOR套件测评】LCD 自定义数字显示

【瑞萨RA4L1-SENSOR套件测评】LCD 自定义数字显示

本文介绍了 RA4L1 开发套件和瑞萨 e2 Studio 灵活软件包(FSP)实现 LCD 段码屏显示自定义数字的工程设计。

简介

在前一篇帖子中,我们介绍了 e2 studio 实现 LCD 显示工程构建、工程测试的主要流程,这里我们进一步实现 LCD 显示自定义数字的项目设计。

项目方案

考虑到板载 LCD 段码屏小数点的位置以及数字个数,

在这里插入图片描述

以及后面将要进行的 ADC 电压显示(0 至 3.3V)和水位传感器测量水位高度(0 到 40mm)的显示范围,

自定义数字的范围定义为 00.0099.99 ,保留两位小数;

实现该方案的整体思路如下

  • 主函数定义目标数字 float n = 3.14159265

  • 将自定义 float 小数扩大转换为 uint16 整数 uint16_t num = n * 100

  • 通过前篇帖子的数字显示方法,分别定义

    • 百分位(第6个数码管) - void calculatePercentiles(uint16_t Num);

    • 十分位(第5个数码管)- void calculateTenths(uint16_t Num);

    • 个位(第4个数码管,带小数点) - void calculateOnesDot(uint16_t Num);

    • 十位(第3个数码管)- void calculateTens(uint16_t Num);

  • 调用定义好的数显函数,实现 LCD 段码屏的自定义数字显示。

代码

包括主函数、头文件、调用函数三部分。

  1. 按照前面的帖子,通过 FSP 快速创建 LCD 显示工程;
  2. 修改主函数代码;
  3. 添加 LCD 数字显示函数和头文件。
主函数
#include "hal_data.h"
#include "LCD_ShowNum.h"FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTERvoid hal_entry(void)
{/* TODO: add your own code here */fsp_err_t err;err = R_SLCDC_Open(&g_slcdc0_ctrl, &g_slcdc0_cfg);assert(FSP_SUCCESS == err);R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MILLISECONDS);err = R_SLCDC_Start(&g_slcdc0_ctrl);assert(FSP_SUCCESS == err);while(1){float vol = 9.14159265; // voltage valueuint16_t Num = vol * 100; // convert to uint16_t styleLCD_ShowNum(Num);R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);LCD_Clear();}#if BSP_TZ_SECURE_BUILDR_BSP_NonSecureEnter();
#endif
}
头文件

LCD_ShowNum.h

#ifndef LCD_SHOWNUM_H_
#define LCD_SHOWNUM_H_extern const uint16_t Num;void LCD_ShowNum(uint16_t Num);void calculateTens(uint16_t Num);void calculateOnes(uint16_t Num);void calculateOnesDot(uint16_t Num);void calculateTenths(uint16_t Num);void calculatePercentiles(uint16_t Num);void LCD_Clear();
void LCD_Light();#endif
调用函数

在 src 文件夹下新建调用函数文件 LCD_ShowNum.c 和相应的头文件 LCD_ShowNum.h ,分别定义数显函数和函数调用头文件。

LCD_ShowNum.c

#include "hal_data.h"
#include "LCD_ShowNum.h"/**@brief LCD 清屏@param None@return None
*/
void LCD_Clear()
{// Clear SEG0-41 段uint8_t segment_data_num_off[41+1] ;for(int i=0;i<=41;i++)segment_data_num_off[i] = 0;R_SLCDC_Write(&g_slcdc0_ctrl, 0, segment_data_num_off, sizeof(segment_data_num_off));
}/**@brief LCD 全亮@param None@return None
*/
void LCD_Light()
{uint8_t segment_data_num_on[41+1] ;for(int i=0;i<=41;i++)segment_data_num_on[i] = 0xf;R_SLCDC_Write(&g_slcdc0_ctrl, 0, segment_data_num_on, sizeof(segment_data_num_on));
}/**@brief LCD屏显示频率@param frequency -[in] 频率@return 无
*/
void LCD_ShowNum(uint16_t Num)
{calculateTens(Num);                                           // 十位//calculateOnes(Num);                                         // 个位calculateOnesDot(Num);                                        // 个位(带小数点)calculateTenths(Num);                                         // 小数十分位calculatePercentiles(Num);                                    // 小数百分位
}/**@brief 计算十位,如33.31,则十位3@param None@return 无
*/
void calculateTens(uint16_t Num)
{if(Num / 1000 % 10 == 0){R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xD, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x7, 0xF);                  // 0}else if(Num / 1000 % 10 == 1){R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0x0, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x6, 0xF);                  // 1}else if(Num / 1000 % 10 == 2){R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xE, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x3, 0xF);                  // 2}else if(Num / 1000 % 10 == 3){R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xA, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x7, 0xF);                  // 3}else if(Num / 1000 % 10 == 4){R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0x3, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x6, 0xF);                  // 4}else if(Num / 1000 % 10 == 5){R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xB, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x5, 0xF);                  // 5}else if(Num / 1000 % 10 == 6){R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xF, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x5, 0xF);                  // 6}else if(Num / 1000 % 10 == 7){R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0x1, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x7, 0xF);                  // 7}else if(Num / 1000 % 10 == 8){R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xF, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0xF, 0xF);                  // 8}else if(Num / 1000 % 10 == 9){R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xB, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0xF, 0xF);                  // 9}
}/**@brief 计算个位,如3.31,则个位 3@param None@return 无
*/
void calculateOnes(uint16_t Num)
{if(Num / 100 % 10 == 0){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xD, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x7, 0xF);                // 0}else if(Num / 100 % 10 == 1){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0x0, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x6, 0xF);                // 1}else if(Num / 100 % 10 == 2){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xE, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x3, 0xF);                // 2}else if(Num / 100 % 10 == 3){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xA, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x7, 0xF);                // 3}else if(Num / 100 % 10 == 4){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0x3, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x6, 0xF);                // 4}else if(Num / 100 % 10 == 5){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xB, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x5, 0xF);                // 5}else if(Num / 100 % 10 == 6){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xF, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x5, 0xF);                // 6}else if(Num / 100 % 10 == 7){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0x1, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x7, 0xF);                // 7}else if(Num / 100 % 10 == 8){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xF, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x7, 0xF);                // 8}else if(Num / 100 % 10 == 9){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xB, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x7, 0xF);                // 9}
}/**@brief 计算个位,如3.31,则个位 3. (带小数点)@param None@return 无
*/
void calculateOnesDot(uint16_t Num)
{if(Num / 100 % 10 == 0){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xD, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xF, 0xF);                // 0.}else if(Num / 100 % 10 == 1){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0x0, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xE, 0xF);                // 1.}else if(Num / 100 % 10 == 2){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xE, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xB, 0xF);                // 2.}else if(Num / 100 % 10 == 3){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xA, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xF, 0xF);                // 3.}else if(Num / 100 % 10 == 4){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0x3, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xE, 0xF);                // 4.}else if(Num / 100 % 10 == 5){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xB, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xD, 0xF);                // 5.}else if(Num / 100 % 10 == 6){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xF, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xD, 0xF);                // 6.}else if(Num / 100 % 10 == 7){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0x1, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xF, 0xF);                // 7.}else if(Num / 100 % 10 == 8){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xF, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xF, 0xF);                // 8.}else if(Num / 100 % 10 == 9){R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xB, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xF, 0xF);                // 9.}
}/**@brief 计算小数十分位,如3.31,则十分位 3@param voltage -[in] 电压@return 无
*/
void calculateTenths(uint16_t Num)
{if(Num / 10 % 10 == 0){R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xD, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x7, 0xF);                  // 0}else if(Num / 10 % 10 == 1){R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0x0, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x6, 0xF);                  // 1}else if(Num / 10 % 10 == 2){R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xE, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x3, 0xF);                  // 2}else if(Num / 10 % 10 == 3){R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xA, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x7, 0xF);                  // 3}else if(Num / 10 % 10 == 4){R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0x3, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x6, 0xF);                  // 4}else if(Num / 10 % 10 == 5){R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xB, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x5, 0xF);                  // 5}else if(Num / 10 % 10 == 6){R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xF, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x5, 0xF);                  // 6}else if(Num / 10 % 10 == 7){R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0x1, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x7, 0xF);                  // 7}else if(Num / 10 % 10 == 8){R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xF, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0xF, 0xF);                  // 8}else if(Num / 10 % 10 == 9){R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xB, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0xF, 0xF);                  // 9}
}/**@brief 计算小数百分位,如3.31,则百分位 1@param None@return 无
*/
void calculatePercentiles(uint16_t Num)
{if(Num % 10 == 0){R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xD, 0xF);                  // 0R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x7, 0xF);}else if(Num % 10 == 1){R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0x0, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x6, 0xF);                  // 1}else if(Num % 10 == 2){R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xE, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x3, 0xF);                  // 2}else if(Num % 10 == 3){R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xA, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x7, 0xF);                  // 3}else if(Num % 10 == 4){R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0x3, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x6, 0xF);                  // 4}else if(Num % 10 == 5){R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xB, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x5, 0xF);                  // 5}else if(Num % 10 == 6){R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xF, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x5, 0xF);                  // 6}else if(Num % 10 == 7){R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0x1, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x7, 0xF);                  // 7}else if(Num % 10 == 8){R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xF, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0xF, 0xF);                  // 8}else if(Num % 10 == 9){R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xB, 0xF);R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0xF, 0xF);                  // 9}
}

完成文件创建和工程编译,上传固件至开发板,即可实现自定义数字的显示。

参考:LCD段码屏HT1621的使用 .

效果

在这里插入图片描述

动态

在这里插入图片描述

总结

本文介绍了 RA4L1 开发套件和瑞萨 e2 Studio 灵活软件包(FSP)实现 LCD 段码屏显示自定义数字的工程设计,为瑞萨 RA4L1 系列单片机的快速开发和应用提供了参考。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词