[参考设计] 三种按键处理函数

[复制链接]
69|5
 楼主 | 2019-11-8 15:03 | 显示全部楼层 |阅读模式

按键是接:RB3'4'5 ;没键为高,按下去 为0

  1. void keyScan(void)
  2. {
  3.      char i;
  4.      uint8 m;
  5.      uint8 R0 = 0;
  6.      TRISB=0x38; //xls 2012-11-26 增加复位键RB5

  7.      R0 = PORTB; //RB3,RB4,RB5按键读取
  8.     R0 &=0x38; //保留键值
  9.     R0 = ~R0; //正逻辑
  10.     /*以下是RC滤波处理,R0,R1對應於KEY1,KEY2的BUF*/
  11.      datakey.allkey = (R0>>3);//将读到的键值移至最右端 比如当前在RB1 顾右移一位 如果为RB4 R3则右移3位
  12.     for (i=0;i<3;i++)//这里根据有几个独立按键进行设置 只有一个按键时则i=1,三个则i=3  
  13.     {
  14.        s_kcap[i]=((s_kcap[i]<<3)-s_kcap[i]+(datakey.allkey&0x01)<<4+4)>>3; //rc滤波及4舍5入
  15.      datakey.allkey>>=1;
  16.       if (s_kcap[i]>12)
  17.      {
  18.         datakey.allkey|=0x80;
  19.      }
  20.   }
  21.    m=datakey.allkey;
  22.    datakey.allkey=(datalastkey.allkey^datakey.allkey)        &datalastkey.allkey;//後沿處理
  23.    datalastkey.allkey=m;

  24. //datakey.allkey=(datalastkey.allkey^datakey.allkey)&datakey.allkey;  //前沿處理
  25. //datalastkey.allkey=m;
  26. }
复制代码


使用特权

评论回复
 楼主 | 2019-11-8 15:03 | 显示全部楼层
  1. extern volatile union key datakey;
  2. extern volatile union lastkey datalastkey;
  3. extern volatile union fistkey datafistkey;
  4. //板上按键定义
  5. #define K2 (datakey.allkey&0x40)
  6. #define K3 (datakey.allkey&0x80) //
  7. #define K1 (datakey.allkey&0x20) //

  8. #define LK2  (datalastkey.allkey&0x40)
  9. #define LK3  (datalastkey.allkey&0x80) //extern volatile union var key;
  10. #define LK1  (datalastkey.allkey&0x20)
复制代码

使用特权

评论回复
 楼主 | 2019-11-8 15:03 | 显示全部楼层
  1. #ifndef _MYDEFINE_H
  2. #define _MYDEFINE_H

  3. #define BIT bit
  4. #define uint8  unsigned char
  5. #define uint16 unsigned int
  6. #define uint32 unsigned long int

  7. #define BT_CFG2_6  RA0
  8. #define BT_CFG1_6  RA2
  9. #define ON_OFF_SLEEP_WAKE_B RA3

  10. #define _ON                                1
  11. #define _OFF                               0
  12. #define _TRUE                           1
  13. #define _FLASE                            0

  14. #define _PRINTF                  _OFF

  15. #define Acsii(x)               x+0x30
复制代码

使用特权

评论回复
 楼主 | 2019-11-8 15:04 | 显示全部楼层
349345dc5136c46030.png

一般放主循环里 10ms或20ms一次

使用特权

评论回复
 楼主 | 2019-11-8 15:04 | 显示全部楼层
第二种:

  1. static volatile bank3 uchar key1  [url=home.php?mod=space&uid=72445]@[/url] 0x6b;        //定义十二个按键,电平触发
  2. static volatile bank3 uchar key2  @ 0x6c;
  3. static volatile bank3 uchar lkey1 @ 0x6d;        //定义十二个按键,前沿触发
  4. static volatile bank3 uchar lkey2 @ 0x6f;

  5. static volatile  bit    k0    @ (unsigned)&key1*8+0;
  6. static volatile  bit    k1    @ (unsigned)&key1*8+1;
  7. static volatile  bit    k2    @ (unsigned)&key1*8+2;
  8. static volatile  bit    k3    @ (unsigned)&key1*8+3;
  9. static volatile  bit    k4    @ (unsigned)&key1*8+4;
  10. static volatile  bit    k5    @ (unsigned)&key1*8+5;
  11. static volatile  bit    k6    @ (unsigned)&key1*8+6;
  12. static volatile  bit    k7    @ (unsigned)&key1*8+7;

  13. static volatile bit    k8    @ (unsigned)&key2*8+0;
  14. static volatile bit    k9    @ (unsigned)&key2*8+1;
  15. static volatile bit    k10    @ (unsigned)&key2*8+2;
  16. static volatile bit    k11    @ (unsigned)&key2*8+3;

  17. static volatile bit    lk0    @ (unsigned)&lkey1*8+0;
  18. static volatile bit    lk1    @ (unsigned)&lkey1*8+1;
  19. static volatile bit    lk2    @ (unsigned)&lkey1*8+2;
  20. static volatile bit    lk3    @ (unsigned)&lkey1*8+3;
  21. static volatile bit    lk4    @ (unsigned)&lkey1*8+4;
  22. static volatile bit    lk5    @ (unsigned)&lkey1*8+5;
  23. static volatile bit    lk6    @ (unsigned)&lkey1*8+6;
  24. static volatile bit    lk7    @ (unsigned)&lkey1*8+7;

  25. static volatile bit    lk8    @ (unsigned)&lkey2*8+0;
  26. static volatile bit    lk9    @ (unsigned)&lkey2*8+1;
  27. static volatile bit    lk10 @ (unsigned)&lkey2*8+2;
  28. static volatile bit    lk11 @ (unsigned)&lkey2*8+3;

  29. uchar keycnt;

  30. void keyscan(void)                    //按键扫描
  31. {
  32.     keycnt++;
  33.     xs0=xs1=xs2=xs3=xs4=xs5=xs6=xs7=RD7=0; //

  34.     TRISD=0X0F;                    //

  35.     RD6=1;RD5=0;RD4=1;            //(k4~k7)
  36.     asm("nop");asm("nop");
  37.     R0=(RD^0X0f)&0x0f;
  38.     R0=R0<<4;

  39.     RD4=0;RD5=1;RD6=1;            //(k0~k3)
  40.     asm("nop");asm("nop");
  41.     R0+=((RD^0X0F)&0X0F);

  42.     RD6=0;RD5=1;RD4=1;            //(k8~k11
  43.     asm("nop");asm("nop");
  44.     R1=(RD^0X0f)&0x0f;

  45.     if(R0|R1)                    //有键?
  46.      {     
  47.           if(keycnt>=12)
  48.             {keycnt=0;
  49.               key1=R0;key2=R1;
  50.             }
  51.            else
  52.             {key1=lkey1;//lkey1电平值,key1,前沿值
  53.              key2=lkey2;
  54.             }
  55.     }
  56.     else
  57.         {key1=key2=0;
  58.          keycnt=0;
  59.         }
  60.     R2=key1;R3=key2;
  61.     key1=key1&(lkey1^key1);    lkey1=R2;
  62.     key2=key2&(lkey2^key2);    lkey2=R3;
  63. }
复制代码

使用特权

评论回复
 楼主 | 2019-11-8 15:05 | 显示全部楼层
第三种:

  1. BOOL Switch2IsPressed(void)
  2. {
  3.     if(sw2 != old_sw2)
  4.     {
  5.         old_sw2 = sw2;                  // Save new value
  6.         if(sw2 == 0)                    // If pressed
  7.             return TRUE;                // Was pressed
  8.     }//end if
  9.     return FALSE;                       // Was not pressed
  10. }//end Switch2IsPressed


  11. typedef enum _BOOL { FALSE = 0, TRUE } BOOL;
复制代码

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表