51单片机之程序模块化

以动态数码管显示今天日期为例,使程序模块化。

原程序:

#include <REGX52.H>

//数码管段码表
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

//延时子函数
void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

//数码管显示子函数
void Nixie(unsigned char Location,Number)
{
	switch(Location)		//位码输出
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];	//段码输出
	Delay(1);				//显示一段时间
	P0=0x00;				//段码清0,消影
}

void main()
{
	while(1)
	{
		Nixie(1,6);	//在数码管的第1位置显示1
		Nixie(2,1);	//在数码管的第2位置显示2
		Nixie(3,0);	//在数码管的第3位置显示3
		Nixie(4,1);	//在数码管的第4位置显示4
		Nixie(5,2);	//在数码管的第5位置显示5
		Nixie(6,2);	//在数码管的第6位置显示6
        Nixie(7,0);	//在数码管的第5位置显示5
		Nixie(8,2);	//在数码管的第6位置显示6
    //显示今天时间2022年10月16日,20221016
	}
}

模块化,第一步,分析那些较好模块化,一般延时子函数,数码管数组写好后基本上就不会改动,我们只需要调用就可以了,这样的函数更容易模块化。反之,像按键,led灯,这些经常想要改动,他们的P接口啊,还有他们的功能,这样的就不容易模块化。

简单说就是,能模块化的东西,一般都是一些不包含在主函数里面的子函数,一般写好就不想要改动的,这样让他模块化然后来调用可以极大的缩减main文件的长度,让我们刚好的去阅读。

按上面程序来分析,延时函数基本上不用动只需要调用,可以模块化。

void Delay(unsigned int xms)   //延时子函数
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

数组也是不需要改动,位码那个子函数也是,只需要调用就可以的,也可以模块化。

unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//数码管段码表


void Nixie(unsigned char Location,Number)
{
	switch(Location)		//位码输出
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];	//段码输出
	Delay(1);				//显示一段时间
	P0=0x00;				//段码清0,消影
}

不能模块化的有,主函数,我们需要显示任意东西和更改显示的数值,都需要在主函数里面改动所以,主函数不容易模块化。

void main()
{
	while(1)
	{
	    Nixie(1,6);	//在数码管的第1位置显示1
		Nixie(2,1);	//在数码管的第2位置显示2
		Nixie(3,0);	//在数码管的第3位置显示3
		Nixie(4,1);	//在数码管的第4位置显示4
		Nixie(5,2);	//在数码管的第5位置显示5
		Nixie(6,2);	//在数码管的第6位置显示6
        Nixie(7,0);	//在数码管的第5位置显示5
		Nixie(8,2);	//在数码管的第6位置显示6
	}
}

分析好后,开始模块化,第二步,创建模块化文件:

1.像添加main文件一样,右击Source Group 1  ,然后点击第二个Add

 2.点击.C文件创建,以延时函数为例,文件名为Delay.c,再创建 .H文件,文件名为Delay.h

3. 创建好后,点C文件他会自动添加到工程目录里面来,但点h文件需要自己右击Source Group 1 

像添加main文件一样添加进来。

 4.然后你发现没看见点h文件,你只需要在3的地方,点击文件类型找到.h为后缀的格式就可以看见.h文件了然后添加。

 最后是这个样子:

 文件创建好后就开始分模块化了。

这里模块化需要用到预处理指令

#ifndef __xxxx_H__
#define __xxxx_H__

子函数第一行  ;   //记得这个分号,很重要不要忘记写了。

#endif

然后开始来分

1.Delay.c文件

void Delay(unsigned int xms)   //延时子函数
//注意这里是不是写的Delay,到时候添加头文件也要写#include"Delay.h"不要写成#include"DELAY.H"
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

2.Delay.h文件

#ifndef __DELAY_H__     //至于这些不想懂也可以反正这个格式
#define __DELAY_H__     //想要理解也容易但打字难解释,就跟if()一样,就是一个套指令。

void Delay(unsigned int xms);  
/*
这个是Delay.c文件的第一行,加分号这样就是相当于我们的reg52.h一样,把Delay.c文件包含在Delay.h里面,我们需要用的时候就像#include<regx52.h>一样,只需要添加头文件就可以调用他里面的函数。
这样我们只需要在主函数main里面添加#include"Delay.h"就可以直接使用Delay(10);延时了。
*/

#endif     //记得加这个,这个是一起的,结尾

3.Nixie.c文件:

#include<regx52.h>    //因为我们下面用了P2_4这些所以用添加头文件不然提示没定义
#include"Delay.h"     //同理我们下面用来Delay延时函数所以要加延时函数头文件。

/*
符号""这样有利于更快的搜索到这个头文件,这是在该文件里面搜索,后面可能会提示有个警告,就需要去
点击界面-----Project----options fro File------C51----includepaths---然后在这里面输入你把头文件存储在那个文件夹里面把文件夹的路径复制到里面去就可以,当然你头文件名写对了好像不提示,我之前提示是因为我DELAY大写改Delay.h就可以,因为我们Delay.c文件的定义的子函数名字就是Delay不是DELAY。所以可能这样就找不到文件就提示警告。
*/

unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//数码管段码表


void Nixie(unsigned char Location,Number)
{
	switch(Location)		//位码输出
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];	//段码输出
	Delay(1);				//显示一段时间
	P0=0x00;				//段码清0,消影
}

4.Nixie.h文件:

#ifndef __NIXIE_H__   //就不解释了和前面Delay.h文件里面写的一样的意思。
#define __NIXIE_H__

void Nixie(unsigned char Location,Number);
//注意这里是不是写的Nixie,到时候添加头文件也要写#include"Nixie.h"不要写成#include"NIXIE.H"

#endif

然后最后一步,就是我们的main文件:

#include <regx52.h>
#include "Delay.h"   //之前那么长的代码,现在只需要添加他们的头文件就可以调用
#include "Nixie.h"   

/*
其实意思和#include<regx52.h>一样,你们打开regx52.h他其实也是一个模块化程序,然后我们需要用到的时候就添加头文件,就可以用他里面定义好的函数,只不过他是自带的不用我们自己去添加模块化*/

void main()
{
	while(1)
	{
	    Nixie(1,6);	//在数码管的第1位置显示1
		Nixie(2,1);	//在数码管的第2位置显示2
		Nixie(3,0);	//在数码管的第3位置显示3
		Nixie(4,1);	//在数码管的第4位置显示4
		Nixie(5,2);	//在数码管的第5位置显示5
		Nixie(6,2);	//在数码管的第6位置显示6
        Nixie(7,0);	//在数码管的第5位置显示5
		Nixie(8,2);	//在数码管的第6位置显示6 //显示20221016今天日期
	}
}

/*这样看代码是不是清晰多了,如果一个程序几百行,你要改这几个东西,那不是要滚轮冒烟,这样搞模块化,方便我们读写。*/

结果显示:2022年10月16日--20221016

 

  • 6
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值