单片机学习笔记-51单片机实现独立按键的短按及长按触发_第1页
单片机学习笔记-51单片机实现独立按键的短按及长按触发_第2页
单片机学习笔记-51单片机实现独立按键的短按及长按触发_第3页
单片机学习笔记-51单片机实现独立按键的短按及长按触发_第4页
单片机学习笔记-51单片机实现独立按键的短按及长按触发_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单⽚机学习笔记————51单⽚机实现独⽴按键的短按及长按触发⼀、使⽤proteus绘制简单的电路图,⽤于后续仿真⼆、编写程序/********************************************************************************************************************----@Project:Independent-KEY----@File:main.c----@Edit:ZHQ----@Version:V1.0----@CreationTime:20200506----@ModifiedTime:20200506----@Description:两个独⽴按键S1和S2,按住其中⼀个按键,在短时间内松⼿,则认为是短按,触发蜂鸣器短鸣⼀声。如果⼀直按住这个按键不松⼿,那么超过规定----单⽚机:AT89C52********************************************************************************************************************/#include"reg52.h"/*——————宏定义——————*/#defineFOSC11059200L#defineT1MS(65536-FOSC/12/1000)/*1mstimercalculationmethodin12Tmode*/#defineconst_voice_short80/*蜂鸣器短叫的持续时间*/#defineconst_voice_long600/*蜂鸣器长叫的持续时间*/#defineconst_key_time_short160/*短按的按键去抖动延时的时间*/#defineconst_key_time_long11000/*长按的按键去抖动延时的时间*/#defineconst_key_time_short260/*短按的按键去抖动延时的时间*/#defineconst_key_time_long21000/*长按的按键去抖动延时的时间*//*——————变量函数定义及声明——————*//*定义按键S1*/sbitKey_S1=P0^0;/*定义按键S2*/sbitKey_S2=P0^1;/*定义蜂鸣器*/sbitBUZZER=P2^7;unsignedcharucKeySec=0;/*被触发的按键编号*/unsignedintuiKeyTimeCnt1=0;/*按键去抖动延时计数器*/unsignedcharucKeyLock1=0;/*按键触发后⾃锁的变量标志*/unsignedcharucShortTouchFlag1=0;/*短按的触发标志*/unsignedintuiKeyTimeCnt2=0;/*按键去抖动延时计数器*/unsignedcharucKeyLock2=0;/*按键触发后⾃锁的变量标志*/unsignedcharucShortTouchFlag2=0;/*短按的触发标志*/unsignedintuiVoiceCnt=0;/*蜂鸣器鸣叫的持续时间计数器*//***@brief定时器0初始化函数*@param⽆*@retval初始化T0**/voidInit_T0(void){TMOD=0x01;TL0=T1MS;/*settimer0asmode1(16-bit)*//*initialtimer0lowbyte*/TH0=T1MS>>8;/*initialtimer0highbyte*/}/***@brief外围初始化函数*@param⽆*@retval初始化外围**/voidInit_Peripheral(void){ET0=1;/*允许定时中断*/TR0=1;/*启动定时中断*/EA=1;/*开总中断*/}/***@brief初始化函数*@param⽆*@retval初始化单⽚机**/voidInit(void){Init_T0();BUZZER=1;}/***@brief扫描按键函数*@param⽆*@retval长按与短按的按键扫描的详细过程:*第⼀步:平时只要按键没有被按下时,按键的⾃锁标志,去抖动延时计数器⼀直被清零。*第⼆步:⼀旦按键被按下,去抖动延时计数器开始在定时中断函数⾥累加,在还没累加到****阀值const_key_time_short1或者const_key_time_long1时,如果在这期间由于受外界⼲扰或者按键抖动,⽽使IO⼝突然瞬间触发成⾼电平,这个时候马上把延时计数器uiKeyTimeCnt1清零了,这个过程⾮常巧妙,⾮常有效地去除瞬间的杂波⼲扰。以后凡是⽤到开关感应器的时候,都可以⽤类似这样的⽅法去⼲扰。*第三步:如果按键按下的时间超过了短按阀值const_key_time_short1,则马上把短按标志ucShortTouchFlag1=1;**如果还没有松⼿,⼀旦发现按下的时间超过长按阀值const_key_time_long1时,先把短按标志ucShortTouchFlag1清零,然后触发长按。在这段程序⾥,把⾃锁标志ucKeyLock1置位,*是为了防⽌按住按键不松⼿后⼀直触发。*第四步:等按键松开后,⾃锁标志ucKeyLock12及时清零,为下⼀次⾃锁做准备。如果发现ucShortTouchFlag1等于1,说明短按有效,这时触发⼀次短按。**第五步:以上整个过程,就是识别按键IO⼝下降沿触发的过程。**/voidKey_Scan(void){/*扫描S1*/if(Key_S1==1)/*如果按键没有被按下(⾼电平),将⼀些标志位及时清零*/{ucKeyLock1=0;/*⾃锁标志位清0*/uiKeyTimeCnt1=0;/*按键去抖动延时计数器清零*/if(ucShortTouchFlag1==1)/*短按*/{ucShortTouchFlag1=0;ucKeySec=1;/*触发S1短按*/}}elseif(ucKeyLock1==0)/*如果有按键按下,且是第⼀次按下*/{uiKeyTimeCnt1++;if(uiKeyTimeCnt1>const_key_time_short1)/*判定短按*/{ucShortTouchFlag1=1;/*激活短按的有效标志位*/}if(uiKeyTimeCnt1>const_key_time_long1)/*判定长按*/{ucShortTouchFlag1=0;/*清除短按的有效标志位*/uiKeyTimeCnt1=0;ucKeyLock1=1;/*⾃锁按键置位,避免⼀直触发*/ucKeySec=2;/*触发S1长按*/}}/*扫描S2*/if(Key_S2==1)/*如果按键没有被按下(⾼电平),将⼀些标志位及时清零*/{ucKeyLock2=0;/*⾃锁标志位清0*/uiKeyTimeCnt2=0;/*按键去抖动延时计数器清零*/if(ucShortTouchFlag2==1)/*短按*/{ucShortTouchFlag2=0;ucKeySec=3;/*触发S1短按*/}}elseif(ucKeyLock2==0)/*如果有按键按下,且是第⼀次按下*/{uiKeyTimeCnt2++;if(uiKeyTimeCnt2>const_key_time_short2)/*判定短按*/{ucShortTouchFlag2=1;/*激活短按的有效标志位*/}if(uiKeyTimeCnt2>const_key_time_long2)/*判定长按*/{ucShortTouchFlag2=0;/*清除短按的有效标志位*/uiKeyTimeCnt2=0;ucKeyLock2=1;/*⾃锁按键置位,避免⼀直触发*/ucKeySec=4;/*触发S1长按*/}}}/***@brief按键服务函数*@param⽆*@retval根据扫描得到的值,进⾏数据处理**/voidkey_Service(void){switch(ucKeySec){case1:/*S1短按*/uiVoiceCnt=const_voice_short;/*蜂鸣器短叫*/ucKeySec=0;/*响应按键服务处理程序后,按键编号清零,避免⼀致触发*/break;case2:/*S1长按*/uiVoiceCnt=const_voice_long;/*蜂鸣器长叫*/ucKeySec=0;/*响应按键服务处理程序后,按键编号清零,避免⼀致触发*/break;case3:/*S2短按*/uiVoiceCnt=const_voice_short;/*蜂鸣器短叫*/ucKeySec=0;/*响应按键服务处理程序后,按键编号清零,避免⼀致触发*/break;case4:/*S2长按*/uiVoiceCnt=const_voice_long;/*蜂鸣器长叫*/ucKeySec=0;/*响应按键服务处理程序后,按键编号清零,避免⼀致触发*/break;}}/***@brief定时器0中断函数*@param⽆*@retval⽆**/voidISR_T0(void)interrupt1{TF0=0;/*清除中断标志*/TR0=0;/*关中断*//*扫描按键*/Key_Scan();if(0!=uiVoiceCnt){uiVoiceCnt--;BUZZER=0;}else{BUZZER=1;}TL0=T1MS;/*initialtimer0lowbyte*//*initialtimer0highbyte*/TH0=T1MS>>8;TR0=1;/*开中断*/}/***@brief延时函数*@param⽆*@retval⽆**/voidDelay_Long(unsignedintuiDelayLong){unsignedinti;unsignedintj;for(i=0;i<uiDelayLong;i++){for(j=0;j<50

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论