blueice1108 发表于 2013-9-27 19:40:30

状态机按键请教

状态机按键请教
不知道马老师对这部分有没有了解
谢谢
http://www.amobbs.com/thread-5551688-1-1.html

machao 发表于 2013-9-27 22:03:31

能把功能要求描述的再明确点吗?

功能描述
使用POLLING(20MS)                           ==》这个作为消抖时间可以
按下KEY1按键释放后 传送A
按下KEY2按键释放后 传送B                  ==》为什么要按键释放后,确认按键按下传送可以吗?
当分开按时没有问题

但当按很快时 有时只会传送一个
或两个都不动作                                  ==》关键是这里,你的意思是KEY1传送A、key2传送B的功能都是唯一的,如果2个都按下了,传送A和B都要发生(不是发生第3个动作)

如何确保按键不会LOSS
扫描频率大概多少
有例子可以参考吗
谢谢

machao 发表于 2013-9-27 19:40:31

给你一个参考,本站上有这个方法使用的帖子,你自己试一下,然后再深入的分析和理解它。

硬件工程师和纯软件出身的工程师处理方法和思路不同,硬件工程师直接,简单。

假定你有4个KEY,在PA口的PA0\PA1\PA2\PA3上,释放状态为逻辑1,按下情况为逻辑0,按下按键和释放按键的消抖为20ms(即按下和释放操作20ms后肯定已经处在稳定状态)

//按键底层扫描处理函数。该函数测试4个按键,在1个按键按下和释放的整个过程中,只返回一次1(发生在检测到第一次按下按键时),反映在相应的bit位上,4个按键之间独立不受干扰。

#define KEY_port PA
#define KEY_mask0x0f                  //4个按键接PA口低4位,高4位屏蔽掉

char read_key()
{
   static char key_old;                              //必须为STATIC型
   char key_new,key_return;

    key_new = (KEY_port & KEY_mask) ^ KEY_mask;       
    key_return = (key_new ^ key_old)&key_new;
    key_old = key_new;
    return (key_return;)      
}

=====================
//主代码

char key_scan_ok
T/C_intrupt()                         //使用一个定时中断,间隔20ms
{
       key_scan_ok = 1;
}

main()
{
.........
    if (key_scan_ok)
    {
         key_scan_ok = 0;
         key_value = read_key();
         switch (key_value)
      {
            case 0x01:
                     传送A;
                     break;
            case 0x02:
                     传送B;
                     break;
            case 0x03:
                     传送A;
                     传送B;
                  break;
            case 0x04:

            case 0x05:
             ...............
            case 0x0f:         //15个CASE,0x00无按键

         }

    }

}

Jach_cc 发表于 2013-9-29 15:37:28

这个 好说,我也有一个相关的帖子。

blueice1108 发表于 2013-9-30 13:05:31

感谢大家的回答
我先照帖子尝试一下

skyxjh 发表于 2013-9-30 23:27:26

马老师的代码是只检测按键动作的下降沿

skyxjh 发表于 2013-9-30 23:33:24

如果要检测按键动作的上升沿,修改key_return = (key_new ^ key_old)&key_new;为key_return = (key_new ^ key_old)&key_old;

blueice1108 发表于 2013-10-2 15:57:25

skyxjh 发表于 2013-9-30 23:33 static/image/common/back.gif
如果要检测按键动作的上升沿,修改key_return = (key_new ^ key_old)&key_new;为key_return = (key_n ...

請問如何由上升下降檢測求出式子?

skyxjh 发表于 2013-10-2 23:56:09

key_new^key_old是检测变化,两次检测值有变化就为真。这个值再与上一次检测的值key_old相与,也就是说只有在上次检测到按键按下时返回值才为真,所以检测的是按键释放时刻,即上升沿;同理与当前检测的值key_new相与,只有在当前检测到按键按下时返回值才为真,所以检测的是按键按下时刻,即下降沿。

machao 发表于 2013-10-3 13:57:08

针对LZ的要求,该段代码应该是比较简单的实现方法,但并不是通用的方法。针对不同的系统要求还应该作修改和调整,所以关键在于掌握和理解最基本的思路和方法。

感谢skyxjh网友给出检测上升沿动作的变化,其实只要数字逻辑基础好的话,工程师们在此基础上应该知道如何变化(本人犯严重的职业病,原想把检测上升沿动作作为一个思考题,后来怕被拍砖没敢写)。另外对于常规的按键应用,我喜欢按下就动作,这样操作者看到按键的反映后就马上释放了。如果是检测到释放再作动作,容易造成操作者一直按着键不放。

blueice1108 发表于 2013-10-3 13:58:31

skyxjh 发表于 2013-10-2 23:56 static/image/common/back.gif
key_new^key_old是检测变化,两次检测值有变化就为真。这个值再与上一次检测的值key_old相与,也就是说只有 ...

http://bbs.21ic.com/blog-390105-106583.html
http://bbs.21ic.com/blog-390105-106666.html
找到两篇文章
能说下如果没程序的情况下真值表怎写出吗

skyxjh 发表于 2013-10-3 22:28:04

blueice1108 发表于 2013-10-3 13:58 static/image/common/back.gif
http://bbs.21ic.com/blog-390105-106583.html
http://bbs.21ic.com/blog-390105-106666.html
找到两篇文 ...

为什么要把简单的问题复杂化呢?
所谓真值表就是把所有可能的输入和输出列到一张表里,再从表里的数据找规律,进而得到描述一个输入输出模型的数学表达式。

blueice1108 发表于 2013-10-4 12:01:29

skyxjh 发表于 2013-10-3 22:28 static/image/common/back.gif
为什么要把简单的问题复杂化呢?
所谓真值表就是把所有可能的输入和输出列到一张表里,再从表里的数据找 ...

我知道真值表的意义
但就这个问题 不知道真值表怎么列出来的
我想知道的是这个思维
http://bbs.21ic.com/blog-390105-106666.html

skyxjh 发表于 2013-10-4 20:47:52

blueice1108 发表于 2013-10-4 12:01 static/image/common/back.gif
我知道真值表的意义
但就这个问题 不知道真值表怎么列出来的
我想知道的是这个思维


你如果真的理解了真值表的含义就不会写不出该问题的真值表了。

blueice1108 发表于 2013-10-5 12:18:28

skyxjh 发表于 2013-10-4 20:47 static/image/common/back.gif
你如果真的理解了真值表的含义就不会写不出该问题的真值表了。

方便说明一下吗
谢谢

jhjkdz 发表于 2013-12-3 11:58:28

学习。。。

blueice1108 发表于 2013-12-11 13:48:17

machao 发表于 2013-9-27 19:40
给你一个参考,本站上有这个方法使用的帖子,你自己试一下,然后再深入的分析和理解它。

硬件工程师和纯软 ...

回个旧帖
如果我有10-12个按键以上
给个键有短按长按短按释放长按释放
组合键
应如何修改?

machao 发表于 2013-12-14 19:26:46

blueice1108 发表于 2013-12-11 13:48
回个旧帖
如果我有10-12个按键以上
给个键有短按长按短按释放长按释放


唉!?你是要代码的还是要真正学点东西?

blueice1108 发表于 2013-12-15 00:10:50

machao 发表于 2013-12-14 19:26
唉!?你是要代码的还是要真正学点东西?

谢谢 马老师
惭愧 我花了一下午终于看懂代码了…
自己还太菜 上面又一直给压力
页: [1]
查看完整版本: 状态机按键请教