lzh电子论坛

欢迎来到lzh电子论坛:
如果您对电子技术感兴趣就加入我们吧!在这里互相交流互相学习!主要讨论的方向有:单片机,ARM,PCB板设计,FPGA,汇编,C/C++等方面。
-----lzh电子论坛
lzhbbs.forumotion.com
lzh电子论坛

电子的道路是孤独的,要懂得左手温暖右手,要懂得把debug当作快乐去欣赏,去享受,那样你才会成功...

欢迎访问lzh电子论坛。可通过【谷歌,SOSO,搜狗】搜索“lzh电子论坛”直接进入论坛。点击了解论坛详细制度


    很好用的按键程序

    分享
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 26

    很好用的按键程序

    帖子 由 Admin 于 2013-06-23, 2:42 am

    代码:
    /**************************
    51历程如下:
    *************************/
    uchar Trg=0,Cont=0,K_flag=0,K_Counter=0;
    sbit Key1=P0^0;

    /****************************
     假设Key1
     没有按下 :Trg=0x00 Cont=0x01
     短按    :Trg=0x01 Cont=0x01
     长按    :Trg=0x00 Cont=0x01
            K_flag=1: //短按  K_flag=2:长按标志
    *****************************/
    void Scan_Key(void)  //假设该函数每10ms执行一次
    {   u8 ReadData=0;
       ReadData=!Key1;   
       Trg=ReadData&(ReadData^Cont);
       Cont=ReadData;
                           //下边判断是那个键按下 是长按 还是短按
       if((Trg==1&&(Cont&==1)    //短按
       {   K_flag=1;
          K_Counter=0;  //清零计数 防止对长按造成干扰
       }
       if((Cont==1)&&(Trg==0))
       {   
          K_Counter++;
          if(K_Counter>=200)     //200*10ms=2S 长按2S 则数据有效
          {   K_Counter=0;
             K_flag=2;   
          }   
       }
       
    }

    /**********************************************************
    下边的程序  根据上述原理  由一个按键 扩展到四个
    STM32 历程如下:  此程序 不解释!!! 关于K_flag  自己去理解!
    ***********************************************************/
    u8 Trg=0,Cont=0,K_flag=0,K_Counter=0;

    #define Key1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7)
    #define Key2 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)
    #define Key3 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5)
    #define Key4 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9)


    /****************************
     假设Key1
     没有按下 :Trg=0x00 Cont=0x01
     短按    :Trg=0x01 Cont=0x01
     长按    :Trg=0x00 Cont=0x01
    *****************************/
    void Scan_Key(void)    //假设该函数每10ms执行一次
    {   u8 ReadData=0;
       u8 i=0;
       ReadData=(!Key1<<0);   
       ReadData=(!Key2<<1);
       ReadData=(!Key3<<2);
       ReadData=(!Key3<<3);
       Trg=ReadData&(ReadData^Cont);
       Cont=ReadData;
       //下边判断是那个键按下 是长按 还是短按
       for(i=0;i<4;i++)
       {
          if((Trg&(1<<i))&&(Cont&(1<<i)))    //短按
          {   K_flag=1<<i;
             K_Counter=0;  //清零计数 防止对长按造成干扰
          }
          if((Cont&(1<<i))&&(Trg==0))
          {   
             K_Counter++;
             if(K_Counter>=200)     //200*10ms=2S 长按2S 则数据有效
             {   K_Counter=0;
                K_flag=1<<(i+4);
             
             }
          
          }
       }
    }

    有什么体会的可以写下来


    _________________
    电子的道路是孤独的,要懂得左手温暖右手,要懂得把debug当作快乐去欣赏,去享受,那样你才会成功...

      目前的日期/时间是2018-11-20, 1:28 am