05节-51单片机-模块化编程

1.两种编程方式的对比

传统方式编程:
所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路
模块化编程:
把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等

2.模块化程序结构

要将Delay延时函数进行模块化,我们需要建立一个.c文件和.h文件,分别用于存放函数原型和函数声明。
在这里插入图片描述
注意事项:
.c文件:函数、变量的定义
.h文件:可被外部调用的函数、变量的声明

任何自定义的变量、函数在调用前必须有定义或声明(同一个.c)
使用到的自定义函数的.c文件必须添加到工程参与编译
使用到的.h文件必须要放在编译器可寻找到的地方(工程文件夹根目录、安装目录、自定义)
.h文件的存放位置:
情况1:和工程文件不在同一目录,则需要如图中所示位置,进行配置.h文件的路径:
在这里插入图片描述
情况2:和工程文件在同一目录,使用即可,为了方便查看,可以添加显示到keil中,如不添加也无妨。
在这里插入图片描述
在这里插入图片描述
这样我们在该处可以看到创建好的.h文件了,并在可方便的打开进行编辑

3.C预编译

C语言的预编译以#开头,作用是在真正的编译开始之前,对代码做一些处理(预编译)
在这里插入图片描述此外还有#ifdef,#if,#else,#elif,#undef等

4.实战

将上一节中的数码管显示,进行模块化
首先,新建Delay.c文件
在这里插入图片描述
Delay.c

void Delay(int ms)	//@12.000MHz
{unsigned char data i, j;while(ms--){i = 2;j = 239;do{while (--j);} while (--i);
}
}

然后,使用同样的方式建立Delay.h文件,并将.h文件添加到该处,在这里插入图片描述
在这里插入图片描述
并编写如下代码:
Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__
unsigned char Delay(int ms);
#endif

同理处理Nixie函数,模块化为Nixie.c和Nixie.h
Nixie.c

#include <REGX52.H>  //该文件中需要用到P2,P0,所以需要包含void Nixie(unsigned char Location,unsigned char Number)
{unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77F,0x7C,0x39,0x5E,0x79,0x71,0x00};switch(Location){case 1:  P2_2=1;P2_3=1;P2_4=1;break;case 2:  P2_2=0;P2_3=1;P2_4=1;break;case 3:  P2_2=1;P2_3=0;P2_4=1;break;case 4:  P2_2=0;P2_3=0;P2_4=1;break;case 5:  P2_2=1;P2_3=1;P2_4=0;break;case 6:  P2_2=0;P2_3=1;P2_4=0;break;case 7:  P2_2=1;P2_3=0;P2_4=0;break;case 8:  P2_2=0;P2_3=0;P2_4=0;break;}P0=NixieTable[Number];
}

Nixie.h

#ifndef __NIXIE_H__
#define __NIXIE_H__
void Nixie(unsigned char Location,unsigned char Number);
#endif

main.c
其中< >的表示从keil安装目录寻找.h
" "则表示从当前目录寻找

使用<>:这种方式用于包含标准库文件或者编译器提供的头文件,编译器会在标准库路径或者编译器指定的路径下查找这些头文件。
例如:#include <REGX52.H>,REGX52.H应该是一个标准库或者编译器提供的头文件,编译器会在标准库路径或者编译器指定的路径下查找并包含该文件。
使用"":这种方式用于包含用户自定义的头文件或者当前目录下的头文件,编译器会首先在当前目录下查找这些头文件,如果找不到才会到标准库路径或者编译器指定的路径下查找。

#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"
void main()
{while(1){Nixie(1,1);Delay(1000); //Nixie(2,2);Delay(1000);Nixie(3,3);Delay(1000);Nixie(4,4);Delay(1000);Nixie(5,5);Delay(1000);Nixie(6,6);Delay(1000);Nixie(7,7);Delay(1000);Nixie(8,8);Delay(1000);}
}

补充:字体问题

在keil中编写代码,可能出现中文乱码等问题,因此需要改变编码格式:
通常采用的是UTF-8编码方式。
在这里插入图片描述

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

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

相关文章

无源光网络(PON)技术的革命:PON模块的全面解析

PON&#xff08;Passive Optical Network&#xff0c;无源光网络&#xff09;模块是一种高性能的光模块&#xff0c;用于PON系统中&#xff0c;符合ITU-T G.984.2标准和多源协议&#xff08;MSA&#xff09;。它通过不同的波长在OLT&#xff08;光线路终端&#xff09;和ONT&am…

超强开源项目!一款 5.6K star 的数据表格工具,灵活现代化【文末带源码】

今天给大家介绍一下 Grist 这个超级厉害的开源项目。 Grist 是一款现代化的数据表格工具&#xff0c;有着强大的功能和灵活的使用方式。 项目特色 这个项目把电子表格和数据库的优秀特点都结合起来&#xff0c;特色如下&#xff1a; 1. 可定制性&#xff1a; Grist 提供了非…

计算机网络 Cisco远程Telnet访问交换机和Console终端连接交换机

一、实验要求和内容 1、配置交换机进入特权模式密文密码为“abcd两位班内学号”&#xff0c;远程登陆密码为“123456” 2、验证PC0通过远程登陆到交换机上&#xff0c;看是否可以进去特权模式 二、实验步骤 1、将一台还没配置的新交换机&#xff0c;利用console线连接设备的…

SSL证书协议详解

SSL/TLS证书&#xff08;Secure Sockets Layer Certificate&#xff09;是一种由数字证书颁发机构&#xff08;CA&#xff09;签发的一种数字证书&#xff0c;用于确保网络通信的安全性和加密性。SSL证书用于验证服务器或网站的身份&#xff0c;并加密在客户端和服务器之间传输…

✌粤嵌—2024/3/29—赎金信✌

赎金信 代码实现&#xff1a; 哈希表 bool canConstruct(char *ransomNote, char *magazine) {int hash[26] {0};for (int i 0; i < strlen(ransomNote); i) {hash[ransomNote[i] - a];}for (int i 0; i < strlen(magazine); i) {if (hash[magazine[i] - a]) {hash[ma…

【网络设备巡检命令】--思科、华为、H3C、锐捷

【网络设备巡检命令】--思科、华为、H3C、锐捷 一、思科二、华为三、H3C四、锐捷 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 一、思科 1、查看系统信息&#xff1a; show version2、查看时间&#xff1a; show clock3、查看序列号&a…

在Vue项目使用kindEditor富文本编译器

第一步 npm install kindeditor第二步&#xff0c;建立kindeditor.vue组件 <template><div class"kindeditor"><textarea :id"id" name"content" v-model"outContent"></textarea></div> </templa…

cesium加载高层级离线影像地图瓦片(天地图、19级Arcgis)

实际加载效果如图&#xff1a; 1、下载离线地图瓦片方式&#xff08;多种任选其一&#xff0c;个人倾向于Qgis工具&#xff09;&#xff1a; 方式1、采用第三方下载工具如&#xff1a;91卫图、水经注、全能电子地图下载器、bigemap等等。&#xff08;这些有的下载层级不够&…

stable diffusion--小白学习步骤

1.看一下Unet网络的讲解_哔哩哔哩_bilibili&#xff0c;了解Unet网络 2.看一下【生成式AI】Diffusion Model 原理剖析 (1/4)_哔哩哔哩_bilibili&#xff0c;起码要看前3/6个视频 3.看一下超详细的扩散模型&#xff08;Diffusion Models&#xff09;原理代码 - 知乎 (zhihu.co…

SSH KEY 添加

mac&#xff1a; Add SSH KEY公钥 1、 先cd进.ssh文件夹&#xff0c;查看电脑中是否存在之前添加的公钥文件(id_rsa.pub、id_rsa)&#xff0c;要是存在&#xff0c;就先删除: jingchengxindeMacBook-Pro:~ jingchengxin$ cd .ssh jingchengxindeMacBook-Pro:.ssh jingchen…

Java switch使用

Java switch使用 涉及关键字&#xff1a; switch&#xff1a; 表达式 变量类型可以是&#xff1a; byte、short、int 或者 char。从 Java SE 7 开始&#xff0c;switch 支持字符串 String 类型&#xff0c; case&#xff1a; 分支语句&#xff0c;需要指定当前分支的常量或者字…

7.C++:多态

一、 virtual关键字 //1.可以修饰原函数&#xff0c;为了完成虚函数的重写&#xff0c;满足多态的条件之一&#xff1b; //2.可以在菱形继承中&#xff0c;完成虚继承&#xff0c;解决数据冗余和二义性&#xff1b; 两个地方使用同一关键字&#xff0c;但二者间没有一点关联 二…