GD32L233RB 驱动数码管

news2025/1/26 12:37:30

1.数码管有8段A、B、C、D、E、F、G 和 H小数点  以及片选信号(DIG)

DIG用来选择那一位,A-G 用来显示段

静态显示每次只能一次显示单个位 

动态显示(动态扫描)所有的位显示结束要在10ms左右  显示2ms  消光1ms   

实现动态显示面板数据

NumLED.c

#include "NumLED.h"
/* FreeRTOS includes. */
#include "FreeRTOS.h"
#include "task.h"

// 定义GPIO引脚宏
#define DIGIT_1_PIN GPIO_PIN_8
#define DIGIT_2_PIN GPIO_PIN_9
#define DIGIT_3_PIN GPIO_PIN_11
#define DIGIT_4_PIN GPIO_PIN_10

#define SEGMENT_A_PIN GPIO_PIN_8
#define SEGMENT_B_PIN GPIO_PIN_7
#define SEGMENT_C_PIN GPIO_PIN_6
#define SEGMENT_D_PIN GPIO_PIN_15
#define SEGMENT_E_PIN GPIO_PIN_14
#define SEGMENT_F_PIN GPIO_PIN_13
#define SEGMENT_G_PIN GPIO_PIN_12

// 公共关闭所有段的函数
static void closeAllSegments() {
    GPIO_BC(GPIOC) = SEGMENT_A_PIN | SEGMENT_B_PIN | SEGMENT_C_PIN;
    GPIO_BC(GPIOB) = SEGMENT_D_PIN | SEGMENT_E_PIN | SEGMENT_F_PIN | SEGMENT_G_PIN;
    // 拉高所有DIG引脚,确保完全消隐
    GPIO_BOP(GPIOA) = DIGIT_1_PIN;
    GPIO_BOP(GPIOC) = DIGIT_2_PIN | DIGIT_3_PIN | DIGIT_4_PIN;
}

// 公共设置单个数码管显示的函数
static void setDigit(int digitPin, int number) {
    closeAllSegments();
    switch (number) {
        case 0:
            GPIO_BOP(GPIOC) = SEGMENT_A_PIN | SEGMENT_B_PIN | SEGMENT_C_PIN;
            GPIO_BOP(GPIOB) = SEGMENT_D_PIN | SEGMENT_E_PIN | SEGMENT_F_PIN;
            break;
        case 1:
            GPIO_BOP(GPIOC) = SEGMENT_B_PIN | SEGMENT_C_PIN;
            break;
        case 2:
            GPIO_BOP(GPIOC) = SEGMENT_A_PIN | SEGMENT_B_PIN;
            GPIO_BOP(GPIOB) = SEGMENT_D_PIN | SEGMENT_E_PIN | SEGMENT_G_PIN;
            break;
        case 3:
            GPIO_BOP(GPIOC) = SEGMENT_A_PIN | SEGMENT_B_PIN | SEGMENT_C_PIN;
            GPIO_BOP(GPIOB) = SEGMENT_D_PIN | SEGMENT_G_PIN;
            break;
        case 4:
            GPIO_BOP(GPIOC) = SEGMENT_B_PIN | SEGMENT_C_PIN;
            GPIO_BOP(GPIOB) = SEGMENT_F_PIN | SEGMENT_G_PIN;
            break;
        case 5:
            GPIO_BOP(GPIOC) = SEGMENT_A_PIN | SEGMENT_C_PIN;
            GPIO_BOP(GPIOB) = SEGMENT_D_PIN | SEGMENT_F_PIN | SEGMENT_G_PIN;
            break;
        case 6:
            GPIO_BOP(GPIOC) = SEGMENT_A_PIN | SEGMENT_C_PIN;
            GPIO_BOP(GPIOB) = SEGMENT_D_PIN | SEGMENT_E_PIN | SEGMENT_F_PIN | SEGMENT_G_PIN;
            break;
        case 7:
            GPIO_BOP(GPIOC) = SEGMENT_A_PIN | SEGMENT_B_PIN | SEGMENT_C_PIN;
            break;
        case 8:
            GPIO_BOP(GPIOC) = SEGMENT_A_PIN | SEGMENT_B_PIN | SEGMENT_C_PIN;
            GPIO_BOP(GPIOB) = SEGMENT_D_PIN | SEGMENT_E_PIN | SEGMENT_F_PIN | SEGMENT_G_PIN;
            break;
        case 9:
            GPIO_BOP(GPIOC) = SEGMENT_A_PIN | SEGMENT_B_PIN | SEGMENT_C_PIN;
            GPIO_BOP(GPIOB) = SEGMENT_D_PIN | SEGMENT_F_PIN | SEGMENT_G_PIN;
            break;
        default:
            // 处理无效数字,这里可以添加日志记录等
            break;
    }
    // 拉低对应的DIG引脚
    GPIO_BC(GPIOC) = digitPin;
}

// 初始化函数
void numled_init(void) {
    // 使能 GPIOA 时钟
    rcu_periph_clock_enable(RCU_GPIOA);
    // 配置 PA8 为推挽输出,无上拉下拉
    gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, DIGIT_1_PIN);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, DIGIT_1_PIN);

    // 使能 GPIOB 时钟
    rcu_periph_clock_enable(RCU_GPIOB);
    // 配置 PB12 - PB15 为推挽输出,无上拉下拉
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEGMENT_D_PIN | SEGMENT_E_PIN | SEGMENT_F_PIN | SEGMENT_G_PIN);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEGMENT_D_PIN | SEGMENT_E_PIN | SEGMENT_F_PIN | SEGMENT_G_PIN);

    // 使能 GPIOC 时钟
    rcu_periph_clock_enable(RCU_GPIOC);
    // 配置 PC6 - PC11 为推挽输出,无上拉下拉
    gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEGMENT_A_PIN | SEGMENT_B_PIN | SEGMENT_C_PIN | DIGIT_2_PIN | DIGIT_3_PIN | DIGIT_4_PIN);
    gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEGMENT_A_PIN | SEGMENT_B_PIN | SEGMENT_C_PIN | DIGIT_2_PIN | DIGIT_3_PIN | DIGIT_4_PIN);

    // 初始状态:关闭所有显示
    closeAllSegments();
}


// 显示电量百分比函数
void showpercentage(uint8_t lv) {
    closepercentage();
    switch (lv) {
        case 0:
            // 拉高 PC8, PC9
            GPIO_BOP(GPIOC) = SEGMENT_A_PIN | SEGMENT_B_PIN;
            // 拉低 DIG1
            GPIO_BC(GPIOA) = DIGIT_1_PIN;
            break;
        case 1:
            // 拉高 PC6, PB15
            GPIO_BOP(GPIOC) = SEGMENT_C_PIN;
            GPIO_BOP(GPIOB) = SEGMENT_D_PIN;
            // 拉低 DIG1
            GPIO_BC(GPIOA) = DIGIT_1_PIN;
            break;
        case 2:
            // 拉高 PB13, PB14
            GPIO_BOP(GPIOB) = SEGMENT_E_PIN | SEGMENT_F_PIN;
            // 拉低 DIG1
            GPIO_BC(GPIOA) = DIGIT_1_PIN;
            break;
        default:
            // 处理无效电量等级,这里可以添加日志记录等
            break;
    }
}

// 关闭电量百分比显示函数
void closepercentage() {
    // DIG 拉高
    GPIO_BOP(GPIOA) = DIGIT_1_PIN;
    // SEG 拉低
    closeAllSegments();
}

// 显示数字的函数
void shownum(uint8_t dig, uint8_t n) {
    if (dig == 2) {
        setDigit(DIGIT_2_PIN, n);
    } else if (dig == 3) {
        setDigit(DIGIT_3_PIN, n);
    } else {
        // 处理无效的 dig 值,这里可以添加日志记录等
    }
}

// 显示蓝牙图标函数
void showblue() {
    closeblue();
    // 拉高
    GPIO_BOP(GPIOC) = SEGMENT_A_PIN | SEGMENT_B_PIN;
    // 拉低 DIG4
    GPIO_BC(GPIOC) = DIGIT_4_PIN;
}

// 关闭蓝牙图标函数
void closeblue() {
    closeAllSegments();
    // 拉高 DIG4
    GPIO_BOP(GPIOC) = DIGIT_4_PIN;
}

// 显示温度图标函数
void showtemp() {
    closetemp();
    // 拉高
    GPIO_BOP(GPIOC) = SEGMENT_C_PIN;
    GPIO_BOP(GPIOB) = SEGMENT_D_PIN;
    // 拉低 DIG4
    GPIO_BC(GPIOC) = DIGIT_4_PIN;
}

// 关闭温度图标函数
void closetemp() {
    closeAllSegments();
    // 拉高 DIG4
    GPIO_BOP(GPIOC) = DIGIT_4_PIN;
}

// 轮询显示函数
//第一个参数显示数字 第二个参数显示电量0 红色 /1 绿色 /2 黄色 第三个参数 1 打开蓝牙 第四个参数 1 打开温度 
void ShowNum(uint8_t data, uint8_t power, uint8_t of1, uint8_t of2) {
    static int displayStep = 0;
    // 消隐时间
    const TickType_t blankTime = pdMS_TO_TICKS(1);
    switch (displayStep) {
        case 0:
						if(data <= 30){
								// 消隐1ms
								closeAllSegments();
								vTaskDelay(blankTime);
								// 显示十位
								setDigit(DIGIT_2_PIN, data / 10);
								vTaskDelay(pdMS_TO_TICKS(2));
								// 消隐
								closeAllSegments();
								vTaskDelay(blankTime);
								// 显示个位
								setDigit(DIGIT_3_PIN, data % 10);
								vTaskDelay(pdMS_TO_TICKS(2));		//延时停留2ms
						}
						else{																//如果关掉了这里空走延时 保证五个段总的显示时间在10ms(人眼观看不出刷新)
										vTaskDelay(pdMS_TO_TICKS(2));
										vTaskDelay(pdMS_TO_TICKS(2));
						}
            break;
        case 1:
            // 消隐
            closeAllSegments();
            vTaskDelay(blankTime);
            showpercentage(power);
            vTaskDelay(pdMS_TO_TICKS(2));
            break;
        case 2:
            if (of1 == 1) {
                // 消隐
                closeAllSegments();
                vTaskDelay(blankTime);
                showblue();
                vTaskDelay(pdMS_TO_TICKS(2));
            }else{
                vTaskDelay(pdMS_TO_TICKS(2));						
						}
            break;
        case 3:
            if (of2 == 1) {
                // 消隐
                closeAllSegments();
                vTaskDelay(blankTime);
                showtemp();
                vTaskDelay(pdMS_TO_TICKS(2));
            }else{														//如果关掉了这里空走延时 保证五个段总的显示时间在10ms(人眼观看不出刷新)
                vTaskDelay(pdMS_TO_TICKS(2));						
						}
            break;
        default:
            displayStep = 0;
            break;
    }
    // 消隐
    closeAllSegments();
    vTaskDelay(blankTime);
    displayStep = (displayStep + 1) % 4;
}

NumLED.h

#ifndef __NUMLED_H
#define __NUMLED_H

#include "gd32l23x.h"


void numled_init(void);

// 函数声明
void showpercentage(uint8_t lv);
void closepercentage(void);
void shownum(uint8_t dig,uint8_t n);
void showblue(void);
void closeblue(void);
void showtemp(void);
void closetemp(void);
void showclear();

void ShowNum(uint8_t data,uint8_t power,uint8_t of1,uint8_t of2);
		//第一个参数显示数字 第二个参数显示电量0 红色 /1 绿色 /2 黄色 第三个参数 1 打开蓝牙 第四个参数 1 打开温度 
		
#endif


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2283448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB部署模式

目录 单节点模式&#xff08;Standalone&#xff09; 副本集模式&#xff08;Replica Set&#xff09; 分片集群模式&#xff08;Sharded Cluster&#xff09; MongoDB有多种部署模式&#xff0c;可以根据业务需求选择适合的架构和部署方式。 单节点模式&#xff08;Standa…

国自然重点项目|代谢影像组学只能预测肺癌靶向耐药的关键技术与应用|基金申请·25-01-25

小罗碎碎念 今天和大家分享一个国自然重点项目&#xff0c;项目执行年限为2019.01 - 2023.12&#xff0c;直接费用为294万。 项目聚焦肺癌靶向治疗中药物疗效预测难题&#xff0c;整合多组学与代谢影像数据展开研究。 在研究过程中&#xff0c;团队建立动物模型获取多维数据&am…

NFT Insider #166:Nifty Island 推出 AI Agent Playground;Ronin 推出1000万美元资助计划

引言&#xff1a;NFT Insider 由 NFT 收藏组织 WHALE Members、BeepCrypto 联合出品&#xff0c; 浓缩每周 NFT 新闻&#xff0c;为大家带来关于 NFT 最全面、最新鲜、最有价值的讯息。每期周报将从 NFT 市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟…

Word 中实现方框内点击自动打 √ ☑

注&#xff1a; 本文为 “Word 中方框内点击打 √ ☑ / 打 ☒” 相关文章合辑。 对第一篇增加了打叉部分&#xff0c;第二篇为第一篇中方法 5 “控件” 实现的详解。 在 Word 方框内打 √ 的 6 种技巧 2020-03-09 12:38 使用 Word 制作一些调查表、检查表等&#xff0c;通常…

Cpp::静态 动态的类型转换全解析(36)

文章目录 前言一、C语言中的类型转换二、为什么C会有四种类型转换&#xff1f;内置类型 -> 自定义类型自定义类型 -> 内置类型自定义类型 -> 自定义类型隐式类型转换的坑 三、C强制类型转换static_castreinterpret_castconst_castdynamic_cast 四、RTTI总结 前言 Hell…

4.flask-SQLAlchemy,表Model定义、增删查改操作

介绍 SQLAlchemy是对数据库的一个抽象 开发者不用直接与SQL语句打交道 Python对象来操作数据库 SQLAlchemy是一个关系型数据库 安装 flask中SQLAlchemy的配置 from flask import Flask from demo.user_oper import userdef create_app():app Flask(__name__)# 使用sessi…

20250122-正则表达式

1. 正则标记 表示一位字符&#xff1a;\\ 表示指定的一位字符&#xff1a;x 表示任意的一位字符&#xff1a;. 表示任意一位数字&#xff1a;\d 表示任意一位非数字&#xff1a;\D 表示任意一个字母&#xff1a;[a-zA-Z]&#xff08;大写或小写&#xff09; 表示任意一个…

SpringBoot3+Vue3开发学生选课管理系统

功能介绍 分三个角色登录&#xff1a;学生登录&#xff0c;老师登录&#xff0c;教务管理员登录&#xff0c;不同用户功能不同&#xff01; 1.学生用户功能 选课记录&#xff0c;查看选课记录&#xff0c;退选。选课管理&#xff0c;进行选课。通知管理&#xff0c;查看通知消…

媒体新闻发稿要求有哪些?什么类型的稿件更好通过?

为了保证推送信息的内容质量&#xff0c;大型新闻媒体的审稿要求一向较为严格。尤其在商业推广的过程中&#xff0c;不少企业的宣传稿很难发布在这些大型新闻媒体平台上。 媒体新闻发稿要求有哪些&#xff1f;就让我们来了解下哪几类稿件更容易过审。 一、媒体新闻发稿要求有哪…

“AI教学实训系统:打造未来教育的超级引擎

嘿&#xff0c;各位教育界的伙伴们&#xff0c;今天我要跟你们聊聊一个绝对能让你们眼前一亮的教学神器——AI教学实训系统。作为资深产品经理&#xff0c;我可是亲眼见证了这款系统如何颠覆传统教学&#xff0c;成为未来教育的超级引擎。 一、什么是AI教学实训系统&#xff1f…

基于JAVA的微信点餐小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【2024年华为OD机试】(A卷,200分)- 查找树中元素 (JavaScriptJava PythonC/C++)

一、问题描述 题目解析 题目描述 题目要求根据输入的坐标 (x, y) 在树形结构中找到对应节点的内容值。其中: x 表示节点所在的层数,根节点位于第0层,根节点的子节点位于第1层,依此类推。y 表示节点在该层内的相对偏移,从左至右,第一个节点偏移为0,第二个节点偏移为1,…

Pyecharts图表交互功能提升

在数据可视化中&#xff0c;交互功能可以极大地提升用户体验&#xff0c;让用户能够更加深入地探索数据。Pyecharts 提供了多种强大的交互功能&#xff0c;本篇将重点介绍如何使用缩略轴组件、配置图例交互&#xff0c;让我们的数据可视化作品更加生动有趣。 一、缩略轴组件使…

用layui表单,前端页面的样式正常显示,但是表格内无数据显示(数据库连接和获取数据无问题)——已经解决

这是我遇到的错误 原因&#xff1a;后端控制台的数据格式没有设置清楚 解决&#xff1a;1、加注释 ResponseBody &#xff0c;确保返回的是json数据。 2、要传三个参数到前端&#xff0c;如下图第二个红色框框所示。因为layui框架代码如果未修改&#xff0c;默认要传入这三个…

单片机基础模块学习——按键

一、按键原理图 当把跳线帽J5放在右侧&#xff0c;属于独立按键模式&#xff08;BTN模式&#xff09;&#xff0c;放在左侧为矩阵键盘模式&#xff08;KBD模式&#xff09; 整体结构是一端接地&#xff0c;一端接控制引脚 之前提到的都是使用了GPIO-准双向口的输出功能&#x…

mybatis是什么?有什么作用?mybatis的简单使用

mybatis是什么&#xff1f; MyBatis 是一个持久层框架。 有什么作用&#xff1f; 简化了对数据库数据的操作。 如何简化数据操作的&#xff1f; MyBatis 通过提供 SQL 映射、动态 SQL、结果映射、事务管理等功能&#xff0c;我们直接去用就可以了。 怎么使用&#xff1f;&…

webpack 打包自己的--windows

第一步安装node 1、安装nodejs:https://nodejs.org/zh-cn/download/releases/ 一、Window系统配置&#xff1a; 打开命令窗口,进入当前工程目录 npm配置淘宝镜像:npm config set registry http://registry.npm.taobao.org/ npm安装parcel-bundler:npm install -g parcel-bund…

微服务学习-Nacos 注册中心实战

1. 注册中心的设计思路 1.1. 微服务为什么会用到注册中心&#xff1f; 服务与服务之间调用需要有服务发现功能&#xff1b;例如订单服务调用库存服务&#xff0c;库存服务如果有多个&#xff0c;订单服务到底调用那个库存服务呢&#xff08;负载均衡器&#xff09;&#xff0…

MySQL数据库 - 语法知识

一 数据模型 1 关系型数据库管理系统&#xff08;RDBMS&#xff09; 概念&#xff1a;建立在关系模型基础上&#xff0c;有多张相互连接的二维表组成的数据库。 特点&#xff1a; 使用表存储数据&#xff0c;格式统一&#xff0c;便于维护。使用SQL语言操作&#xff0c;标准…

有限元分析学习——Anasys Workbanch第一阶段笔记(15)接触间隙处理与赫兹接触

目录 0 序言 1 接触的间隙处理 1.1 结果对比 1.2 处理方法 2 赫兹接触 0 序言 本章主要介绍间隙出现时的三种解决方法&#xff0c;齿轮点蚀/表面剥落涉及的赫兹接触的一些理论知识。 1 接触的间隙处理 在实际产品过程中&#xff0c;很多时候由于设计问题&#xff0c;原本…