对上一讲的知识我们再补充一下支持连按的代码以此加深理解。
实验现象就是按着按键不放,那么“key=1;”出现的频率就会比不支持连按代码的时候多,所以就会有左右不断流水的现象,按键的功能代码大家自己去分析了。
#include <reg52.h> #include <function.h> #define TIMES 2000 //让流速慢一点 sbit KEY4 = P2^7; u8 KEY4_Scan() { static u8 key_up=1; static u16 times; if(key_up==0) { times++; if(times>=TIMES) { times=0; return 1; } } key_up=KEY4; return 0; } void main() { u8 key; //用来读取按键动作的返回值 u8 i=0,dir; //dir是作为切换流水方向 LED_Init(); //初始化LED硬件模块 P2=0xF7; //让K4能具备有被拉低的条件先 P0=0xFE; //先点亮LED2 while(1) { key=KEY4_Scan(); if(key==1)//执行功能代码 { i++; if(i>=15)i=1;//让i一直在1~14之间变化 if(i<8)dir=0;//向左移 if(dir==0)P0=~(0x01<<i); if(i>=8)dir=1;//向右移 if(dir==1)P0=~( 0x80>>(i-7) );//当i大于等于8之后,(i-7)其实也还是在1~7之间变化 } } }
之前我们讲解了很多按键处理功能的代码,一步步地深入了解了硬件与软件的结合,然而我们举例过的这些按键例程都不算完美,我们参考了正点原子团队开发的按键代码,发现他们执行的效率更高。又因为初学者还没有足够能力去理解人家团队书写的代码,所以笔者才一步步地讲解前面的代码来为此次的最终按键程序打下基础。
考虑到我们最常用的按键是K4,K8,K12,K16
所以只有P2.7输出低电平之后,对应的4个按键的IO端口才有被拉低的条件。
也就是说,按键的初始化函数我们规定这样写
void KEY_Init() { P2=0X7F;//让P2.7输出低电平,其他IO端口输出高电平,这样就可以使能4个按键了 }
由于篇幅有限,我们下一讲再细说最终的按键程序。
本文固定URL:https://www.dotcpp.com/course/363
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程