单片机模块化编程文件创建流程
一、在工程文件夹下创建一个新的文件夹,命名为“ModulesCodesFiles”,译为“模块化代码文件”,用于存放所有模块化代码文件。
二、在“ModulesCodesFiles”文件夹下为每个模块创建一个新的文件夹,命名为模块的名称,例如“Main”、“KEY”或“LED”。
1、在每个模块的文件夹下创建两个文件,主函数的模块除外,KEY模块可创建一个.c源文件(例如:KEY.c)和一个.h头文件(例如:KEY.h),LED模块可创建一个.c 源文件(例如:LED.c)和一个.h头文件(例如:LED.h)。
(1)、.c文件:实现函数功能、定义变量 (允许赋初值)、定义I/0口、定义宏等
(2)、.h文件:声明函数、声明变量 (不允许赋初值)、声明常量、声明I/0口、声明宏等。
2、例如:在Main模块的Main.c文件中,可以编写以下代码:
#include <reg52.h> //51单片机头文件
#include "LED.h" //包含LED模块的头文件
#include "KEY.h" //包含KEY模块的头文件 void main(void)
{ LED_Init(); //初始化LED模块和LED控制引脚(P2.0)为输出模式,初始为关闭状态(低电平),LED状态变量默认为LED_OFF(0)状态。 KEY_Init(); //初始化KEY输入引脚为输入模式,初始为释放状态(高电平),KEY状态变量默认为KEY_RELEASED(0)状态。 while(1) { //循环检测按键状态 if (KEY_Scan() == KEY_PRESSED) { //按键被按下 LED_Control(LED_ON); //打开LED } else { //按键未按下 LED_Control(LED_OFF); //关闭LED } } }
3、不用在Main模块创建Main.h文件,直接在Main模块的Main.c文件完成。
4、例如:在KEY模块的KEY.c文件中,可以编写以下代码:
#include "KEY.h" void KEY_Init(void)
{ //初始化KEY输入引脚为输入模式(默认为高电平) KEY_PIN = KEY_RELEASED; //将KEY输入引脚初始化为释放状态(高电平),KEY状态变量默认为KEY_RELEASED(0)状态。 } void KEY_Scan(void)
{ //扫描按键状态 if (KEY_PIN == KEY_RELEASED) { //按键未按下 key_state = KEY_RELEASED; //保持当前按键状态为释放状态 } else { //按键被按下 key_state = KEY_PRESSED; //反转按键状态为按下状态 } }
5、例如:在KEY模块的KEY.h文件中,可以编写以下代码:
#ifndef KEY_H
#define KEY_H
//IO口定义
#define KEY_PIN P3_0 //按键输入引脚
//变量定义
unsigned char key_state = KEY_RELEASED; //按键状态变量(默认为释放状态)
//常量定义
#define KEY_PRESSED 1 //按键按下状态常量(1表示按下)
#define KEY_RELEASED 0 //按键释放状态常量(0表示释放)
//宏定义
#define Detection_Button() do { if (KEY_PIN == KEY_PRESSED) {Reverse_Key_Status();} } while(0)
#define Reverse_Key_Status() do { key_state = 1 - key_state; } while(0)
//KEY初始化函数
void KEY_Init(void);
//KEY扫描函数,返回按键状态(按下为1,释放为0)。
int KEY_Scan(void);
#endif
6、例如:在LED模块的LED.c文件中,可以编写以下代码:
#include "LED.h" void LED_Init(void)
{ //初始化LED控制引脚为输出模式 LED_PIN = LED_OFF; //将LED控制引脚初始化为关闭LED状态(低电平),LED状态变量默认为LED_OFF(0)状态。} void LED_Control(unsigned char state)
{ if (state == LED_ON) { OPEN_LED(); //打开LED } else { CLOSE_LED(); //关闭LED }
}
7、例如:在LED模块的LED.h文件中,可以编写以下代码:
#ifndef LED_H
#define LED_H
//IO口定义
#define LED_PIN P2_0 //LED控制引脚
//变量定义
unsigned char led_state = 0; //LED状态变量
//常量定义
#define LED_ON 1 //LED打开状态常量
#define LED_OFF 0 //LED关闭状态常量
//宏定义
#define OPEN_LED() do { LED_PIN = LED_ON; } while(0)
#define CLOSE_LED() do { LED_PIN = LED_OFF; } while(0)
//LED初始化函数
void LED_Init(void);
//LED控制函数
void LED_Control(unsigned char state);
#endif
三、如何编写构建脚本(例如:MakeFile)来指定编译和链接的规则
1、在工程文件夹下创建一个名为“MakeFile”的文件,该文件是构建脚本的入口。
2、在MakeFile文件中,定义需要编译的源文件和目标文件,以及编译规则和选项。
1 # MakeFile
2 # 定义目标文件名
3 TARGET = Name_Program
4 # 定义需要编译的源文件和头文件
5 SRC = Main.c ModulesCodesFiles/KEY/KEY.c ModulesCodesFiles/LED/LED.c
6 INC = ModulesCodesFiles/KEY/KEY.h ModulesCodesFiles/LED/LED.h
7 # 定义编译规则和选项
8 CC = gcc
9 CFLAGS = -Wall -I.
10 # 定义目标文件的编译规则
11 $(TARGET): $(SRC) $(INC)
12 $(CC) $(CFLAGS) $(SRC) -o $(TARGET)
13 # 定义清理规则,用于删除生成的目标文件和其他临时文件
14 clean:rm -f $(TARGET)
3、在MakeFile文件中,使用规则来指定如何编译源文件和链接目标文件。例如:在MakeFile文件中,可以使用以下规则来指定如何编译源文件。
1 $(TARGET): $(SRC) $(INC)
2 $(CC) $(CFLAGS) $(SRC) -o $(TARGET)
解释以上:这个规则表示将所有的源文件(包括Main.c、ModulesCodesFiles/KEY/KEY.c和ModulesCodesFiles/LED/LED.c)编译并链接成一个名为“Name_Program”的可执行文件。
4、在Makefile文件中,可以使用其他规则来定义其他构建任务,例如“clean”任务,用于删除生成的目标文件和其他临时文件。
5、最后,在命令行中运行“make”命令来执行MakeFile文件中的构建任务。例如,在命令行中输入以下命令来执行构建任务。
make
相关文章:
单片机模块化编程文件创建流程
一、在工程文件夹下创建一个新的文件夹,命名为“ModulesCodesFiles”,译为“模块化代码文件”,用于存放所有模块化代码文件。 二、在“ModulesCodesFiles”文件夹下为每个模块创建一个新的文件夹,命名为模块的名称,例…...
docker image
docker image 1. 由来 docker image是Docker容器管理工具中的一个命令,用于管理和操作Docker镜像。 2. 常见五种示例命令和说明 以下是docker image的常见示例命令及其说明: 示例一:列出所有镜像 docker image ls描述:使用d…...
力扣75——单调栈
总结leetcode75中的单调栈算法题解题思路。 上一篇:力扣75——区间集合 力扣75——单调栈 1 每日温度2 股票价格跨度1 - 2 解题总结 1 每日温度 题目: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer &…...
Webpack和Parcel详解
构建工具和打包器是在开发过程中帮助组织、优化和打包项目的工具。它们可以处理依赖管理、资源优化、代码转换等任务,从而使开发流程更高效。以下是关于构建工具和打包器的一些指导: **Webpack:** Webpack 是一个功能强大的模块打包器&#…...
linux系统服务学习(六)FTP服务学习
文章目录 FTP、NFS、SAMBA系统服务一、FTP服务概述1、FTP服务介绍2、FTP服务的客户端工具3、FTP的两种运行模式(了解)☆ 主动模式☆ 被动模式 4、搭建FTP服务(重要)5、FTP的配置文件详解(重要) 二、FTP任务…...
7.原 型
7.1原型 【例如】 另外- this指向: 构造函数和原型对象中的this都指向实例化的对象 7.2 constructor属性 每个原型对象里面都有个constructor属性( constructor构造函数) 作用:该属性指向该原型对象的构造函数 使用场景: 如果有多个对象的方法&#…...
【图像分类】理论篇(2)经典卷积神经网络 Lenet~Resenet
目录 1、卷积运算 2、经典卷积神经网络 2.1 Lenet 网络构架 代码实现 2.2 Alexnet 网络构架 代码实现 2.3 VGG VGG16网络构架 代码实现 2.4 ResNet ResNet50网络构架 代码实现 1、卷积运算 在二维卷积运算中,卷积窗口从输入张量的左上角开始ÿ…...
C++系列-内存模型
内存模型 内存模型四个区代码区全局区栈区堆区内存开辟和释放在堆区开辟数组 内存模型四个区 不同区域存放的数据生命周期是不同的,更为灵活。 代码区:存放函数体的二进制代码,操作系统管理。全局区:存放全局变量,常…...
[管理与领导-30]:IT基层管理者 - 人的管理 - 向上管理,管理好你的上司,职业发展事半功倍。什么样的上司不值得跟随?
目录 前言: 一、什么是向上管理 二、为什么要向上管理 三、如何进行向上管理 四、向上管理的注意事项 五、向上管理的忌讳 六、向上管理常犯的错 七、如何帮助上司解决他关心的问题 7.1 如何帮助上司解决他关心的问题 7.2 如何帮助上司降低压力 八、什么…...
Java进阶篇--迭代器模式
目录 同步迭代器(Synchronous Iterator): Iterator 接口 常用方法: 注意: 扩展小知识: 异步迭代器(Asynchronous Iterator): 常用的方法 注意: 总结:…...
【CAM】CAM(Class Activation Mapping)——可视化CNN的特征定位
文章目录 一、CAM(Class Activation Mapping)二、CAM技术实现2.1 网络修改2.2 微调2.2 特征提取 三、总结Reference 完整代码见Github :https://github.com/capsule2077/CAM-Visualization ,如果有用可以点个Star,谢谢! 一、CAM(C…...
Maven教程_编程入门自学教程_菜鸟教程-免费教程分享
教程简介 Maven 是一款基于 Java 平台的项目管理和整合工具,它将项目的开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需要做一些简单的配置,Maven 就可以自动完成项目的编译、测试、打包、发布以及部署等工作。Maven 是…...
Gof23设计模式之模板方法模式
1.定义 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 2.结构 模板方法(Template Method)模式包含以下主要角色: 抽象类࿰…...
springBoot 配置文件 spring.resources.add-mappings 参数的作用
在Spring Boot应用中,spring.resources.add-mappings参数用于控制是否将特定路径的资源文件添加到URL路径映射中。 默认情况下,该参数的值为true,即会自动将静态资源(例如CSS、JavaScript、图片等)的URL路径添加到Spr…...
《Java极简设计模式》第03章:工厂方法模式(FactoryMethod)
作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 源码地址:https://github.com/binghe001/java-simple-design-patterns/tree/master/j…...
C++11并发与多线程笔记(11) std::atomic续谈、std::async深入谈
C11并发与多线程笔记(11) std::atomic续谈、std::async深入谈 1、std::atomic续谈2、std::async深入理解2.1 std::async参数详述2.2 std::async和std::thread()区别:2.3 async不确定性问题的解决 1、std::atomic续谈 #include <iostream&…...
React快速入门
最近需要学到react,这里进行一个快速的入门,参考react官网 1.创建和嵌套组件 react的组件封装是个思想,我这里快速演示代码,自己本身也不太熟悉。 代码的路径是src底下的App.js function MyButton() {return (<button>I…...
windows权限维持—SSPHOOKDSRMSIDhistorySkeletonKey
windows权限维持—SSP&HOOK&DSRM&SIDhistory&SkeletonKey 1. 权限维持介绍1.1. 其他 2. 基于验证DLL加载—SPP2.1. 操作演示—临时生效2.1.1. 执行命令2.1.2. 切换用户 2.2. 操作演示—永久生效2.2.1. 上传文件2.2.2. 执行命令2.2.3. 重启生效 2.3. 总结 3. 基…...
CSS 两栏布局和三栏布局的实现
文章目录 一、两栏布局的实现1. floatmargin2. flaotBFC3. 定位margin4. flex 布局5. grid布局 二、三栏布局的实现1. float margin2. float BFC3. 定位 margin(或者定位BFC)4. flex布局5. 圣杯布局6. 双飞翼布局 一、两栏布局的实现 两栏布局其实就是左侧定宽,…...
消息中间件相关面试题
👏作者简介:大家好,我是爱发博客的嗯哼,爱好Java的小菜鸟 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 📝社区论坛:希望大家能加入社区共同进步…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
