当前位置: 首页 > ds >正文

【瑞萨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 系列单片机的快速开发和应用提供了参考。

http://www.xdnf.cn/news/3551.html

相关文章:

  • Adam(Adaptive Moment Estimation)
  • windows电脑端SSH连接开termux的安卓端
  • 字符串格式漏洞-[第五空间2019 决赛]PWN5
  • 【 Node.js】 Node.js安装
  • 【无标题】linux的多进程讲解
  • C#中的LINQ:简化数据查询与操作
  • 梳理顶会论文相关的经验贴
  • Linux Shell 重定向与管道符号(>, >>, |)的实现机制
  • GD32F407单片机开发入门(二十五)HC-SR04超声波模块测距实战含源码
  • epoll函数
  • Perforated Backpropagation:神经网络优化的创新技术及PyTorch使用指南
  • TensorFlow深度学习实战——基于循环神经网络的情感分析模型
  • 多模态大语言模型arxiv论文略读(五十二)
  • LangChain4j +DeepSeek大模型应用开发——6 提示词
  • Nginx 核心功能02
  • 小米首个推理大模型开源——Xiaomi MiMo,为推理而战!
  • 体系学习1:C语言与指针1——预定义、进制打印、传参为数组
  • python多进程的使用
  • 机器视觉开发-摄像头扫描二维码
  • 2025五一数学建模C题完整分析论文(共36页)(含模型、可运行代码、数据)
  • 嵌入式产品运行中数据丢失怎么办?
  • SpringBoot云端日记本系统开发实现
  • 记录搭建自己的应用中心-需求看板搭建
  • DeepSeek V3 训练策略:FP8混合精度与多Token预测
  • 电子病历高质量语料库构建方法与架构项目(环境聆听与自动化文档生成篇)
  • AD数据库清理
  • Mem0.ai研究团队开发的全新记忆架构系统“Mem0”正式发布
  • TTL、LRU、LFU英文全称及释义
  • 脑机接口技术:开启人类与机器的全新交互时代
  • LabVIEW异步调用VI介绍