单片机一键长按与短按按键实现的c程序有问题,实在不知道是哪里有问题,请帮助修改一下,谢谢!

单片机一键长按与短按按键实现的c程序有问题,实在不知道是哪里有问题,请帮助修改一下,谢谢!,第1张

这……也太乱了吧?你能从这一大堆的逻辑中理出头绪来,我真佩服死你了。你这长按一处理,后面短按马上也生效了,长按跟没有一样。既然都用上定时器了,就别delay了,那东西只有教材上才会出现,实际应用上很少用到的。用定时器,设个基准时间比如200us一中断,然后设个10ms的按钮扫描明竖氏时间,就是50个中断,用两个连续的按钮扫描低电平来确定按钮有效性,那个delay就可以88了,教条主义害死人啊。按扭有效后马上对“中断计数”,这个会吧?按钮激散按下就连加,放开就清0,下次重计数,2秒就是20000次中断,能计到这个数就说明长按有效,没计到纤派这个数就说明短按有效,这样就可以分开处理啦,就这么简单,别老拿定时器开啊关啊。理清思路,别说长按短按,就是双击都可以做出来。

首先需要硬件支持,也就是单片机某个引脚可以控制断电和维持上电

按键的的作用也可以给单片机供电,并且还要有个专门的引脚检测按键状态。

软件:首先是长按判尘庆颤断。这个最好用按键扫描。就是检测按键按下时候,定时器计时,如果松开就立即清零。在设置一个功能函数检测定时值,大于两秒后,就表示长按。

按键按下单片机供电开始计时,如果达到长按标准,就输出引脚派败控制持续供电,这时候按键松了也不会断电。

运行期间,按键再次按下并符合长按,差拦那木引脚输出停止供电,这时候如果按键松开,那就彻底没电关机。

unsigned char Funtion_Mode = 0

// 定义一个功能模式的变量,=0:功能1 =1:功能2 等等

void main( void )

{

while( 1 )

{

if( KeyPort &KeyID != KeyID )// 就是功能模式选择键按下的意思

{

DelayMs(30)// 短延时消芦罩中抖

if( KeyPort &KeyID != KeyID )// 按键按下

{

Funtion_Mode ++// 按下一次,就选择一个功能

if( Funtion_Mode == 3 )

{

Funtion_Mode = 0 // 这里很重要,必须进行越限处理

}

whiel( KeyPort &KeyID != KeyID )// 等待按键松开

}

}

switch( Funtion_Mode )

{

case 0:

// 你闷和的功陪山能1代码在这

break

case 1:

// 你的功能2代码在这

break

case 2:

// 你的功能3代码在这

break

default:// 其他情况

break

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12449401.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存