找回密码
 立即注册
查看: 70|回复: 0

很经典的三行按键识别 非常好用

[复制链接]
  • TA的每日心情
    奋斗
    12 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    11

    主题

    28

    回帖

    247

    积分

    中级会员

    积分
    247
    发表于 2024-4-16 17:31:43 | 显示全部楼层 |阅读模式
    本帖最后由 zhang32568 于 2024-4-16 17:33 编辑

    不占用中断 不使用延时  没有死循环!!!不占用任何资源

    这个按键检测程序我在20年前网上看到过。当时没有试用。今天逛论坛,又看到这个代码。于是决定测试一下




    unsigned char num,trg1=0, trg2=0,cont1=0,cont2=0;//一定是全局变量
    unsigned char
    sbit key1=P1^1;
    sbit key2=P1^2;

    unsigned key1scan()
    {
    unsigned char a=!key1;//网上是异或运算a=key1^0x01,对于一位按键可以直接写成取反
    trg1= a&(a^cont1);
    cont1=a;
    if(trg1&!key1) //网上是(trg1&key1)实际测试不能使用!!因为任何时候都不可能为真。只有改成(trg1&!key1)才可以完美执行!!!
    return 1;//返回等于1 表示按键按下。
    //{
    //此处可以是自己需要执行的程序。(去掉前面的返回)
    //}

    }


    unsigned key2scan()
    {
    unsigned char a=!key2;//网上是异或运算a=key2^0x01,对于一位按键可以直接写成取反
    trg2= a&(a^cont2);
    cont2=a;
    if(trg2&!key2)  
    return 1;//返回等于1 表示按键按下。
    //{
    //此处可以是自己需要执行的程序。(去掉前面的返回)
    //}

    }

    void main()
    {
    while(1)
    {
      if(key1scan()) //每次按下按键只会执行一次,按键不放开绝对不会重复执行。
      {
        //自己的程序。
      }

    if(key2scan()) //每次按下按键只会执行一次,按键不放开绝对不会重复执行。
      {
        num++;
    if(num==20)//按一次按键 num加1.num可以作为switch程序的条件。
    num=0;
      }

    }

    }

    我今天吧这个代码移植到一个带按键的程序中。原来的按键按下不放开的时候,显示屏停止显示。因为有一句(while(!key1).现在换成这个按键不放,单片机没有任何影响!!

    此代码也可以放到中断程序 执行





    回复 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-5 21:50 , Processed in 0.050080 second(s), 28 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表