单片机模块化编程文件创建流程

一、在工程文件夹下创建一个新的文件夹,命名为“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

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

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

相关文章

Gin+微服务实现抖音视频上传到七牛云

文章目录 安装获取凭证Gin处理微服务处理 如果你对Gin和微服务有一定了解&#xff0c;看本文较容易。 安装 执行命令&#xff1a; go get github.com/qiniu/go-sdk/v7获取凭证 Go SDK 的所有的功能&#xff0c;都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的A…

【stylus】通过css简化搜索页面样式

发现stylus专门修改样式的插件后&#xff0c;发现之前写JS调整样式的方式是在太蠢了&#xff0c;不过有一些交互的东西还是得用JS&#xff0c;例如设置按钮来交互显示功能&#xff0c;或记录功能等。插件可以让简化网站变得简单&#xff0c;而且可以实时显示&#xff0c;真的不…

rn和flutter出现“Running Gradle task ‘assembleDebug

在第一次运行rn和flutter时&#xff0c;会卡在Running Gradle task assembleDebug&#xff0c;可以使用阿里的镜像&#xff0c;如下图&#xff1a; maven { url https://maven.aliyun.com/repository/google/ } google() maven { url https://maven.aliyun.com/repository/jcen…

C++简介

文章目录 C简介C版本C11例子 C14例子 C17C20例子 C简介 C是一种高级编程语言&#xff0c;它是对C语言的扩展和增强。C由Bjarne Stroustrup于1980年发明&#xff0c;主要用于系统级编程、游戏开发、嵌入式系统等领域。 C具有许多特性&#xff0c;其中最重要的是面向对象编程&a…

The Go Blog 01:反射的法则(译文)

反思的法则 罗伯-派克 2011 年 9 月 6 日 引言 计算机中的反射是指程序检查自身结构的能力&#xff0c;尤其是通过类型检查自身结构的能力&#xff1b;它是元编程的一种形式。它也是造成混乱的一个重要原因。 在本文中&#xff0c;我们试图通过解释 Go 中的反射是如何工作的…

计算机网络----CRC冗余码的运算

目录 1. 冗余码的介绍及原理2. CRC检验编码的例子3. 小练习 1. 冗余码的介绍及原理 冗余码是用于在数据链路层的通信链路和传输数据过程中可能会出错的一种检错编码方法&#xff08;检错码&#xff09;。原理&#xff1a;发送发把数据划分为组&#xff0c;设每组K个比特&#…

详解strcmp函数

strcmp函数是用来比较两个字符串的&#xff0c;按理来说&#xff0c;比较结果只有两种&#xff1a;相同或不同。但是&#xff0c;事实上&#xff0c;strcmp函数在设计时会有三种情况&#xff0c;下面详细介绍&#xff1a; 这个函数的输入为两个字符串的首元素地址&#xff08;即…

MySQL 8.0.31 登录提示caching_sha2_password问题解决方法

MySQL 8.0.31 登录提示caching_sha2_password问题解决方法 MySQL 8.0.31 使用了 caching_sha2_password 作为默认的身份验证插件&#xff0c;这可能导致一些旧的客户端和库无法连接到服务器。以下是一些解决此类问题的常见步骤和建议&#xff1a; 确保MySQL服务正在运行&#…

C++11并发与多线程笔记(13) 补充知识、线程池浅谈、数量谈、总结

C11并发与多线程笔记&#xff08;13&#xff09; 补充知识、线程池浅谈、数量谈、总结 1、补充一些知识点1.1 虚假唤醒&#xff1a;1.2 atomic 2、浅谈线程池&#xff1a;3、线程创建数量谈&#xff1a; 1、补充一些知识点 1.1 虚假唤醒&#xff1a; notify_one或者notify_al…

Excel/PowerPoint折线图从Y轴开始(两侧不留空隙)

默认Excel/PowerPoint折线图是这个样子的&#xff1a; 左右两侧都留了大块空白&#xff0c;很难看 解决方案 点击横坐标&#xff0c;双击&#xff0c;然后按下图顺序点击 效果

Docker运行Nacos容器,过一会就报错`UnsatisfiedDependencyException`

Docker运行Nacos容器&#xff0c;过一会就报错UnsatisfiedDependencyException 问题背景&#xff1a; 最近要上线一个项目&#xff0c;由于要使用Nacos作为服务注册中心&#xff0c;为了方便&#xff0c;我就打算直接使用Docker部署Nacos&#xff0c;没想到Nacos启动没一会就嗝…

STM32 F103C8T6学习笔记10:OLED显示屏GIF动图取模—简易时钟—动图手表的制作~

今日尝试做一款有动图的OLED实时时钟&#xff0c;本文需要现学一个OLED的GIF动图取模 其余需要的知识点有不会的可以去我 STM32 F103C8T6学习笔记 系列专栏自己查阅把&#xff0c;闲话不多&#xff0c;直接开肝~~~ 文章提供源码&#xff0c;测试工程下载&#xff0c;测试效…

(二)结构型模式:5、装饰器模式(Decorator Pattern)(C++实例)

目录 1、装饰器模式&#xff08;Decorator Pattern&#xff09;含义 2、装饰器模式的UML图学习 3、装饰器模式的应用场景 4、装饰器模式的优缺点 5、C实现装饰器模式的简单实例 1、装饰器模式&#xff08;Decorator Pattern&#xff09;含义 装饰模式&#xff08;Decorato…

负载均衡下的 WebShell 连接

目录 负载均衡简介负载均衡的分类网络通信分类 负载均衡下的 WebShell 连接场景描述难点介绍解决方法**Plan A** **关掉其中一台机器**&#xff08;作死&#xff09;**Plan B** **执行前先判断要不要执行****Plan C** 在Web 层做一次 HTTP 流量转发 &#xff08;重点&#xff0…

HummingBird 基于 Go 开源超轻量级 IoT 物联网平台

蜂鸟&#xff08;HummingBird&#xff09; 是 Go 语言实现的超轻量级物联网开发平台&#xff0c;包含设备接入、产品管理、物模型、告警中心、规则引擎等丰富功能模块。系统采用GoLang编写&#xff0c;占用内存极低&#xff0c; 单物理机可实现百设备的连接。 在数据存储上&…

MATLAB | 七夕节用MATLAB画个玫瑰花束叭

Hey又是一年七夕节要到了&#xff0c;每年一次直男审美MATLAB绘图大赛开始hiahiahia&#xff0c;真的这些代码越写越不知道咋写&#xff0c;又不想每年把之前的代码翻出来再发一遍&#xff0c;于是今年又对我之前写的老代码进行了点优化组合&#xff0c;整了个花球变花束&#…

人工智能大模型加速数据库存储模型发展 行列混合存储下的破局

数据存储模型 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程toadb开源库 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 概述 在数据库的发展过程中&#xff0c;关…

MySQL5.7数据目录结构

以CentOS7为例&#xff0c;数据目录为/var/lib/mysql/&#xff0c;其内容如下&#xff1a; [rootscentos szc]# ll /var/lib/mysql/ total 122952 -rw-r----- 1 mysql mysql 56 Jan 15 16:02 auto.cnf -rw------- 1 mysql mysql 1680 Jan 15 16:02 ca-key.pem -rw-r…

系统架构设计专业技能 · 软件工程之需求工程

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

深入浅出Pytorch函数——torch.nn.Module.apply

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.Module 递归地将函数fn应用于每个子模块及self&#xff0c;子模块由.children()返回。典型的用法包括初始化模型的参数&#xff08;可以参考torc.nn.init&#xff0…