前言,
在预备知识里我已经讲了STC89C52矩阵键盘控制数码管,现在以这个代码为例,让我们了解什么是模块化编程。
1,模块化编程的好处?
模块化编程有以下几个好处:
-
代码重用性:模块化编程可以将代码分解为独立的模块,每个模块负责完成特定的功能。这样可以提高代码的重用性,减少重复编写相似功能的代码。
-
可维护性:模块化编程使得代码更易于维护。由于每个模块都是独立的,当需要修改某个功能时,只需要修改对应的模块,而不需要修改整个代码。这样可以降低维护的成本,并且减少引入新 bug 的风险。
-
可测试性:模块化编程使得代码更易于测试。由于每个模块都是独立的,可以针对每个模块编写相应的测试用例,以确保其功能的正确性。这样可以提高代码的质量和稳定性。
-
提高开发效率:模块化编程可以将复杂的问题分解为多个简单的模块,每个模块只需关注自己的功能实现,降低了开发的复杂度。同时,多个开发人员可以并行开发不同的模块,提高了开发效率。
总的来说,模块化编程可以提高代码的重用性、可维护性、可测试性,同时提高开发效率。这些好处使得模块化编程成为现代软件开发中的重要实践。
2,开始学习模块化编程(以上期代码为例)
#include <REGX52.H>
//数码管段码表 0 1 2 3 4 5 6 7 8 9
unsigned char NixieTable[]={0x40,0x79,0x24,0x30,0x19,0x12,0x2,0x78,0x0,0x10};
//延时函数
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
//矩阵键盘扫描
unsigned char MatrixKey()
{
unsigned char KeyNumber=0;
P1=0xFF;
P1_3=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
P1=0xFF;
P1_2=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
P1=0xFF;
P1_1=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
P1=0xFF;
P1_0=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
return KeyNumber;
}
//定位键码数
unsigned char KeyNum;
void main()
{
while(1)
{
KeyNum=MatrixKey(); //获取矩阵键盘键码
if(KeyNum) //如果有按键按下
{
P3=NixieTable[KeyNum-1]; //数码管显示
}
}
}
以上就是上期的代码,我们知道上期的代码都写再了一个main.c文件里,那么我们怎么把这些代码模块化呢?
代码中有两个函数一个延时函数,一个矩阵键盘扫描函数。那我们可不可以把这些函数存放在别的文件里。
当然可以!!!!
我们可以根据函数的功能不同,来进行不同的存放。
那我们就开始吧!
首先存放延时函数
我们可以新添加一个delay.c文件
添加好后我们就把延时函数移动到这里。
移动到这里后,如果在main.c中我们需要用到这个函数,那么我们怎么使用呢?
3,使用delay函数
首先,我们在建立一个delay.h文件作为一个接口,
添加好后,我们打开它在里面写入代码
#ifndef _DELAY_H_
#define _DELAY_H_
void Delay(unsigned int xms);
#endif
这段代码是一个延时函数的头文件,其中定义了一个延时函数 Delay。
#ifndef _DELAY_H_
和 #define _DELAY_H_
是头文件的保护宏,用于防止重复包含同一个头文件。当某个源文件第一次包含该头文件时,_DELAY_H_
会被定义,后续再次包含该头文件时,由于已经定义了 _DELAY_H_
,条件判断为假,就不再重复包含头文件。
void Delay(unsigned int xms);
是函数声明,表示延时函数 Delay 接受一个参数 xms,该参数是一个无符号整数。函数声明只是告诉编译器这个函数的存在,函数的具体实现会在其他源文件中定义。
最后的 #endif
表示条件编译的结束。如果前面的保护宏条件为真,则该行和 #ifndef
对应的行之间的代码会被编译,否则会被跳过。这样可以确保头文件的内容只被编译一次,避免重复定义和编译错误。
这个可以说是一种格式,我们要创造接口就带入这个格式就行。
写完这些后,我们在main.c文件要想使用这个函数,我们只需要引用这函数的.h文件就行。
在main.c中添加代码
#include <DELAY.H>
编译,这样我们就把延时函数模块化了。
接下来我们把矩阵键盘扫描函数模块化。(大家自己动动手)
1,创建.c文件(移植函数)
2,创建.h文件(编写代码)
3,在主函数中引用
好了,大家根据步骤试试吧!
4,开始仿真
我们模块化后,就可以编译一下,仿真看和未模块化后有没有什么不同。
矩阵按键,数码管
并没有什么不同。
好了,模块化编程就是把不同功能的代码分类,当我们要使用哪个功能时,我们就直接拿出来用就行。
5,思考
5.1 为什么要模块化编程。
5.2 .h文件在C语言中是什么作用?
5.3 在模块化第二个函数时可能会遇到一些问题,提示:.c类型的文件本质没有任何区别,只是名字变了。
--------------------------------我是一条分割线----------------------------------------------------------------------------
作者水平有限,如有错误,欢迎指正。