完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
废话不说,直接先上程序
#include "STM32f10x.h" /*************************************************************************************************************** 函数名:KeyRead 功能:独立按键扫描函数 入口参数:无 返回值:无 说明: Trg的值表示对应哪个按键按下,它只出现一次,也就是说按键按下时对应按键值,之后不关有没有持续按下,都变为0 Cont的值表示有没有长按,因为只要松开按键,它就会变为0 time是定时器进入一次中断时间,由定时器配置时决定 LongPres为长按键值 ClickTimes为敲击次数,在规定时间内没有连续敲击则变为0,规定时间有连续不断敲击则连续加一。 ****************************************************************************************************************/ u16 Trg,Cont,LongPres; u8 Time,ClickTimes; void KeyRead( void ) { u16 ReadData = ((GPIO_ReadInputData(GPIOB)&0x03f8)|(GPIO_ReadInputData(GPIOA)&0xC000)); // PB3456789和PA14 15 ReadData = ReadData^0xffff; // 1 Trg = ReadData & (ReadData ^ Cont); // 2 Cont = ReadData; // 3 if(Trg)//按键一次则清除定时器计数值, { ClickTimes++; Time=0; LongPres=0; } if(ClickTimes)//检测到每次按键后200ms若没有再次按键,则清零标志,否则,单击次数加一 { if(Time>2)//此处可以改变单击间隔时间 ClickTimes=0; } if((Cont&GPIO_Pin_6)||(Cont&GPIO_Pin_4)) { if(Time>25)//长按时间 约2.5s LongPres=Cont; //它置位后就与定时器没有关系了,只有停止按键时才能复位 } else LongPres=0; } 以上就是按键程序,此外还需要定时器,其配置这里就不说了,定时器中断时间是100ms,中断函数如下: //定时器4中断服务函数 void TIM4_IRQHandler() { TIM_ClearITPendingBit(TIM4 , TIM_FLAG_Update); Time++; //这里不用担心它能加到多大,因为每次按键都会清除Time值, //也就是说每次长按都是从0开始计数的,不管Time本身是多少, //到达指定长按键计数值时,长按变量LongPres置位,而此时定时器已经对按键没有用了, //只有停止按键时LongPres才能复位。此时因此这里不用为其清零,不用担心它能加到多大。 } 下面这个例子看看怎么使用这个程序 if(ClickTimes==2) //双击 { switch(Trg) //判断是哪个按键按下 { case GPIO_Pin_7: 要执行的程序 case GPIO_Pin_8: 要执行的程序 default : break; } } if(ClickTimes==3) //三击 { switch(Trg) //判断是哪个按键按下 { case GPIO_Pin_14: 要执行的程序; case GPIO_Pin_15: 要执行的程序 case GPIO_Pin_3: 要执行的程序 default : break; } } if(ClickTimes==4) //4击 { if(Trg&GPIO_Pin_5) //判断是哪个按键按下 { 要执行的程序} if(Trg&GPIO_Pin_6||LongPres&GPIO_Pin_6)//短按一次或者长按 { 要执行的程序 } 当然,这个程序还是有点bug,比如abc三键依次按,也会被认为是三击,当然认为是最后最后按下的按键三击,这就要看你觉得这个bug有木有影响了,需要大家自己去改进 |
|
相关推荐
2 个讨论
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
1085 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1041 浏览 2 评论
2145 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1240 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1660 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 23:19 , Processed in 0.553668 second(s), Total 39, Slave 32 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号