带返回值的函数

点击打开在线编译器,边学边练

1.返回值

之前我们封装的函数都是void类型无返回值的函数。随着学习的深入,我们需要把C语言的精髓学到家。

前面几讲在“function.c”中没有提及过按键的函数封装,大家也知道我们在第五章用到的按键功能函数都需要定义全局变量,这种过多的使用全局变量是编程的大忌。随着我们使用按键越来越灵活,就不是简单的让一两个变量加加减减而已了,所以现在我们要更加的去贴合嵌入式编程的方式,那么按键的使用如果用函数封装的话,需要用到函数返回值的相关知识。

 

2.举例

首先我们定义一个不带参数且返回值为unsigned char型的函数,函数名为“KEY4_Scan()”,里面的内容跟以前的不支持连按函数都差不多,只是我们把执行功能代码部分改为“return  1”。

当按键按下抬起时我们函数的返回值为1,其他情况返回值为0,这样死循环里不断更新key的值,而大多数时候没有按键动作,所以死循环里的key的值都是0,有按键动作了,key等于1就执行功能代码,下一个循环没有按键动作了key又等于0就不执行功能代码了。

#include <reg52.h> 
#include <function.h>
#define TIMES 1000 //死循环里的代码量少,所以把阈值调大点
sbit KEY4 = P2^7;

u8 KEY4_Scan()
{
    static u8 key_up=1;
    static u16 times;
    if(key_up==0)
    {      
        times++;   
        if(times>=TIMES&&KEY4==1)
        {
            times=0;
            return 1;
        } 
    }
    key_up=KEY4;
    return 0;
}

void main()
{  
    u8 key;     //用来读取按键动作的返回值
    LED_Init(); //初始化LED硬件模块
    P2=0xF7;    //让K4能具备有被拉低的条件先
    while(1)
    {      
        key=KEY4_Scan();
        if(key==1)LED2=!LED2;   
    }
}

 

3.分析

如果大家没有接触过这些知识,我们简单讲解原理:在while(1)循环里首先看到的是“key=KEY4_Scan();”,也就是说这条语句是要执行“KEY4_Scan()”的内容的,然后我们转往“KEY4_Scan()”查看函数的内容是什么,分析得出

没有按键按下时,函数的内容相当于只执行下面的代码

u8 KEY4_Scan()
{
    key_up=KEY4;
    return 0;
}

所以回到主函数的循环中就是“key=0;”,LED2的程序就没有去执行。

有按键按下并且抬起时,返回值为1,即主函数里“key=1;”,那就可以执行LED2的程序了。又因为每次执行死循环都会把key的值更新一遍,所以“key=1;”的情况只有按键动作时才会出现。

大家分析带返回值的函数时,记住一旦程序随着外部硬件的影响而执行到“return”时,后面的程序就不会去执行了,所以我们一般在这些函数的分析过程里遇到“return”,在这个函数里我们直接就不再往下分析程序了,带着这个返回值回到调用这个函数的地方接着往下分析。


本文固定URL:https://www.dotcpp.com/course/362

第一章 单片机入门
第二章 LED
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)