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”,在这个函数里我们直接就不再往下分析程序了,带着这个返回值回到调用这个函数的地方接着往下分析。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程