搜索
查看: 2367|回复: 8

[转载] 按键检测的资料

[复制链接]

该用户从未签到

26

主题

82

帖子

0

蝴蝶豆

中级会员

最后登录
2021-1-6
发表于 2015-10-19 19:42:46 | 显示全部楼层 |阅读模式
这几天 在看 按键检测。首先要感谢网上 的大牛们, 在这里 我做一下转载!!!   

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

这是第一个推荐学习的:(可惜阿莫论坛的账号 现在去不了!!!)
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.         }
复制代码





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

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






回复

使用道具 举报

该用户从未签到

8

主题

130

帖子

0

蝴蝶豆

中级会员

最后登录
2018-3-15
发表于 2015-10-20 10:14:48 | 显示全部楼层
给你找了一个解决方案

新建文本文档.rar

1.87 KB, 下载次数: 36, 下载积分: ST金币 -1

回复 支持 1 反对 0

使用道具 举报

该用户从未签到

57

主题

1216

帖子

0

蝴蝶豆

金牌会员

最后登录
2023-6-4
发表于 2015-10-19 20:28:57 | 显示全部楼层
学习学习                           
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

630

帖子

11

蝴蝶豆

金牌会员

最后登录
2021-3-26
发表于 2015-10-20 08:52:36 | 显示全部楼层
受用
回复

使用道具 举报

该用户从未签到

8

主题

130

帖子

0

蝴蝶豆

中级会员

最后登录
2018-3-15
发表于 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,连续按下
}
回复 支持 反对

使用道具 举报

该用户从未签到

26

主题

82

帖子

0

蝴蝶豆

中级会员

最后登录
2021-1-6
 楼主| 发表于 2015-10-20 10:06:14 | 显示全部楼层
when7com 发表于 2015-10-20 09:53
三行处理法
unsigned char Trg;
unsigned char Cont;

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

目前长按 不放的 话, 会一直重复触发!
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

130

帖子

0

蝴蝶豆

中级会员

最后登录
2018-3-15
发表于 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;  
}
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

630

帖子

11

蝴蝶豆

金牌会员

最后登录
2021-3-26
发表于 2015-10-21 20:47:13 | 显示全部楼层
学习学习
回复

使用道具 举报

该用户从未签到

34

主题

238

帖子

0

蝴蝶豆

中级会员

最后登录
2020-8-28
发表于 2015-10-21 23:31:54 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-8 09:24 , Processed in 1.173801 second(s), 41 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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