0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于RASC的keil电子时钟制作(瑞萨RA)(5)----驱动LED数码管

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2023-12-01 15:01 次阅读

概述

本篇文章主要介绍如何使用e2studio对瑞萨RA2E1开发板进行数码管的驱动。

硬件准备

首先需要准备一个开发板,这里我准备的是芯片型号R7FA2E1A72DFL的开发板:

在这里插入图片描述

在这里插入图片描述

视频教程

https://www.bilibili.com/video/BV1Bx4y197iy/

数码管说明

查看手册可以得知,该数码管位共阴极。
在这里插入图片描述

同时查看原理图,可以看到数码管连接到MCU对应的管脚。
在这里插入图片描述

配置这些IO都为输出口,当红色为高电平,蓝色为低电平时候,LED亮起。
在这里插入图片描述

配置IO口

配置与数码管连接的IO都为Output mode (Initial Low)模式。
在这里插入图片描述

数码管显示库

数码管的控制管教如下所示。
在这里插入图片描述

下图列出了数码管显示0到F时点亮的段。例如,在显示数字0的时候,除了中间的G段外其他的段都被点亮了。而数字1只点亮了B段和C段。

在这里插入图片描述

这里的项目位电子时钟,所以需要使用的字库为0-9。后续在添加温湿度的字库。
新建smg.c和smg.h文件,用于保存数码管的驱动程序。
在这里插入图片描述

都保存到SRC文件夹下面。

在这里插入图片描述

smg.c

/*
 * smg.c
 *
 *  Created on: 2023年6月29日
 *      Author: a8456
 */

#include "smg.h"
#include "hal_data.h"


void smg_num(int num)
{
    switch(num)
    {
        case 0:
        {
            SMG_A_OPEN;
            SMG_B_OPEN;
            SMG_C_OPEN;
            SMG_D_OPEN;
            SMG_E_OPEN;
            SMG_F_OPEN;
            SMG_G_CLOSE;
            SMG_DP_CLOSE;
            break;
        }
        case 1:
        {
            SMG_A_CLOSE;
            SMG_B_OPEN;
            SMG_C_OPEN;
            SMG_D_CLOSE;
            SMG_E_CLOSE;
            SMG_F_CLOSE;
            SMG_G_CLOSE;
            SMG_DP_CLOSE;
            break;
        }
        case 2:
        {
            SMG_A_OPEN;
            SMG_B_OPEN;
            SMG_C_CLOSE;
            SMG_D_OPEN;
            SMG_E_OPEN;
            SMG_F_CLOSE;
            SMG_G_OPEN;
            SMG_DP_CLOSE;
            break;
        }
        case 3:
        {
            SMG_A_OPEN;
            SMG_B_OPEN;
            SMG_C_OPEN;
            SMG_D_OPEN;
            SMG_E_CLOSE;
            SMG_F_CLOSE;
            SMG_G_OPEN;
            SMG_DP_CLOSE;
            break;
        }
        case 4:
        {
            SMG_A_CLOSE;
            SMG_B_OPEN;
            SMG_C_OPEN;
            SMG_D_CLOSE;
            SMG_E_CLOSE;
            SMG_F_OPEN;
            SMG_G_OPEN;
            SMG_DP_CLOSE;
            break;
        }
        case 5:
        {
            SMG_A_OPEN;
            SMG_B_CLOSE;
            SMG_C_OPEN;
            SMG_D_OPEN;
            SMG_E_CLOSE;
            SMG_F_OPEN;
            SMG_G_OPEN;
            SMG_DP_CLOSE;
            break;
        }
        case 6:
        {
            SMG_A_OPEN;
            SMG_B_CLOSE;
            SMG_C_OPEN;
            SMG_D_OPEN;
            SMG_E_OPEN;
            SMG_F_OPEN;
            SMG_G_OPEN;
            SMG_DP_CLOSE;
            break;
        }
        case 7:
        {
            SMG_A_OPEN;
            SMG_B_OPEN;
            SMG_C_OPEN;
            SMG_D_CLOSE;
            SMG_E_CLOSE;
            SMG_F_CLOSE;
            SMG_G_CLOSE;
            SMG_DP_CLOSE;
            break;
        }
        case 8:
        {
            SMG_A_OPEN;
            SMG_B_OPEN;
            SMG_C_OPEN;
            SMG_D_OPEN;
            SMG_E_OPEN;
            SMG_F_OPEN;
            SMG_G_OPEN;
            SMG_DP_CLOSE;
            break;
        }
        case 9:
        {
            SMG_A_OPEN;
            SMG_B_OPEN;
            SMG_C_OPEN;
            SMG_D_OPEN;
            SMG_E_CLOSE;
            SMG_F_OPEN;
            SMG_G_OPEN;
            SMG_DP_CLOSE;
            break;
        }




    }



}

void smg_1(int num)
{
    SMG_1_OPEN;
    SMG_2_CLOSE;
    SMG_3_CLOSE;
    SMG_4_CLOSE;

    smg_num(num);

}


void smg_2(int num)
{
    SMG_1_CLOSE;
    SMG_2_OPEN;
    SMG_3_CLOSE;
    SMG_4_CLOSE;
    smg_num(num);

}



void smg_3(int num)
{
    SMG_1_CLOSE;
    SMG_2_CLOSE;
    SMG_3_OPEN;
    SMG_4_CLOSE;
    smg_num(num);

}



void smg_4(int num)
{

    SMG_1_CLOSE;
    SMG_2_CLOSE;
    SMG_3_CLOSE;
    SMG_4_OPEN;
    smg_num(num);

}


void smg_1_p(void)
{
    SMG_1_OPEN;
    SMG_2_CLOSE;
    SMG_3_CLOSE;
    SMG_4_CLOSE;

    SMG_A_OPEN;
    SMG_B_OPEN;
    SMG_C_CLOSE;
    SMG_D_CLOSE;
    SMG_E_OPEN;
    SMG_F_OPEN;
    SMG_G_OPEN;
    SMG_DP_CLOSE;

}





void smg_1_close(void)
{
    SMG_1_OPEN;
    SMG_2_CLOSE;
    SMG_3_CLOSE;
    SMG_4_CLOSE;

    SMG_A_CLOSE;
    SMG_B_CLOSE;
    SMG_C_CLOSE;
    SMG_D_CLOSE;
    SMG_E_CLOSE;
    SMG_F_CLOSE;
    SMG_G_CLOSE;
    SMG_DP_CLOSE;

}


void smg_2_close(void)
{
    SMG_1_CLOSE;
    SMG_2_OPEN;
    SMG_3_CLOSE;
    SMG_4_CLOSE;

    SMG_A_CLOSE;
    SMG_B_CLOSE;
    SMG_C_CLOSE;
    SMG_D_CLOSE;
    SMG_E_CLOSE;
    SMG_F_CLOSE;
    SMG_G_CLOSE;
    SMG_DP_CLOSE;
}



void smg_3_close(void)
{
    SMG_1_CLOSE;
    SMG_2_CLOSE;
    SMG_3_OPEN;
    SMG_4_CLOSE;

    SMG_A_CLOSE;
    SMG_B_CLOSE;
    SMG_C_CLOSE;
    SMG_D_CLOSE;
    SMG_E_CLOSE;
    SMG_F_CLOSE;
    SMG_G_CLOSE;
    SMG_DP_CLOSE;
}



void smg_4_close(void)
{
    SMG_1_CLOSE;
    SMG_2_CLOSE;
    SMG_3_CLOSE;
    SMG_4_OPEN;

    SMG_A_CLOSE;
    SMG_B_CLOSE;
    SMG_C_CLOSE;
    SMG_D_CLOSE;
    SMG_E_CLOSE;
    SMG_F_CLOSE;
    SMG_G_CLOSE;
    SMG_DP_CLOSE;
}








void smg_maohao_open(int num)
{

    SMG_1_CLOSE;
    SMG_2_CLOSE;

    if(num)//开启冒号
    {
        SMG_3_OPEN;
        SMG_4_OPEN;
        SMG_A_CLOSE;
        SMG_B_CLOSE;
        SMG_C_CLOSE;
        SMG_D_CLOSE;
        SMG_E_CLOSE;
        SMG_F_CLOSE;
        SMG_G_CLOSE;
        SMG_DP_OPEN;


    }
    else
    {
        SMG_3_CLOSE;
        SMG_4_CLOSE;

        SMG_A_CLOSE;
        SMG_B_CLOSE;
        SMG_C_CLOSE;
        SMG_D_CLOSE;
        SMG_E_CLOSE;
        SMG_F_CLOSE;
        SMG_G_CLOSE;
        SMG_DP_CLOSE;

    }
}

void ceshi_smg(void)
{
    for(int i=0;i< 40;i++)
    {
        if(i< 10)
        {   smg_1(i);}

        else if(i >=10&&i< 20)
        {    smg_2(i-10);}

        else if(i >=20&&i< 30)
        {    smg_3(i-20);}

        else if(i >=30&&i< 40)
        {   smg_4(i-30);}


        R_BSP_SoftwareDelay(100U, BSP_DELAY_UNITS_MILLISECONDS);
    }
     smg_maohao_open(1);





}

smg.h

/*aa
 *
 *  Created on: 2023年6月29日
 *      Author: a8456
 */

#ifndef SMG_H_
#define SMG_H_
#define SMG_A_OPEN  R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_HIGH)
#define SMG_B_OPEN  R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_00, BSP_IO_LEVEL_HIGH)
#define SMG_C_OPEN  R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_13, BSP_IO_LEVEL_HIGH)
#define SMG_D_OPEN  R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_08, BSP_IO_LEVEL_HIGH)
#define SMG_E_OPEN  R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_07, BSP_IO_LEVEL_HIGH)
#define SMG_F_OPEN  R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_02, BSP_IO_LEVEL_HIGH)
//旧版PCB
//#define SMG_G_OPEN  R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_HIGH)
//新版PCB
#define SMG_G_OPEN  R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_00, BSP_IO_LEVEL_HIGH)
#define SMG_DP_OPEN R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_12, BSP_IO_LEVEL_HIGH)


#define SMG_A_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_LOW)
#define SMG_B_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_00, BSP_IO_LEVEL_LOW)
#define SMG_C_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_13, BSP_IO_LEVEL_LOW)
#define SMG_D_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_08, BSP_IO_LEVEL_LOW)
#define SMG_E_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_07, BSP_IO_LEVEL_LOW)
#define SMG_F_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_02, BSP_IO_LEVEL_LOW)
//旧版PCB
//#define SMG_G_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_LOW)
//新版PCB
#define SMG_G_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_00, BSP_IO_LEVEL_LOW)
#define SMG_DP_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_12, BSP_IO_LEVEL_LOW)

#define SMG_1_OPEN R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_LOW)
#define SMG_2_OPEN R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_01, BSP_IO_LEVEL_LOW)
#define SMG_3_OPEN R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_00, BSP_IO_LEVEL_LOW)
//旧版PCB
//#define SMG_4_OPEN R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_00, BSP_IO_LEVEL_LOW)
//新版PCB
#define SMG_4_OPEN R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_LOW)


#define SMG_1_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_HIGH)
#define SMG_2_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_01, BSP_IO_LEVEL_HIGH)
#define SMG_3_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_00, BSP_IO_LEVEL_HIGH)
//旧版PCB
//#define SMG_4_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_00, BSP_IO_LEVEL_HIGH)
//新版PCB
#define SMG_4_CLOSE R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_HIGH)


void smg_num(int num);

void smg_1(int num);
void smg_2(int num);
void smg_3(int num);
void smg_4(int num);

void smg_1_p(void);


void smg_1_close(void);
void smg_2_close(void);
void smg_3_close(void);
void smg_4_close(void);
void smg_maohao_open(int num);

void ceshi_smg(void);
#endif /* SMG_H_ */

将刚刚的文件导入进来。
在这里插入图片描述
在这里插入图片描述

添加完毕之后需要在主程序中加入对于的头文件。

#include "smg.h"

在这里插入图片描述

添加测试程序。
在这里插入图片描述

主程序

#include "hal_data.h"
#include < stdio.h >
#include "smg.h"
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER

fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
/* Callback function */
void user_uart_callback(uart_callback_args_t *p_args)
{
    /* TODO: add your own code here */
    if(p_args- >event == UART_EVENT_TX_COMPLETE)
     {
         uart_send_complete_flag = true;
     }
}


#ifdef __GNUC__                                 //串口重定向
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
        err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
        if(FSP_SUCCESS != err) __BKPT();
        while(uart_send_complete_flag == false){}
        uart_send_complete_flag = false;
        return ch;
}

int _write(int fd,char *pBuffer,int size)
{
    for(int i=0;i< size;i++)
    {
        __io_putchar(*pBuffer++);
    }
    return size;
}



/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)
{
    /* TODO: add your own code here */

/**********************串口设置***************************************/
    /* Open the transfer instance with initial configuration. */
       err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
       assert(FSP_SUCCESS == err);

/**********************数码管测试***************************************/
       ceshi_smg();

       while(1)
       {
       printf("hello world!n");
       R_BSP_SoftwareDelay(1000U, BSP_DELAY_UNITS_MILLISECONDS);
       }



#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

加入对于的数码管测试程序。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    240

    文章

    23128

    浏览量

    658243
  • 数码管
    +关注

    关注

    32

    文章

    1874

    浏览量

    90919
  • keil
    +关注

    关注

    68

    文章

    1211

    浏览量

    166659
  • 电子时钟
    +关注

    关注

    11

    文章

    197

    浏览量

    24492
收藏 人收藏

    评论

    相关推荐

    电子时钟制作(RA)(4)----驱动LED数码管

    本篇文章主要介绍如何使用e2studio对RA2E1开发板进行数码管驱动
    的头像 发表于 12-01 14:03 483次阅读
    <b class='flag-5'>电子时钟</b><b class='flag-5'>制作</b>(<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>)(4)----<b class='flag-5'>驱动</b><b class='flag-5'>LED</b><b class='flag-5'>数码管</b>

    电子时钟制作(RA)(5)----定时器驱动数码管

    要想让每个数码管显示不同的数字,但是数码管必须依次地被持续驱动数码管之间的刷新速度应该足够快,这样就看不出来数码管之间在闪烁。刷新频率可以
    的头像 发表于 12-01 14:06 508次阅读
    <b class='flag-5'>电子时钟</b><b class='flag-5'>制作</b>(<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>)(<b class='flag-5'>5</b>)----定时器<b class='flag-5'>驱动</b><b class='flag-5'>数码管</b>

    电子时钟制作(RA)(7)----按键修改数码管时间

    前几节课程已经单独驱动数码管和RTC,同时已经整合成了能够用数码管显示具体时间,但是无法修改时间,这节就来配置使用按键修改具体的日期。
    的头像 发表于 12-01 14:14 957次阅读
    <b class='flag-5'>电子时钟</b><b class='flag-5'>制作</b>(<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>)(7)----按键修改<b class='flag-5'>数码管</b>时间

    基于RASCkeil电子时钟制作(RA)(2)----配置keil以及使用串口进行打印

    本篇文章主要介绍了一种基于RA系列微控制器的电子时钟制作方法,重点关注如何利用
    的头像 发表于 12-01 14:47 648次阅读
    基于<b class='flag-5'>RASC</b>的<b class='flag-5'>keil</b><b class='flag-5'>电子时钟</b><b class='flag-5'>制作</b>(<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>)(2)----配置<b class='flag-5'>keil</b>以及使用串口进行打印

    基于RASCkeil电子时钟制作(RA)(3)----使用J-Link烧写程序到芯片

    这一节主要讲解如何使用J-Link对RA芯片进行烧录。
    的头像 发表于 12-01 14:49 562次阅读
    基于<b class='flag-5'>RASC</b>的<b class='flag-5'>keil</b><b class='flag-5'>电子时钟</b><b class='flag-5'>制作</b>(<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>)(3)----使用J-Link烧写程序到<b class='flag-5'>瑞</b><b class='flag-5'>萨</b>芯片

    基于RASCkeil电子时钟制作(RA)(6)----定时器驱动数码管

    要想让每个数码管显示不同的数字,但是数码管必须依次地被持续驱动数码管之间的刷新速度应该足够快,这样就看不出来数码管之间在闪烁。刷新频率可以
    的头像 发表于 12-01 15:03 561次阅读
    基于<b class='flag-5'>RASC</b>的<b class='flag-5'>keil</b><b class='flag-5'>电子时钟</b><b class='flag-5'>制作</b>(<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>)(6)----定时器<b class='flag-5'>驱动</b><b class='flag-5'>数码管</b>

    基于RASCkeil电子时钟制作(RA)(7)----配置RTC时钟及显示时间

    本文将详细讲解如何借助e2studio来对微控制器进行实时时钟(RTC)的设置和配置,以便实现日历功能和一秒钟产生的中断,从而通过串口输出实时数据。
    的头像 发表于 12-01 15:06 646次阅读
    基于<b class='flag-5'>RASC</b>的<b class='flag-5'>keil</b><b class='flag-5'>电子时钟</b><b class='flag-5'>制作</b>(<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>)(7)----配置RTC<b class='flag-5'>时钟</b>及显示时间

    基于RASCkeil电子时钟制作(RA)(8)----按键修改数码管时间

    前几节课程已经单独驱动数码管和RTC,同时已经整合成了能够用数码管显示具体时间,但是无法修改时间,这节就来配置使用按键修改具体的日期。
    的头像 发表于 12-01 15:08 862次阅读
    基于<b class='flag-5'>RASC</b>的<b class='flag-5'>keil</b><b class='flag-5'>电子时钟</b><b class='flag-5'>制作</b>(<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>)(8)----按键修改<b class='flag-5'>数码管</b>时间

    RA-Eco-RA0E1-32PIN-V1.0开发板试用】使用 RASC 建立 Keil 工程、烧录测试

    RA-Eco-RA0E1-32PIN-V1.0开发板试用】使用 RASC 建立 Keil 工程、烧录测试 使用官网提供的
    发表于 11-09 12:52

    关于数码管电子时钟制作

    关于数码管电子时钟制作
    发表于 04-11 22:09

    RA4系列开发板体验】体验过程

    、使用 RASC 生成 Keil 工程+点亮LED参照“ 【RA4系列开发板体验】2. 使用
    发表于 12-18 16:20

    FPB-RA6E1快速原型板】简单开箱和RASC+Keil开发环境搭建

    ,看看和GitHub下载页面上的是否一致: 另外,RA系列MCU Keil支持包,可以在Keil官网找到下载页面: MDK
    发表于 05-22 23:13

    基于数码管电子时钟代码设计详细资料免费下载

    本文档的主要内容详细介绍的是基于数码管电子时钟代码设计资料免费下载。
    发表于 07-04 08:00 34次下载

    基于51单片机电子时钟数码管显示设计资料包

    基于51单片机电子时钟数码管显示设计资料包
    发表于 10-25 10:07 13次下载

    基于51单片机的数码管显示电子时钟例程源代码

    基于51单片机的数码管显示电子时钟例程源代码
    发表于 05-12 16:33 46次下载