1.为什么创建模块化编程?
当代码非常简单的时候,我们一般直接把所有的代码都写在main.c里面。
当代码的功能比较多的时候,如果全部写在main.c,会比较混乱,修改起来也比较麻烦。
而创建模块化编程,可以把相同的功能进行分类整理,使其更加简洁明了。
2.怎么创建模块化编程?
底下我是以4位数码管为例进行讲解:
首先我们需要打开程序所在的文件位置,然后双击进入src文件夹
进入后,右键空白处新建两份文件夹,重命名为所需相应的名称,
以4位数码管为例,我在这里分别命名为delay和SMG。
双击delay文件夹进入文件夹后新建 两个文本文档,命名为delay.c和delay.h。
双击SMG文件夹进入文件夹后新建 两个文本文档,命名为SMG.c和SMG.h。
是将文本文档的后缀txt改为.c和.h
若是电脑不显示后缀名,则点击【查看】,鼠标移动到【显示】然后点击选择【文件扩展名】,即可使电脑显示文件的后缀名。
打开程序,双击Source Group 1,在弹出页面上选择src文件夹。
点击进入src文件夹后,
双击delay文件夹,进入后再点击delay.c 以添加。 双击SMG文件夹,进入后再点击SMG.c 添加。然后点击add,即可在程序中添加delay.c和SMG.c两个主函数。
双击打开delay.c,进入后,输入#include "delay.h"(引用头函数)。
鼠标移动到delay.h上,右键打开delay.h,
进入delay.h后,
输入#ifndef _DELAY_H
#define _DELAY_H
#endif
双击SMG.c,进入后,输入#include "SMG.h"(引用头函数)。
鼠标移动到SMG.h上,右键打开SMG.h,
进入SMG.h后,
输入#ifndef _SMG_H
#define _SMG_H
#endif
在C51中代入
代入delay文件夹
代入SMG文件夹
最终ok完成
模块化编程完成!
后续则是将main.c里的相关函数相对应放入delay.c或SMG.c里,然后在相应的头文件中引用主函数中的函数名称,再然后就是在main.c中引用相应头文件即可。
【以下是示例代码】:
以下是main.c的函数
#include "regx52.h"
#include "intrins.h"
#include "SMG.h"
#include "delay.h"
void main()
{
while(1)
{
Show_Num(20220055);
}
}
以下是delay.c的函数
#include "delay.h"
#include "intrins.h"
//延时函数
void Delay1_ms(unsigned int a) //@11.0592MHz
{
unsigned char i, j;
for(a;a>0;a--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
以下是delay.h的函数
#ifndef _DELAY_H
#define _DELAY_H
void Delay1_ms(unsigned int a);
#endif
以下是SMG.c的函数
#include "SMG.h"
#include "regx52.h"
#include "delay.h"
unsigned char meg_code[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
sbit HC_A0 = P2^2;
sbit HC_A1 = P2^3;
sbit HC_A2 = P2^4;
void SMG_Select(unsigned char n)
{
switch(n)
{
case 1:
HC_A0 = 0;
HC_A1 = 0;
HC_A2 = 0;
break;
case 2:
HC_A0 = 1;
HC_A1 = 0;
HC_A2 = 0;
break;
case 3:
HC_A0 = 0;
HC_A1 = 1;
HC_A2 = 0;
break;
case 4:
HC_A0 = 1;
HC_A1 = 1;
HC_A2 = 0;
break;
case 5:
HC_A0 = 0;
HC_A1 = 0;
HC_A2 = 1;
break;
case 6:
HC_A0 = 1;
HC_A1 = 0;
HC_A2 = 1;
break;
case 7:
HC_A0 = 0;
HC_A1 = 1;
HC_A2 = 1;
break;
case 8:
HC_A0 = 1;
HC_A1 = 1;
HC_A2 = 1;
break;
}
}
//12345
//在数码管上显示传入的数字
void Show_Num(long num)
{
//方法1:逐位显示
// char sn = 0;
// SMG_Select(1); //选择LED1
// sn = num%10; //12345%10 = 5
// P0 = meg_code[sn];
// Delay1_ms(3);
// num = num/10; //12345/10 = 1234
//
// SMG_Select(2);
// sn = num%10; //1234%10 = 4
// P0 = meg_code[sn];
// Delay1_ms(3);
// num = num/10; // 1234/10 = 123
//
// SMG_Select(3);
// sn = num%10; //123%10 = 3
// P0 = meg_code[sn];
// Delay1_ms(3);
// num = num/10; // 123/10 = 12
//
// SMG_Select(4);
// sn = num%10;
// P0 = meg_code[sn]; //12%10 = 2
// Delay1_ms(3);
// num = num/10; // 123/10 = 1
//
// SMG_Select(5);
// sn = num%10;
// P0 = meg_code[sn]; //1%10 = 1
// Delay1_ms(3);
// num = num/10; // 1/10 = 0
//方法2:使用for循环
char i =0;
for(i=1;i<=8;i++) //8个LED灯循环8次
{
SMG_Select(i); //选中第i个LED
P0 = meg_code[num%10]; //取出传入参数的个位数的值
Delay1_ms(1);
P0 = 0x00; //关掉数码管
num = num/10; //取完个位数之后除以10,去掉当前个位数
if(num<=0) //判断传入参数是否取完
break; //如果取完则退出循环
}
}
以下是SMG.h的函数
#ifndef _SMG_H_
#define _SMG_H_
void Show_Num(long num);
#endif
以上则是以4位数码管为例的模块化编程!