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”,在这个函数里我们直接就不再往下分析程序了,带着这个返回值回到调用这个函数的地方接着往下分析。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)