基于STC15系列库操作LED灯

一、准备工作

1. 基于STC15系列库的工程模板

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

2. Keil编译器

二、程序编写

1. 新建 led.c 和 led.h 文件并存放于 user/led 文件夹下;

2. 新建 user.c 和 user.h 文件并存放于 user 文件夹下;

3. 将 user.c 文件 led.c 文件添加进工程分组 user 组别下;

4. 将 user.h 文件目录和 led.h 文件目录添加进头文件检索目录内;

5. 在 main.c 文件中添加以下代码内容;

#include "user.h"void main()
{User_Init();            //上电初始化,在该函数内实现上电后所需要的所有初始化操作while(1){LED_OnOrOff(LED_ON);        //打开LEDdelay_ms(500);LED_OnOrOff(LED_OFF);       //关闭LEDdelay_ms(500);}
}

 6. 在 led.c 函数中添加以下代码内容;

#include "led.h"//设置LED电路引脚
#define LED_Px GPIO_P1
#define LED_Py GPIO_Pin_0//设置LED引脚为推挽输出模式
void LED_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Mode = GPIO_OUT_PP;GPIO_InitStructure.Pin  = LED_Py;GPIO_Inilize(LED_Px, &GPIO_InitStructure);
}//制作开关LED的驱动函数
void LED_OnOrOff(unsigned char LED_Sta)
{if(LED_Sta){GPIO_PIN_Set(LED_Px, LED_Py);}else{GPIO_PIN_ReSet(LED_Px, LED_Py);}
}//制作GPIO的初始化函数
void GPIO_Init(void)
{LED_Init();    //对LED引脚初始化
}

7.  在 led.h 文件中添加以下代码内容;

#ifndef __LED_H__
#define __LED_H__#include "gpio.h"//宏定义灯的开关标识符号,便于程序理解
#define LED_ON  0
#define LED_OFF 1//声明所有在led.c文件中定义的函数
void LED_Init(void);void LED_OnOrOff(unsigned char LED_Sta);void GPIO_Init(void);#endif

8. 在 user.c 文件中添加以下代码内容;

#include "user.h"void User_Init(void)
{GPIO_Init();      //通用IO端口初始化
}

9. 在 user.h 文件中添加以下代码内容;

#ifndef __USER_H__
#define __USER_H__//文件引用
#include "config.h"
#include "led.h"
#include "delay.h"//函数声明
void User_Init(void);#endif

10. 按正常库设计逻辑,LED驱动工程到此已经结束,用户应该可以编译运行,并下载看程序效果了,很遗憾,本程序出现了报错;因为在 led.c 文件中使用了两个官方库未定义的函数:

//制作开关LED的驱动函数
void LED_OnOrOff(unsigned char LED_Sta)
{if(LED_Sta){GPIO_PIN_Set(LED_Px, LED_Py);           //官方库未定义}else{GPIO_PIN_ReSet(LED_Px, LED_Py);         //官方库未定义}
}

这两个函数的功能很简单用于对特定引脚置位或重置操作,即拉高或拉低电平信号;由于在以后的众多功能中都需要这么操作,在该官方库中我自作主张添加了以上两个函数;具体内容见步骤11、步骤12;

11. 在 gpio.h 文件 u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx); 函数上方添加以下代码内容;

typedef struct
{u8	Mode;		//IO模式,  		GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPu8	Pin;		//要设置的端口	
} GPIO_InitTypeDef;//添加置位与重置函数声明
u8 GPIO_PIN_Set(u8 GPIO, u8 GPIO_Pin_x);
u8 GPIO_PIN_ReSet(u8 GPIO, u8 GPIO_Pin_x);u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx);

12. 在 gpio.c 文件 u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx); 函数上方添加以下代码内容;

//添加置位函数定义
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;
}

13. 保存所有文件并编译即可完成LED驱动例程;

14. 工程文件:基于STC15系列库的LED工程样例资源-CSDN文库

三、总结

使用STC15系列库在小工程上的复杂程度提升了很多倍,这会使的很多同学放弃使用库函数来学习,这是无法避免的;但我们不能忽视使用库所带来的优势,程序的可读性大大加强,程序的统一操作使程序在相互之间的流通性大大提升,也许你们还没有意识到库的优势,但还是希望你们保持一颗热情的心继续深入学习一下,也许很快你就能体会到库的魅力;

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

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

相关文章

如何辨别:DNS污染or DNS劫持?

DNS劫持和DNS污染的情况在互联网中并不少见,到底是出现了DNS污染还是DNS劫持。什么是DNS污染?什么是DNS劫持?我们该如何辨别DNS污染和DNS劫持? DNS劫持: DNS 劫持是指恶意攻击者通过非法手段篡改了网络中的 DNS 服务…

android 创建module

文章目的: 快速创建module并使用 创建步骤: 1 创建module 2 修改module下的build.gradle文件 3 修改清单文件中MainActivity属性,否则APP会因为有多个启动界面而崩溃 4 在主项目build.gradle引用该object Module 至此,可在APP中…

针对springcloud gateway 跨域问题解决方案

springcloud gateway版本 <spring-boot.version>2.3.3.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR8</spring-cloud.version>跨域问题说明 application:1 Access to XMLHttpRequest at https://xxxxxxxxxx from origin http://l…

Goland远程连接Linux进行项目开发

文章目录 1、Linux上安装go的环境&#xff12;、配置远程连接3、其他配置入口 跑新项目&#xff0c;有个confluent-Kafka-go的依赖在Windows上编译不通过&#xff0c;报错信息&#xff1a; undefined reference to __imp__xxx似乎是这个依赖在Windows上不支持&#xff0c;选择让…

IMX6ULL-UBOOT驱动移植

介绍 IMX6ULL正点原子开发板使用的是14x14_evk的芯片 其中14x14代表的是芯片的尺寸。 本教程的标识符以nsouther或者 NSOUTHER NSouther为主 添加板子自己的配置文件 板子的默认配置文件保存在 configs目录下&#xff0c;我们以mx6ull_14x14_evk_emmc_defconfig为主&#xf…

SOT23-6封装单键触摸感应触发芯片TC233A

前言&#xff1a; 触摸芯片很多&#xff0c;现在触摸按键已经应用到很多行业&#xff0c;虽然不能覆盖所有的按键&#xff0c;但确实用的越来越多&#xff0c;国产的价格也便宜的令人发指&#xff0c;比如这个TC233A&#xff0c;也就一毛多一点。 TC233A概述 TC233A 是一个单…

【Shell语言】linux中awk命令

linux中awk命令 看这里放声嘶吼谁也不舍得沉默 宽阔也抓不住我下一秒钟的echo ——《暂时失控》苏打绿 awk命令简介 AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&#xff0c;Peter Weinberger, 和 B…

请陪伴Kimi和GPT成长

经验的闪光汤圆 但是我想要写实的 你有吗&#xff1f; 岁数大了&#xff0c;希望如何学习新知识呢&#xff1f;又觉得自己哪些能力亟需补强呢&#xff1f; 看论文自然得用Kimi&#xff0c;主要是肝不动了&#xff0c;眼睛也顶不住了。 正好昨天跟专业人士学会了用工作流的办法跟…

Python中的Super方法实现问题及解决方案

1、问题背景 在Python中&#xff0c;super方法用于在子类中调用父类的方法。Guido van Rossum曾给出了一个纯Python实现的super方法&#xff0c;以便更好地理解其工作原理。然而&#xff0c;在这个实现中&#xff0c;存在一个问题&#xff1a;当传入的对象不是要调用的父类的实…

C++入门 (2)

文章目录 C入门C输入输出缺省参数全缺省半缺省函数声明与定义分离 函数重载C支持函数重载的原理--名字修饰 C入门 C输入输出 C输入输出包含在# include《iostream》中 cout 类似在控制台中输出&#xff0c;使用cout需要使用流插入符&#xff08;<<&#xff09; 这个符号…

Hotcoin4月16日上新热门资产:头部RWA技术提供方Centrifuge(CFG)

Hotcoin持续为全球600万用户发掘优质潜力资产&#xff0c;热门币种交易上热币。一文快速了解今日上新资产:Centrifuge(CFG) 推荐指数 8.2 交易对 CFG/USDT 交易时间 4月16日 19:00 资产赛道 RWA 项目简介 Centrifuge是一个去中心化资产融资协议&#xff0c;专注于释放现实世界资…

Object.hasOwn is not a function

背景 开发一个H5页面,使用Object.hasOwn来测试属性是否存在,在error监控中,发现某些用户访问会出现如下报错: 问题分析 因为不是所有的用户都报错,继而先去mdn上查看这个api的浏览器兼容性: Object.hasOwn() - JavaScript | MDN 从【Can I Use】上也查看了此web技术的…

STM32串口通信

一、串口发送 1.初始化引脚 void Serial_Init(uint32_t BaudRate) {RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA ,ENABLE );RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 ,ENABLE );GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP…

[疑难杂症2024-003]如何判断一张没有头信息的dcm图像,是否是压缩图像?

本文由Markdown语法编辑器编辑完成&#xff0e; 1. 前言: DCM格式&#xff0c;是医学图像领域里面的通用格式&#xff0e;DCM图像一般分为两大部分&#xff0c;一部分是TAG信息&#xff0c;一部分是像素. 而TAG信息&#xff0c;一般又会分为两部分&#xff0c;如下图所示, 是…

C++_智能指针

文章目录 前言一、智能指针原理二、库支持的智能指针类型1.std::auto_ptr2.std::unique_ptr3.std::shared_ptr4.std::weak_ptr 三、删除器总结 前言 智能指针是一种采用RAII思想来保护申请内存不被泄露的方式来管理我们申请的内存&#xff0c;对于RAII&#xff0c;我们之前也已…

LeetCode-热题100:102. 二叉树的层序遍历

题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a; root [3,9,20,null,null,15,7] 输出&#xff1a; [[3],[9,20],[15,7]] 示例 2&am…

【GEE实践应用】使用MODIS NDVI数据集绘制研究区域每日NDVI序列曲线

// 设置研究区域 var geometry table;// 选择MODIS NDVI 数据集 var modisNDVI ee.ImageCollection(MODIS/006/MOD13A2).filterBounds(geometry).filterDate(2000-01-01, 2023-12-31);// 计算每天的平均 NDVI var dailyMeanNDVI modisNDVI.map(function(image) {var date e…

AndroidStudio AGP 7+, 编译aar并输出到本地仓库

1 编写构建gradle脚本代码 1.1 配置publication和repository 在指定moudle目录下新建名为"maven-publish.gradle"文件&#xff0c;其声明的publication和repository如下所示&#xff1a; apply plugin: maven-publish// This creates a task called publishReleas…

# 从浅入深 学习 SpringCloud 微服务架构(二)模拟微服务环境

从浅入深 学习 SpringCloud 微服务架构&#xff08;二&#xff09;模拟微服务环境&#xff08;1&#xff09; 段子手168 1、打开 idea 创建父工程 创建 artifactId 名为 spring_cloud_demo 的 maven 工程。 --> idea --> File --> New --> Project --> Ma…

java高校办公室行政事务管理系统设计与实现(springboot+mysql源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于mvc的高校办公室行政…