STC15系列库中两个自定义函数的更新

一、事件背景

1.出于操作IO口的需求,在LED操作例程当中我在官方库当中添加了两个gpio函数;详见基于STC15系列库操作LED灯-CSDN博客;在新的例程中察觉到两个函数操作的局限性,于是将两个函数内容进行相应修改,使其能适应更广泛的场景。

二、函数修改部分说明

1.原函数内容,原函数的局限在于单次只能操作一个引脚,而不能批量操作,对于51单片机常用的流水灯,数码管,点阵等外设操作无法起到简化操作的作用;

//添加置位函数定义
u8 GPIO_PIN_Set(u8 GPIO, u8 GPIO_Pin_x)
{
    if(GPIO > GPIO_P5)				return 1;	//空操作
    if(GPIO_Pin_x > GPIO_Pin_7)	    return 2;	//空操作

    if(GPIO == GPIO_P0)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P00 = 1;
        if(GPIO_Pin_x == GPIO_Pin_1)    P01 = 1;
        if(GPIO_Pin_x == GPIO_Pin_2)    P02 = 1;
        if(GPIO_Pin_x == GPIO_Pin_3)    P03 = 1;
        if(GPIO_Pin_x == GPIO_Pin_4)    P04 = 1;
        if(GPIO_Pin_x == GPIO_Pin_5)    P05 = 1;
        if(GPIO_Pin_x == GPIO_Pin_6)    P06 = 1;
        if(GPIO_Pin_x == GPIO_Pin_7)    P07 = 1;
    }
    else if(GPIO == GPIO_P1)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P10 = 1;
        if(GPIO_Pin_x == GPIO_Pin_1)    P11 = 1;
        if(GPIO_Pin_x == GPIO_Pin_2)    P12 = 1;
        if(GPIO_Pin_x == GPIO_Pin_3)    P13 = 1;
        if(GPIO_Pin_x == GPIO_Pin_4)    P14 = 1;
        if(GPIO_Pin_x == GPIO_Pin_5)    P15 = 1;
        if(GPIO_Pin_x == GPIO_Pin_6)    P16 = 1;
        if(GPIO_Pin_x == GPIO_Pin_7)    P17 = 1;
    }
    else if(GPIO == GPIO_P2)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P20 = 1;
        if(GPIO_Pin_x == GPIO_Pin_1)    P21 = 1;
        if(GPIO_Pin_x == GPIO_Pin_2)    P22 = 1;
        if(GPIO_Pin_x == GPIO_Pin_3)    P23 = 1;
        if(GPIO_Pin_x == GPIO_Pin_4)    P24 = 1;
        if(GPIO_Pin_x == GPIO_Pin_5)    P25 = 1;
        if(GPIO_Pin_x == GPIO_Pin_6)    P26 = 1;
        if(GPIO_Pin_x == GPIO_Pin_7)    P27 = 1;
    }
    else if(GPIO == GPIO_P3)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P30 = 1;
        if(GPIO_Pin_x == GPIO_Pin_1)    P31 = 1;
        if(GPIO_Pin_x == GPIO_Pin_2)    P32 = 1;
        if(GPIO_Pin_x == GPIO_Pin_3)    P33 = 1;
        if(GPIO_Pin_x == GPIO_Pin_4)    P34 = 1;
        if(GPIO_Pin_x == GPIO_Pin_5)    P35 = 1;
        if(GPIO_Pin_x == GPIO_Pin_6)    P36 = 1;
        if(GPIO_Pin_x == GPIO_Pin_7)    P37 = 1;
    }
    else if(GPIO == GPIO_P4)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P40 = 1;
        if(GPIO_Pin_x == GPIO_Pin_1)    P41 = 1;
        if(GPIO_Pin_x == GPIO_Pin_2)    P42 = 1;
        if(GPIO_Pin_x == GPIO_Pin_3)    P43 = 1;
        if(GPIO_Pin_x == GPIO_Pin_4)    P44 = 1;
        if(GPIO_Pin_x == GPIO_Pin_5)    P45 = 1;
        if(GPIO_Pin_x == GPIO_Pin_6)    P46 = 1;
        if(GPIO_Pin_x == GPIO_Pin_7)    P47 = 1;
    }
    else if(GPIO == GPIO_P5)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P50 = 1;
        if(GPIO_Pin_x == GPIO_Pin_1)    P51 = 1;
        if(GPIO_Pin_x == GPIO_Pin_2)    P52 = 1;
        if(GPIO_Pin_x == GPIO_Pin_3)    P53 = 1;
        if(GPIO_Pin_x == GPIO_Pin_4)    P54 = 1;
        if(GPIO_Pin_x == GPIO_Pin_5)    P55 = 1;
        if(GPIO_Pin_x == GPIO_Pin_6)    P56 = 1;
        if(GPIO_Pin_x == GPIO_Pin_7)    P57 = 1;
    }

    return 0;
}

//添加重置函数定义
u8 GPIO_PIN_ReSet(u8 GPIO, u8 GPIO_Pin_x)
{
    if(GPIO > GPIO_P5)				return 1;	//空操作
    if(GPIO_Pin_x > GPIO_Pin_7)	    return 2;	//空操作

    if(GPIO == GPIO_P0)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P00 = 0;
        if(GPIO_Pin_x == GPIO_Pin_1)    P01 = 0;
        if(GPIO_Pin_x == GPIO_Pin_2)    P02 = 0;
        if(GPIO_Pin_x == GPIO_Pin_3)    P03 = 0;
        if(GPIO_Pin_x == GPIO_Pin_4)    P04 = 0;
        if(GPIO_Pin_x == GPIO_Pin_5)    P05 = 0;
        if(GPIO_Pin_x == GPIO_Pin_6)    P06 = 0;
        if(GPIO_Pin_x == GPIO_Pin_7)    P07 = 0;
    }
    else if(GPIO == GPIO_P1)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P10 = 0;
        if(GPIO_Pin_x == GPIO_Pin_1)    P11 = 0;
        if(GPIO_Pin_x == GPIO_Pin_2)    P12 = 0;
        if(GPIO_Pin_x == GPIO_Pin_3)    P13 = 0;
        if(GPIO_Pin_x == GPIO_Pin_4)    P14 = 0;
        if(GPIO_Pin_x == GPIO_Pin_5)    P15 = 0;
        if(GPIO_Pin_x == GPIO_Pin_6)    P16 = 0;
        if(GPIO_Pin_x == GPIO_Pin_7)    P17 = 0;
    }
    else if(GPIO == GPIO_P2)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P20 = 0;
        if(GPIO_Pin_x == GPIO_Pin_1)    P21 = 0;
        if(GPIO_Pin_x == GPIO_Pin_2)    P22 = 0;
        if(GPIO_Pin_x == GPIO_Pin_3)    P23 = 0;
        if(GPIO_Pin_x == GPIO_Pin_4)    P24 = 0;
        if(GPIO_Pin_x == GPIO_Pin_5)    P25 = 0;
        if(GPIO_Pin_x == GPIO_Pin_6)    P26 = 0;
        if(GPIO_Pin_x == GPIO_Pin_7)    P27 = 0;
    }
    else if(GPIO == GPIO_P3)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P30 = 0;
        if(GPIO_Pin_x == GPIO_Pin_1)    P31 = 0;
        if(GPIO_Pin_x == GPIO_Pin_2)    P32 = 0;
        if(GPIO_Pin_x == GPIO_Pin_3)    P33 = 0;
        if(GPIO_Pin_x == GPIO_Pin_4)    P34 = 0;
        if(GPIO_Pin_x == GPIO_Pin_5)    P35 = 0;
        if(GPIO_Pin_x == GPIO_Pin_6)    P36 = 0;
        if(GPIO_Pin_x == GPIO_Pin_7)    P37 = 0;
    }
    else if(GPIO == GPIO_P4)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P40 = 0;
        if(GPIO_Pin_x == GPIO_Pin_1)    P41 = 0;
        if(GPIO_Pin_x == GPIO_Pin_2)    P42 = 0;
        if(GPIO_Pin_x == GPIO_Pin_3)    P43 = 0;
        if(GPIO_Pin_x == GPIO_Pin_4)    P44 = 0;
        if(GPIO_Pin_x == GPIO_Pin_5)    P45 = 0;
        if(GPIO_Pin_x == GPIO_Pin_6)    P46 = 0;
        if(GPIO_Pin_x == GPIO_Pin_7)    P47 = 0;
    }
    else if(GPIO == GPIO_P5)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P50 = 0;
        if(GPIO_Pin_x == GPIO_Pin_1)    P51 = 0;
        if(GPIO_Pin_x == GPIO_Pin_2)    P52 = 0;
        if(GPIO_Pin_x == GPIO_Pin_3)    P53 = 0;
        if(GPIO_Pin_x == GPIO_Pin_4)    P54 = 0;
        if(GPIO_Pin_x == GPIO_Pin_5)    P55 = 0;
        if(GPIO_Pin_x == GPIO_Pin_6)    P56 = 0;
        if(GPIO_Pin_x == GPIO_Pin_7)    P57 = 0;
    }

    return 0;
}

2.新函数内容,新胡函数内容将可以同时操作多个引脚,引脚控制方法,保留了和库操作相同的方式,优化了操作效率,详细代码如下:


//========================================================================
// 函数: u8 GPIO_PIN_Set(u8 GPIO, u8 GPIO_Pin_x)
// 描述: 将指定的IO口输出状态改为1
// 参数: GPIO_Pin_x: 支持异或操作   GPIO_Pin_1 | GPIO_Pin_2
// 返回: 成功返回0, 空操作返回1,错误返回2.
// 版本: V1.1,  2024年4月19日20:24:36
//========================================================================
u8 GPIO_PIN_Set(u8 GPIO, u8 GPIO_Pin_x)
{
    if(GPIO > GPIO_P5)				return 1;	//空操作
    if(GPIO_Pin_x > GPIO_Pin_All)	    return 2;	//空操作

    if(GPIO == GPIO_P0)
    {
        P0 |= GPIO_Pin_x;
    }
    else if(GPIO == GPIO_P1)
    {
        P1 |= GPIO_Pin_x;
    }
    else if(GPIO == GPIO_P2)
    {
        P2 |= GPIO_Pin_x;
    }
    else if(GPIO == GPIO_P3)
    {
        P3 |= GPIO_Pin_x;
    }
    else if(GPIO == GPIO_P4)
    {
        P4 |= GPIO_Pin_x;
    }
    else if(GPIO == GPIO_P5)
    {
        P5 |= GPIO_Pin_x;
    }

    return 0;
}

//========================================================================
// 函数: u8 GPIO_PIN_ReSet(u8 GPIO, u8 GPIO_Pin_x)
// 描述: 将指定的IO口输出状态改为0
// 参数: GPIO_Pin_x: 支持异或操作   GPIO_Pin_1 | GPIO_Pin_2
// 返回: 成功返回0, 空操作返回1,错误返回2.
// 版本: V1.1,  2024年4月19日20:24:01
//========================================================================
u8 GPIO_PIN_ReSet(u8 GPIO, u8 GPIO_Pin_x)
{
    if(GPIO > GPIO_P5)				return 1;	//空操作
    if(GPIO_Pin_x > GPIO_Pin_7)	    return 2;	//空操作

    if(GPIO == GPIO_P0)
    {
        P0 &= (~ GPIO_Pin_x);
    }
    else if(GPIO == GPIO_P1)
    {
        P1 &= (~ GPIO_Pin_x);
    }
    else if(GPIO == GPIO_P2)
    {
        P2 &= (~ GPIO_Pin_x);
    }
    else if(GPIO == GPIO_P3)
    {
        P3 &= (~ GPIO_Pin_x);
    }
    else if(GPIO == GPIO_P4)
    {
        P4 &= (~ GPIO_Pin_x);
    }
    else if(GPIO == GPIO_P5)
    {
        P5 &= (~ GPIO_Pin_x);
    }

    return 0;
}

三、总结

新的函数内容无论从内容,还是操作效率上都比原结构要简洁高效;各位朋友是否还有更高效的实现方式,欢迎留言

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

与上级意见不合时如何恰当地表达自己的观点?

在工作中与上级意见不合时,恰当表达自己的观点并寻求共识是一个需要谨慎处理的问题。以下是一些建议: 1. **尊重与礼貌**:在任何情况下,都应保持对上级的尊重和礼貌。即使在意见不合时,也要避免情绪化,保持…

简单二分应用

思路&#xff1a;首先二分需要数列有二分性&#xff0c;我们要对数列排序&#xff0c;然后二分距离&#xff0c;直到出现一个距离可以满足&#xff0c;点数大于等于k。 代码&#xff1a; void solve(){int n, q;cin >> n >> q;vector<int>a(n);for(int i …

代码随想录:二叉树11-12

目录 222.完全二叉树的节点个数 题目 代码&#xff08;层序迭代&#xff09; 代码&#xff08;后序递归&#xff09; 代码&#xff08;满二次树递归&#xff09; 总结 110.平衡二叉树 题目 代码&#xff08;后序递归&#xff09; 代码&#xff08;层序迭代&#xff0…

设置表格高度后,数值改变但实际不变

1.选中表格 2.点击“开始”——>“段落设置”的选项启动按钮&#xff0c;设置为单倍行距 3.可以看到&#xff0c;表格的行高被调小了。

如何高效建立企业绩效评估体系?这家世界500强企业用BI工具这么做

在目前经济下行&#xff0c;竞争激烈&#xff0c;向精细化管理要效益的社会背景下&#xff0c;如何对资金结算部门做好绩效管理&#xff0c;以保障组织的正常运作&#xff0c;是各大企业面对的重要痛点。 本文将基于某世界500强公司的财务共享资金结算部门的绩效管理办法&…

河北专升本(c语言各种编程题)

目录 第一类、递归调用 第二类、特殊数字 第三类、多维数组 第四类、字符处理 第五类、数学问题 第六类、排序算法 第七类、循环问题 第八类、进制转换 第九类、实际应用 第十类、图形输出 第一类、递归调用 1.汉诺塔&#xff1a;请输入盘子数&#xff0c;输出盘子移动…

海外媒体如何发布软文通稿

大舍传媒-带您了解海外发布新潮流 随着全球化的不断深入&#xff0c;越来越多的中国企业开始关注海外市场。为了在国际舞台上树立品牌形象&#xff0c;企业纷纷寻求与海外媒体合作&#xff0c;通过发布软文通稿的方式&#xff0c;传递正面信息&#xff0c;提升品牌知名度。作为…

【4071】基于小程序实现的活动报名管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

抹机王的使用教程以及常见问题

首先请确保你已经正常安装了XPosed/EDXP/LSP框架并已激活抹机王模块&#xff0c;其中XP和EDXP模块均只需要框架内激活抹机王并重启即可&#xff0c;LSPosed注意作用域需要勾选上自己想要修改的APP&#xff08;如果你还是一意孤行只勾选系统框架那改机完全没用就是你自己的想法了…

设计模式之模板方法模式详解(下)

3&#xff09;钩子方法的使用 1.概述 钩子方法的引入使得子类可以控制父类的行为。 2.结构图 3.代码实现 将公共方法和框架代码放在抽象父类中 abstract class DataViewer {//抽象方法&#xff1a;获取数据public abstract void GetData();//具体方法&#xff1a;转换数据…

每日一题 — 最小覆盖子串

76. 最小覆盖子串 - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a;暴力遍历哈希表 解法二&#xff1a;滑动窗口哈希表 定义left和right初始化为零&#xff0c;固定left&#xff0c;先向右遍历right&#xff0c;放到哈希表中这个时候我们需要统计有效字符的个数&…

深入挖掘C语言 ---- 文件操作

目录 1. 文件的打开和关闭1.1 流和标准流1.1.1流1.1.2标准流 1.2 文件指针1.3 文件的打开和关闭 2. 顺序读写3. 随机读写3.1 fseek3.2 ftell3.3 rewind 4. 读取结束判定 正文开始 1. 文件的打开和关闭 1.1 流和标准流 1.1.1流 我们程序的数据需要输出到各种外部设备, 也需要…

Leetcode算法训练日记 | day30

一、重新安排行程 1.题目 Leetcode&#xff1a;第 332 题 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发…

java算法day2

螺旋矩阵搜索插入位置查找元素第一个位置和最后一个位置 螺旋矩阵 解法&#xff1a;模拟&#xff0c;核心在于你怎么转&#xff0c;还有就是处理边界&#xff0c;边界如何收缩&#xff0c;什么时候停止旋转。最内圈的时候怎么处理。 通过上图的模拟来解决这个问题&#xff1a;…

数据库锁等待排查方法、命令行安装数据库及授权文件更新

欢迎关注“数据库运维之道”公众号&#xff0c;一起学习数据库技术! 本期将为大家分享“数据库锁等待排查方法、命令行安装数据库及授权文件更新”的运维技能。 关键词&#xff1a;锁等待、V$LOCK、V$TRXWAIT、死锁、锁超时、命令行部署达梦、授权文件更新 当用户反馈执行SQL语…

1985-2022年各地级市专利申请数据

1985-2022年各地级市专利申请数据 1、时间&#xff1a;1985-2022年 2、指标&#xff1a;行政区划代码、地区、省份、城市、年份、发明公布&#xff08;申请数&#xff09;、其中&#xff1a;获得授权、外观设计申请量、实用新型申请量 3、来源&#xff1a;国家知识产权局 4…

【Java】简单实现图书管理系统

前言 在本篇博客当中&#xff0c;我们会使用Java基础语法来简单实现一个图书管理系统&#xff0c;主要用到的知识为&#xff1a;封装、多态、继承、接口等等&#xff0c;并不会使用数据库来存储数据&#xff0c;请注意 需求 1. 要求设置管理员和普通用户两种身份&#xff0c…

【深度学习实战(9)】三种保存和加载模型的方式

一、state_dict方式&#xff08;推荐&#xff09; torch.save(model.state_dict(), PATH)model YourModel() model.load_state_dict(torch.load(PATH)) model.eval()记住一定要使用model.eval()来固定dropout和归一化层&#xff0c;否则每次推理会生成不同的结果。 二、整个…

实验室三大常用仪器3---交流毫伏表的使用方法(笔记)

目录 函数信号发生器、示波器、交流毫伏表如果连接 交流毫伏表的使用方法 测量值的读数问题 实验室三大常用仪器1---示波器的基本使用方法&#xff08;笔记&#xff09;-CSDN博客 实验室三大常用仪器2---函数信号发生器的基本使用方法&#xff08;笔记&#xff09;-CSDN博客…

C#自定义窗体更换皮肤的方法:创建特殊窗体

目录 1.窗体更换皮肤 2.实例 &#xff08;1&#xff09;图片资源管理器Resources.Designer.cs设计 &#xff08;2&#xff09;Form1.Designer.cs设计 &#xff08;3&#xff09;Form1.cs设计 &#xff08;4&#xff09; 生成效果 &#xff08;5&#xff09;一个遗憾 1.窗…
最新文章