1.5 STC89C52矩阵键盘控制数码管+模块化编程(proteus仿真)

前言,

预备知识

在预备知识里我已经讲了STC89C52矩阵键盘控制数码管,现在以这个代码为例,让我们了解什么是模块化编程。

1,模块化编程的好处?

模块化编程有以下几个好处:

  1. 代码重用性:模块化编程可以将代码分解为独立的模块,每个模块负责完成特定的功能。这样可以提高代码的重用性,减少重复编写相似功能的代码。

  2. 可维护性:模块化编程使得代码更易于维护。由于每个模块都是独立的,当需要修改某个功能时,只需要修改对应的模块,而不需要修改整个代码。这样可以降低维护的成本,并且减少引入新 bug 的风险。

  3. 可测试性:模块化编程使得代码更易于测试。由于每个模块都是独立的,可以针对每个模块编写相应的测试用例,以确保其功能的正确性。这样可以提高代码的质量和稳定性。

  4. 提高开发效率:模块化编程可以将复杂的问题分解为多个简单的模块,每个模块只需关注自己的功能实现,降低了开发的复杂度。同时,多个开发人员可以并行开发不同的模块,提高了开发效率。

总的来说,模块化编程可以提高代码的重用性、可维护性、可测试性,同时提高开发效率。这些好处使得模块化编程成为现代软件开发中的重要实践。

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类型的文件本质没有任何区别,只是名字变了。

--------------------------------我是一条分割线----------------------------------------------------------------------------

作者水平有限,如有错误,欢迎指正。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盛一碗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值