你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

按键检测的资料

[复制链接]
su-409464 发布时间:2015-10-19 19:42
这几天 在看 按键检测。首先要感谢网上 的大牛们, 在这里 我做一下转载!!!   

网上找到几个 帖子, 有兴趣的同学可以 学习一下。

这是第一个推荐学习的:(可惜阿莫论坛的账号 现在去不了!!!)
http://www.amobbs.com/forum.php?mod=viewthread&tid=3264955


这个例子的代码写得很漂亮, 可以说爱不释手!!!!只可惜我还没参悟透
这个需要根据自己的硬件连接  来修改  Keyread 的 函数,  我还没参悟出 实际中 这个和实际按键连接 的关系是怎样?

但是可以看出作者很巧妙的把 第几个按键 和按键的 触发类型   融合成一个 char 字符 返回来!

  1. /*
  2.    功能描述:读取按键状态, 根据不同按键电路和编号方式修改本函数
  3.    入口参数:无
  4.    出口参数:按键编号
  5.    */
  6. static u8 KEY_Read(void)
  7. {
  8.    
  9.     u8 KCode = 0;
  10. /*        u8 KMask;
  11.     // 读引脚状态,取反后1表示键按下
  12.     KMask = GPIO_ReadInputData(KEY_PORT) ^ 0xFF;
  13.        

  14.         // KEY_PORT上接8个独立式按键,从低到高编号为1~8
  15.         while(KMask != 0)
  16.         {
  17.                 KMask >>= 1;
  18.                 KCode++;
  19.         }
  20. */
  21.     if( GPIO_ReadInputPin(KEY_PORT, KEY_PIN) == RESET )
  22.         KCode = 1;
  23.         return KCode;
  24. }
复制代码


1. 如果有能看透 注释的,希望分享一下。


本以为状态机 就是 最牛B的写法, 后面又看到了一个更牛B 精简的写法:
http://blog.csdn.net/caiyunfreedom/article/details/6543256
这个帖子的大神  讲解得 很清楚。

但是存在一个问题,我正在思考中。

2.  就是按键在判断   长按的时候,  我们该如何处理 只执行一次?

    如果一直长按不放的话, 那么 Long_Press_cnt 就一直加, 加完又清零。
    然后你不放的话, 又一直加, 这样 就导致了  长按不放 那么 按键就一直 无限次的循环 。。
    所以这里还有这个逻辑需要 在完善,  等我想出来 再共享!!!
   
  1.         if( Cont&KEY_MODE )
  2.         {

  3.                 LongPress_cnt++;
  4.                 if(LongPress_cnt >=100)//20ms*100 = 2S
  5.                 {
  6.                         LongPress_cnt=0;
  7.                         UART2_SendData8(0xee);
  8.                 }
  9.         }
复制代码





再最最最最 后,   上面的一切其实都只是  方法,  最最最 重要的还是   分时复用的  思想!!!!如果彻底领悟了这个思想并灵活应用那么 单片机就真正的入门了。

关于这个 ,大家可以看看 《从单片机初学者迈向单片机工程师》  这篇文章 !






收藏 2 评论8 发布时间:2015-10-19 19:42

举报

8个回答
when7com 回答时间:2015-10-20 10:14:48
给你找了一个解决方案

新建文本文档.rar

下载

1.87 KB, 下载次数: 35

你好我好大家好! 回答时间:2015-10-19 20:28:57
学习学习                           
阿莫西林 回答时间:2015-10-20 08:52:36
受用
when7com 回答时间:2015-10-20 09:53:39
三行处理法
unsigned char Trg;
unsigned char Cont;
void KeyRead( void )
{   //什么叫异或运算?:简单地说就是相同出0,不同出1.参与运算的两个值,如果两个相应的位bit
    //相同,则结果为0;否则为1.   如:0^0=0;0^1=1; 1^0=1; 1^1=0;

    unsigned char ReadData = PINB^0xff; // 1,读端口数据即端口字节值,异或运算(或->取反)
     Trg = ReadData & (ReadData ^ Cont);      // 2,触发即按下按键
     Cont = ReadData;         // 3,连续按下
}
su-409464 回答时间:2015-10-20 10:06:14
when7com 发表于 2015-10-20 09:53
三行处理法
unsigned char Trg;
unsigned char Cont;

但是如果是长按,如何 只让它触发一次,  直到松开手 下次长按再触发  呢???

目前长按 不放的 话, 会一直重复触发!
when7com 回答时间:2015-10-20 10:09:17
su-409464 发表于 2015-10-20 10:06
但是如果是长按,如何 只让它触发一次,  直到松开手 下次长按再触发  呢???

目前长按 不放的 话,  ...

void tiem1(void) interrupt 3{
    keyscan();
    switch(Trg)
    {    case 0x01:
            break;
        case 0x02:
                        break;
        case 0x04:
            break;
        default :break;
    }
    display();
    TH1 = 0x63;              
    TL1 = 0xc0;  
}
阿莫西林 回答时间:2015-10-21 20:47:13
学习学习
pwdzsj 回答时间:2015-10-21 23:31:54
谢谢分享

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版