不得不说,隔了这么长时间没有去学习自己感觉都快废掉了,业精于勤而荒于怠
三天前卡在了函数调用的问题,由于熬夜导致思路全乱了,就不知道该如何去把每个
函数分配好。不过现在作为小白的我今天算是搞定了这个问题--可以在子函数中声明
其他子函数中。
声明其他子函数(.h)文件,就可以调用了。
因为我总记得在C语言中子函数不能调用子函数,而且只能有一个主函数。
或许是理解错在子函数中不敢去声明,用了嵌套不行,听同学说使用指针和Return
突然感觉还是算了。
还好皇天不负有心人,我在浏览其他长代码的时候发现可以调用,就ok了。
/**********************************************************
@功能模块:工程函数
@作 者:朱明
@时 间:2020年1月29日
***********************************************************/
#include "test.h"
#include "mode.h" //如何在子函数中调用子函数--**问题所在**
void test(unsigned char dat, unsigned pos) //单片机使用核心工程文件
{
mode(6); //数码管的位置
P0 = 0x01 << pos;
mode(7); //数码管的内容
P0 = dat;
//此处解决定义但没有使用的问题,在的函数原型中,
//调用这个函数时有两个参数dat,pos,
//可是在你在写函数体和实际调用时,啥参数都没给,所以编译器傻眼了.
}
其中还要一个要提以下就是,我声明的函数有两个变量,使用的工程需要都用到,防止警告。
被调用的另外一个子函数。
/*********************************************************
@功能模块:模式函数
@作 者:朱明
@时 间:2020年1月29日
*********************************************************/
#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;
}
}
主函数
总体需要讲解的都包含在函数块中间,在代码中理解。
/*********************************************************************
@功能模块:主函数
@作 者:朱明
@时 间:2020年1月29日-完成于2月3日
*********************************************************************/
#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);
}
*/
}
}