1.支持连按的思路
支持连按的代码就是在“不支持连按”代码的思路上把“if(KEY4==1)”改为“if(KEY4==0)”,这样的话按键不松手程序就能一直进入“if(KEY4==0)”的大括号里面。然后我们定义一个变量times,如果一直按着不放,times就一直累加,累加到1000,意味着低电平已经持续了一定的时间,我们就可以执行功能代码了,如图所示
2.全局变量
全局变量就是先在所有函数前定义,这种变量可以在所有函数中使用,例如这个变量的值发生改变成为另一个值时,假设是12,其他函数此时运用这个变量的值就是12。关于全局变量的利弊请参考《手把手教你学51单片机》文档7.1.2节。
所以这次我们把数码管显示的内容代码封装成函数,定义一个全局变量cnt,cnt在主函数中通过按键动作来改变这个值,然后数码管负责显示这个数。
实验现象就是按着K4不放,数码管显示cnt的值一直累加。
3.支持连按的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include <reg52.h> sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; sbit LED2 = P0^0; sbit KEY4 = P2^7; unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //数码管状态值初始化 unsigned char LedBuff[6]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //数码管显示缓存区 unsigned char cnt=0; //可以在SEG_task()和main()中使用的全局变量 void SEG_task() //数码管显示函数 { static unsigned char i=0; LedBuff[0]=LedChar[cnt%10]; if (cnt>=10)LedBuff[1]= LedChar[(cnt/10)%10]; //cnt没到达10之前不更新LedBuff[1]的初始值 if (cnt>=100)LedBuff[2]= LedChar[(cnt/100)%10]; //cnt没到达100之前不更新LedBuff[2]的初始值 if (cnt==0){ LedBuff[1]=0xFF;LedBuff[2]=0XFF; } //cnt到达255之后再加1就溢出变为0了,这时候要再次熄灭这两个数码管 P0=0xFF; //端口状态全部熄灭数码管里的LED达到刷新作用 switch (i) { case 0: ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[0];i++; break ; case 1: ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[1];i++; break ; case 2: ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0=LedBuff[2];i=0; break ; } } void main() { unsigned char key_up=1; //定义记录按键状态值的变量,初始值为1避免程序一开始就进入了“if(key_up==0)” unsigned int times=0; //用来记录进入过按键判断语句的次数 ADDR3 = 1; //使能三八译码器 ENLED = 0; // ADDR2 = 1; //************************** ADDR1 = 1; //让三八译码器的IO6输出低电平 ADDR0 = 0; //************************** P2 = 0xF7; //让K4能具备有被拉低的条件先 while (1) { SEG_task(); //数码管显示任务 //按键功能部分 if (key_up==0) { if (KEY4==0) //之前“KEY4==1”是不支持连按,现在改为“KEY4==0”就成为支持连按了 { times++; if (times>=1000) //按键IO端口一直是低电平times就一直累加,累加到1000意味低电平持续了一段时间了,该执行功能代码了,修改1000这个数的话那么cnt自加的速度就会改变 { times=0; cnt++; //执行功能代码 } } } key_up=KEY4; //如果不松手,key_up就会等于0 } } |
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程