历史上的今天
今天是:2025年08月19日(星期二)
2021年08月19日 | 51单片机-支持连按与全局变量
2021-08-19 来源:eefocus
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.支持连按的代码
#include 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 } }
上一篇:51单片机-静态变量
史海拾趣
|
从即日起,为答谢长期关心与支持电子工程世界论坛的各位研发人员,自由电子爱好者及各高校的同学们,我们每月将评选出5位论坛积极参与建设者,并发送电子开发板或其他精美小礼品,在大家共同的努力下,把我们这个虚拟的电子工程师大家庭办的更温 ...… 查看全部问答> |
|
哥们为做实验,特意做了这些转接板.以方便把240脚的芯片插在面包板上.PROTEL99SE格式.有需要的朋友,拿去用吧! [ 本帖最后由 西门 于 2009-5-12 00:18 编辑 ]… 查看全部问答> |
|
一个闸门,用10个KW的电机来驱动。 原来这套控制系统是用两路互锁继电器来控制。 现在准备用上位机+西门子S200来控制电机,正转反转以及上限下限。 本人第一次接触PLC,不是很了解通常PLC系统的可靠性。 想请教大家,在PLC控制系统之外,有 ...… 查看全部问答> |
|
请教: 我的 芯片是带 SMBUS(也就是 I2C) 现在问题是: 并不是每个 I/O 都能做 I2C ,是吗? 我的 P1.0,P1.1 是用 SMBUS 其他引脚用 I2C ,那就软件模拟,是吗? 现在有两个器件需要用到 I2C , 那么有个器件只能用 别的 I/O ,用软件 ...… 查看全部问答> |
|
HANDLE hFile=CreateFile(L\"BC.txt\",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);//EVC下这里用CreateFileForMapping if(hFile==INVALI ...… 查看全部问答> |
|
请教高手... 我现在要开发一种设备,功能很简单,就是将几幅已有的图片(*.jpg或*.bmp)传入设备存贮器并输出至电视机. 输出部分好象可以用SED1356芯片,但具体怎么做就不知从何下手了. 请高手不吝赐教....… 查看全部问答> |
|
Error[e124]: Segment conflict for segment INTVEC. In module "010DT" there is a segment part that is of type RELOCATA××E, while in module "?cstart" there is a segment part that is of type COMMON Total number of errors: ...… 查看全部问答> |
|
USB端点0为控制模式,端点1批量发送,端点2为批量接受,枚举正常,可以读写,问题在于读写的速度太慢了,1M的文件需要20s。请高手帮忙 usb_endp.c中 void EP2_OUT_Callback(void) { Mass_Storage_Out(); } usb_bot.c中 void ...… 查看全部问答> |
|
https://bbs.eeworld.com.cn/thread-413866-1-2.html帖子中说明了为了方便管理大家的帖子,“需要参与DIY活动的朋友请注意,直到今天板子应该都发到了大家手里,接下来大家的任务就是开始按照周计划的安排实施了,便于我们的管理,大家发一个进度帖 ...… 查看全部问答> |




