51单片机如何实现按键的长按与短按功能,尝试过很多方法都不行,请高手多赐教,多谢了(想是简单,做是难)

51单片机如何实现按键的长按与短按功能,尝试过很多方法都不行,请高手多赐教,多谢了(想是简单,做是难),第1张

这个真心不难,就是简单的c语言判定就返慎行了,《C程序设计语言》,实在看不了就看谭总写的那本c语言。给你写过伪代码,

if(key=ReadKey())//读取按拆世余键,判断有无按键按下去,没按键按下,这里返回0值是不进入这个函数的

{

delay(x)//延时一段时间,写过循环就行了

if(!ReadKey())//在次读取按键值,实际上按下去按键是低电平(原理图一般都是这样做的)

{

return 已旅滚经松手了( 这里是高电平了返回0了)

/*          网友反映长键结束后会送出短键值,特作更改      2019.03.29 */

//1,再写一个长短键判断函数,调用那个按键扫描函数

unsigned char KEY_process(void)

{

    static unsigned char Old_key   = 0//上次按键值

    static unsigned char Key_buf   = 0//按键有效保存

    static unsigned char Press_CNT = 0//按键按下时间,根据调用时间间隔确定

    static  unsigned  char  bPreKeyIsLong = 0//长键有效标记变量

    unsigned char New_key          = 0//当前按键值

    unsigned char KEY              = 0//待返回的按键值

    

    New_key 团扒= keyscan()

    

    if(New_key == Old_key)

    {

        if(New_key != 0)//建议keyscan返回0的那个值改为其他值,方便这里判断

        {

            Key_buf = New_key

            if(Press_CNT < 0xff)

            {

                Press_CNT ++

            }

            if(Press_CNT >= 100)//调用时间间隔确定 * 100为长按时间,

            {

                KEY = Key_buf + 100//将短键+100作长键区分

                Press_CNT = 0//按键时间清0

                Key_buf   = 0//按键缓冲清0

                bPreKeyIsLong = 1//长键有效标记

            }

            

        }

        else//按键d起

        {

            if(Key_buf && (bPreKeyIsLong == 0) )//仅在长键无效时

            {

                KEY = Key_buf//将缓冲值送将返回的值

                Key_buf = 0//清按键缓冲

            }

            Press_CNT = 0//按键d起或按其他按键,将长按时间清0

            bPreKeyIsLong 塌枝昌= 0//长键有效标记清0

        }

    }

    搭缓Old_key = New_key//将新按键赋给下一次的旧按键值

    

    return KEY//0代表无按键

}

//2,d起不返回已确定的值,则在keyscan最后加一句判断

if((P3 & 0X0F) == 0X0F)//按键已经d起

{

    keyvalue = MY_key//使按键等于一个自定义的值

}

#include<reg51.h>

#define uchar unsigned char

sbit key=P1^0

sbit close=P1^1

uchar times=0

void t0isr() interrupt 1

{

TH0=(65536-50000)/256

TL0=(65536-50000)%256

times++

if(key==1)times=0

if(times>60)close=0

}

main()

{

TMOD=0x01

TH0=(65536-50000)/256

TL0=(65536-50000)%256

ET0=1

EA=1

close=1

while(1)

{

if(key==0){TR0=1times=0}

if(key==1)TR0=0

}

}


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

原文地址:https://54852.com/yw/12421277.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存