蓝桥杯之单片机设计与开发(4)——数码管之单片机设计与开发(单管循环整体循环)

不得不说,隔了这么长时间没有去学习自己感觉都快废掉了,业精于勤而荒于怠

  三天前卡在了函数调用的问题,由于熬夜导致思路全乱了,就不知道该如何去把每个
  函数分配好。不过现在作为小白的我今天算是搞定了这个问题--可以在子函数中声明
其他子函数中。
  声明其他子函数(.h)文件,就可以调用了。
  因为我总记得在C语言中子函数不能调用子函数,而且只能有一个主函数。
  或许是理解错在子函数中不敢去声明,用了嵌套不行,听同学说使用指针和Return
突然感觉还是算了。
  还好皇天不负有心人,我在浏览其他长代码的时候发现可以调用,就ok了。
/**********************************************************
@功能模块:工程函数
@作    者:朱明
@时    间:2020129***********************************************************/

#include "test.h"
#include "mode.h"              //如何在子函数中调用子函数--**问题所在**

void test(unsigned char dat, unsigned pos)  //单片机使用核心工程文件
{
	
	mode(6);			//数码管的位置
	P0 = 0x01 << pos;
	mode(7);			//数码管的内容
	P0 = dat;
	//此处解决定义但没有使用的问题,在的函数原型中,
	//调用这个函数时有两个参数dat,pos//可是在你在写函数体和实际调用时,啥参数都没给,所以编译器傻眼了.
}

其中还要一个要提以下就是,我声明的函数有两个变量,使用的工程需要都用到,防止警告。
被调用的另外一个子函数。

/*********************************************************
@功能模块:模式函数
@作    者:朱明
@时    间:2020129*********************************************************/


#include "mode.h"

void mode(unsigned char n)  //单片机使用前清零以及模式选择
{
/*	//关闭外设
	P0 = 0xFF;
	P2 = (P2 & 0x1F) | 0x80;  //P2^7~P2^5清零,再定位Y4C(LED)
	//结果P2 = 1000 0000
	P2 &= 0x1F;               //P2^7~P2^5清零

	P0 = 0;
	P2 = (P2 & 0x1F) | 0xA0;  //P2^7~P2^5清零,再定位Y5C(蜂鸣器/继电器等)
	//结果P2 = 1000 0000
	P2 &= 0x1F;               //P2^7~P2^5清零
*/	
	switch(n)                 //选择所需的工程
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
	}
}

主函数
总体需要讲解的都包含在函数块中间,在代码中理解。

/*********************************************************************
@功能模块:主函数
@作    者:朱明
@时    间:2020129-完成于23*********************************************************************/

#include <reg52.h>
#include "mode.h"
#include "delay.h"
#include "test.h"

/*******************************************************************
说明:"",<>,两种引用方式的区别:
			<>是指从当前安装目录处引用,如果找不到则报错。
			“”,是先从当前工程文件夹寻找如果找不到则到安装目录中去找,
			找不到则报错。
********************************************************************/

/*******************************************************************
注意:
(1)
#ifndef后面加什么都都可以,用文件名只是为了好区分。
它只是用来定义一个预处理器变量。
(2)
对于#ifndef……#define……#endif;这个结构的意思就是说如果没有定义
(宏定义)一个字符串,那么我们就定义它,
然后执行后面的语句,如果定义过了那么就跳过不执行任何语句。
(3)
因为这个头文件会在多个函数中被调用,因此这是为了防止重复声明,
保证delay.h在给定的源文件中只处理一次。
(4)
如果不加这两句话编译时会报大量的重复定义错误
**********************************************************************/

unsigned char code SMG_duanma[18]=
		{	/*0*/ 0xc0 ,/*1*/ 0xf9 ,/*2*/ 0xa4 ,
			/*3*/ 0xb0 ,/*4*/ 0x99 ,/*5*/ 0x92 ,
			/*6*/ 0x82 ,/*7*/ 0xf8 ,/*8*/ 0x80 ,
			/*9*/ 0x90 ,/*a*/ 0x88 ,/*b*/ 0x80 ,
			/*c*/ 0xc6 ,/*d*/ 0xc0 ,/*e*/ 0x86 ,
			/*f*/ 0x8e ,/*g*/ 0xbf ,/*h*/ 0x7f };

void main()
			{	
					while(1)          //单个数码管循环
					{
					unsigned char i,j;
						for(i = 0; i < 8; i++)
						{
							for(j = 0; j < 10; j++)
							{
								test(SMG_duanma[j],i);
								delay(10000);
								delay(10000);
							}
						}
						
	/*					for(j = 0; j < 9; j++)     //所有数码管一起循环
						{
							mode(6);			//数码管的位置
							P0 = 0xff;
							delay(10000);
							delay(10000);
							mode(7);			//数码管的内容
							P0 = SMG_duanma[j];
							delay(10000);
							delay(10000);
						}
	*/
						}
		
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

弱冠而立

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

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

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

打赏作者

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

抵扣说明:

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

余额充值