基于STC15系列库操作流水灯

一、学习进度

1.51单片机工程模板的建立(基于STC15系列库)-CSDN博客

2.基于STC15系列库操作LED灯-CSDN博客

3.STC15系列库中两个自定义函数的更新-CSDN博客

二、流水灯设计

1.在LED例程之后大家通过对库的使用大致了解了一个过程,对于一个外设来说我们一般的操作过程是,初始化外设的相关硬件,比如IO口,STC15系列的芯片对每一个引脚都定义了多种功能,我们需要先将引脚定义为我们外设所需要的状态,才能正常操作外设。

初始化相关硬件后后,用户便可以开始对外设进行操作,比如拉高或拉低信号,对于复用性高的代码或操作比较复杂的操作可以定义相应的函数来实现,函数可以简化单段代码的长度,使代码看上去不再臃肿;

2.使用库对单个引脚初始化我们已经看过了,那对一个引脚组的初始化是什么样的呢?我们在led.c文件中添加以下代码


//定义流水灯的硬件引脚组
#define LEDFLOW_Px GPIO_P2
#define LEDFLOW_Py GPIO_Pin_All
//#define LEDFLOW    P2

//流水灯引脚初始化
void LEDFLOW_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_InitStructure.Mode = GPIO_OUT_PP;
	GPIO_InitStructure.Pin  = LEDFLOW_Py;

	GPIO_Inilize(LEDFLOW_Px, &GPIO_InitStructure);
}

//========================================================================
// 函数: void LEDFLOW_Flowing(char Direction, char FlowNum)
// 描述: 流水灯流动函数
// 参数: Direction: 流动起点
//       FlowNum  : 流动次数
// 返回: 成功返回0, 空操作返回1,错误返回2.
// 版本: V1.1,  2024年4月19日20:24:36
//========================================================================
void LEDFLOW_Flowing(char Direction, char FlowNum)
{
    int i = 8 * FlowNum;

    if(Direction == LEDFLOW_Right)
    {
        while(i--)
        {
//            LEDFLOW &= (~(0x01 << (i % 8)));
            GPIO_PIN_Set(LEDFLOW_Px, LEDFLOW_Py);           //清除所有引脚状态
            GPIO_PIN_Set(LEDFLOW_Px, ~(0x01 << (i % 8)));   //设置当前点亮的灯
            delay_ms(500);
        }
    }
    else
    {
        while(i--)
        {
//            LEDFLOW &= ~(0x80 >> (i % 8));
            GPIO_PIN_Set(LEDFLOW_Px, LEDFLOW_Py);           //清除所有引脚状态
            GPIO_PIN_Set(LEDFLOW_Px, ~(0x80 >> (i % 8)));   //设置当前点亮的灯
            delay_ms(500);
        }
    }
}

//制作GPIO的初始化函数
void GPIO_Init(void)
{
	LED_Init();         //对LED引脚初始化
    LEDFLOW_Init();     //流水灯引脚初始化
}

3.我们简单对比LED_Init();函数,很快就可以发现,初始化几乎是一样的,不同的只是定义的硬件电路有区别。将LEDFLOW_Init();在GPIO_Init()函数中调用后,对硬件的初始化就完成了。

当然这是函数的定义,各位同学千万别忘记了函数的声明;在led.h头文件中添加以下内容;

#ifndef __LED_H__
#define __LED_H__

#include "gpio.h"
#include "delay.h"

//宏定义灯的开关标识符号,便于程序理解
#define LED_ON  0
#define LED_OFF 1


//声明所有在led.c文件中定义的函数
void LED_Init(void);

void LED_OnOrOff(unsigned char LED_Sta);

#define LEDFLOW_Right  0
#define LEDFLOW_Left   1

//流水灯引脚初始化
void LEDFLOW_Init(void);

//流水灯流动函数
void LEDFLOW_Flowing(char Direction,char FlowNum);

void GPIO_Init(void);

#endif;

4.细心的同学们已经发现了我们将流水灯函数也加进来了,各位同学需要注意哦,由于还没使用定时器工具,我们使用了延时函数,所以要记得引用延时头文件哦;

5.实现流水灯的函数里,我们用上了我们定义的库函数,相比被注释掉的代码,我们可以发现,没有这个库函数时,我们不得不直接定义流水灯的引脚寄存器并直接操作它,而在初始化函数中却没法直接用寄存器传递参数,导致我们需要重复定义才能实现相同的需求。

6.接下来就是在主函数里面调用我们的流水灯函数,让灯跑起来了;

#include "user.h"

void main()
{
	User_Init();            //上电初始化,在该函数内实现上电后所需要的所有初始化操作

	while(1)
    {
        LEDFLOW_Flowing(LEDFLOW_Left, 2);

        LED_OnOrOff(LED_ON);        //打开LED
        delay_ms(500);
        LED_OnOrOff(LED_OFF);       //关闭LED
        delay_ms(500);

        LEDFLOW_Flowing(LEDFLOW_Right, 2);
    }
}

三、总结

1.简洁的主函数能让工程师清楚的知道系统在执行什么工作,保持一个好的代码习惯是一个好的开始继续努力吧;同学们加油!

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

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

相关文章

吹爆,一款实用的个人IT工具箱

作为一名开发人员&#xff0c;我们在日常工作和学习中常常需要使用一系列小工具&#xff0c;如JSON格式化、JSON转表格、当前时间戳、XML格式化、SQL格式化、密码生成以及UUID生成等。通常情况下&#xff0c;我们会在网上搜索各种在线工具来满足这些需求。 然而&#xff0c;这…

DePIN 赛道黑马,peaq network 如何打造全新 Web3 物联网?

当 Web2 公司仍对用户数据和资料进行“中心化”的收集与控制时&#xff0c;我们虽享受到了物联网技术的便利&#xff0c;却依旧没有逃脱个人数据和价值所有权的剥夺。由此&#xff0c;Web3 技术开始深入物联网世界&#xff0c;智能家居、智能汽车、智能手机都成为重要发力点&am…

冯喜运:4.19黄金,原油市场情绪分析:近期油价可能会回落?

【 黄金消息面解析】&#xff1a;周四(4月18日)&#xff0c;黄金上涨&#xff0c;现货金报每盎司2.384.83美元&#xff0c;上涨1%。中东地区持续的紧张局势未现缓和&#xff0c;继续扶持黄金逗留在历史高价位区域。周二美联储主席鲍威尔讲话&#xff0c;对何时可能降息三缄其口…

计算机比赛什么含金量高

acm含金量不如天梯&#xff0c;和蓝桥杯是同一层次 先说结论&#xff0c;根据专家讨论结果&#xff0c;蓝桥国一水平和icpc金牌含金量一样。&#xff08;doge 赢&#xff01;瑶瑶另先&#xff01; 会统计就多统计&#xff0c;我们acmer就是爱看这种数据 https://www.gxxsjs.co…

基于ssm高校宿舍管理系统论文

摘 要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前学校对于宿舍信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人力为主的管理模式已然落后。本人结…

探索 Nacos反序列化漏洞CNVD-2023-45001

在软件开发领域&#xff0c;安全漏洞是一项不容忽视的重要问题。最近&#xff0c;我们的安全团队发现了一个影响到我们的Nacos 2.1.0版本的反序列化漏洞&#xff0c;可能带来严重的安全威胁。我们已经立即采取了修复措施。本文将深入探讨这些漏洞的原理、可能造成的影响&#x…

拷贝构造函数与运算符重载

目录 一、拷贝构造函数 1.概念 2.特性 二、运算符重载 1.运算符重载 2.运算符重载实现的形式 3.赋值运算符重载 一、拷贝构造函数 1.概念 拷贝构造函数是一种特殊的构造函数&#xff0c;它在创建对象时&#xff0c;使用同一类中之前创建的对象来初始化新创建的对象…

C# 动态加载dll

方式1 using System; using System.Reflection;class Program {static void Main(){string dllPath "path/to/your/library.dll"; // 替换为你的DLL文件路径Assembly myAssembly Assembly.LoadFile(dllPath);Type myType myAssembly.GetType("YourNamespace…

力扣—2024/4/18—从双倍数组中还原原数组

代码实现&#xff1a; 快排 哈希表 ——超时 /*** Note: The returned array must be malloced, assume caller calls free().*/ void swap(int *m, int *n) {int temp *m;*m *n;*n temp; }// 快排 void sort(int *a, int l, int r) { // 左闭右开if (r - l < 2) {if (r…

MIMO(多天线)通信的四种译码算法

目录 一. 介绍 二. 极大似然译码 三. 破零译码算法 四. 最小均方误差算法 五. 球形译码 一. 介绍 发射天线数记为Mt&#xff0c;接收天线数记为Mr。由此发射信号x为向量&#xff1a; 接受信号y为向量&#xff1a; 信道H为矩阵&#xff1a; 利用n代表噪声向量&#xff0c;…

axios的封装理解和基本使用

axios的配置 ruoyi的前端对axios进行了封装&#xff0c;让我们发get请求或者是post请求更加方便了。 ruoyi对axios的封装在下面文件中&#xff1a;打开文件&#xff0c;可以看到它有三个显眼的方法&#xff0c;分别是request拦截器、response拦截器和通用下载方法。ruoYi接口地…

CommunityToolkit.Mvvm笔记---ObservableValidator

ObservableValidator 是实现 INotifyDataErrorInfo 接口的基类&#xff0c;它支持验证向其他应用程序模块公开的属性。 它也继承自 ObservableObject&#xff0c;因此它还可实现 INotifyPropertyChanged 和 INotifyPropertyChanging。 它可用作需要支持属性更改通知和属性验证的…

Redis中的Lua脚本(五)

Lua脚本 脚本复制 复制EVALSHA命令 EVALSHA命令式所有与Lua脚本有关的命令中&#xff0c;复制操作最复杂的一个&#xff0c;因为主服务器与从服务器载入Lua脚本的情况可能有所不同&#xff0c;所以主服务器不能像复制EVAL命令、SCRIPT LOAD命令或者SCRIPT FLUSH命令那样&…

2024 Polkadot Decoded 大会亮点前瞻,立即预定参会席位

原文&#xff1a;https://medium.com/polkadotnetwork/polkadot-decoded-2024-uniting-innovators-in-blockchain-technology-75fc3d8e93fe 作者&#xff1a;Polkadot 编译&#xff1a;OneBlock Polkadot 生态宣布他们的旗舰活动 —— Polkadot Decoded 将再次举行&#xff…

跟TED演讲学英文:How AI could empower any business by Andrew Ng

How AI could empower any business Link: https://www.ted.com/talks/andrew_ng_how_ai_could_empower_any_business Speaker: Andrew Ng Date: April 2022 文章目录 How AI could empower any businessIntroductionVocabularyTranscriptSummary后记 Introduction Expensiv…

von Mises-Fisher Distribution (Appendix 2)

5.3 Fast Python Sampler of the von Mises Fisher Distribution [3] 从论文中 p r o c e d u r e A n g l e G e n e r a t o r ( d , κ ) procedure~AngleGenerator(d, κ) procedure AngleGenerator(d,κ) 中的变换来看, 假设 y ∼ B e ( m − 1 2 , m − 1 2 ) y \sim …

Linux【实战】—— LAMP环境搭建 部署网站

目录 一、介绍 1.1什么是LAMP&#xff1f; 1.2LAMP的作用 二、部署静态网站 2.1 虚拟主机&#xff1a;一台服务器上部署多个网站 2.1.1 安装Apache服务 2.1.2 防火墙配置 2.1.3 准备网站目录 2.1.4 创建网站的配置文件 2.1.5 检查配置文件是否正确 2.1.6 Linux客户端…

【华为 ICT HCIA eNSP 习题汇总】——题目集17

1、以下哪项不属于网络层安全威胁&#xff1f; A、DDos攻击 B、钓鱼攻击 C、IP Spoofing D、IP地址扫描 考点&#xff1a;网络安全 解析&#xff1a;&#xff08;B&#xff09; 钓鱼攻击通常被认为是应用层的安全威胁&#xff0c;也有在网络层进行伪装实施钓鱼攻击&#xff0c;…

TCP/IP常用协议栈图解

1.引言 最近看了一些计算机网络的课程&#xff0c;总结借鉴了一些TCP/IP常用协议&#xff0c;罗列在以下图中&#xff0c;以便有一个整体观。 2.图解 先上图 3.总结 TCP/IP协议是实际用的计算机网络通信的标准协议栈&#xff0c;自上而下分为应用层&#xff0c;传输层&#xf…

关于二级指针void**的一点问题与思考

前言 这两天写一个高并发内存池的项目时&#xff0c;遇到了一个关于二级指针的问题&#xff0c;剖析清楚后发觉有必要记录一下&#xff0c;这让我加深了对于C/C中指针的理解&#xff08;果然学到老活到老&#xff09;。 问题的分析 在我的内存池项目中&#xff0c;有一个需求…
最新文章