搜索
bottom↓
回复: 18

状态机按键请教

[复制链接]

出0入0汤圆

发表于 2013-9-27 19:40:30 | 显示全部楼层 |阅读模式
状态机按键请教
不知道马老师对这部分有没有了解
谢谢
http://www.amobbs.com/thread-5551688-1-1.html

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-9-27 22:03:31 | 显示全部楼层
能把功能要求描述的再明确点吗?

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

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

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

出0入0汤圆

发表于 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_mask  0x0f                    //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无按键  

         }

    }

}

出0入0汤圆

发表于 2013-9-29 15:37:28 | 显示全部楼层
这个 好说,我也有一个相关的帖子。

出0入0汤圆

 楼主| 发表于 2013-9-30 13:05:31 | 显示全部楼层
感谢大家的回答
我先照帖子尝试一下

出0入0汤圆

发表于 2013-9-30 23:27:26 | 显示全部楼层
马老师的代码是只检测按键动作的下降沿

出0入0汤圆

发表于 2013-9-30 23:33:24 | 显示全部楼层
如果要检测按键动作的上升沿,修改key_return = (key_new ^ key_old)  &  key_new;  为key_return = (key_new ^ key_old)  &  key_old;  

出0入0汤圆

 楼主| 发表于 2013-10-2 15:57:25 | 显示全部楼层
skyxjh 发表于 2013-9-30 23:33
如果要检测按键动作的上升沿,修改key_return = (key_new ^ key_old)  &  key_new;  为key_return = (key_n ...

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

出0入0汤圆

发表于 2013-10-2 23:56:09 | 显示全部楼层
key_new^key_old是检测变化,两次检测值有变化就为真。这个值再与上一次检测的值key_old相与,也就是说只有在上次检测到按键按下时返回值才为真,所以检测的是按键释放时刻,即上升沿;同理与当前检测的值key_new相与,只有在当前检测到按键按下时返回值才为真,所以检测的是按键按下时刻,即下降沿。

出0入0汤圆

发表于 2013-10-3 13:57:08 | 显示全部楼层
针对LZ的要求,该段代码应该是比较简单的实现方法,但并不是通用的方法。针对不同的系统要求还应该作修改和调整,所以关键在于掌握和理解最基本的思路和方法。

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

出0入0汤圆

 楼主| 发表于 2013-10-3 13:58:31 | 显示全部楼层
skyxjh 发表于 2013-10-2 23:56
key_new^key_old是检测变化,两次检测值有变化就为真。这个值再与上一次检测的值key_old相与,也就是说只有 ...

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

出0入0汤圆

发表于 2013-10-3 22:28:04 | 显示全部楼层
blueice1108 发表于 2013-10-3 13:58
http://bbs.21ic.com/blog-390105-106583.html
http://bbs.21ic.com/blog-390105-106666.html
找到两篇文 ...

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

出0入0汤圆

 楼主| 发表于 2013-10-4 12:01:29 | 显示全部楼层
skyxjh 发表于 2013-10-3 22:28
为什么要把简单的问题复杂化呢?
所谓真值表就是把所有可能的输入和输出列到一张表里,再从表里的数据找 ...

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

出0入0汤圆

发表于 2013-10-4 20:47:52 | 显示全部楼层
blueice1108 发表于 2013-10-4 12:01
我知道真值表的意义
但就这个问题 不知道真值表怎么列出来的
我想知道的是这个思维

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

出0入0汤圆

 楼主| 发表于 2013-10-5 12:18:28 | 显示全部楼层
skyxjh 发表于 2013-10-4 20:47
你如果真的理解了真值表的含义就不会写不出该问题的真值表了。

方便说明一下吗
谢谢

出0入0汤圆

发表于 2013-12-3 11:58:28 | 显示全部楼层
学习。。。

出0入0汤圆

 楼主| 发表于 2013-12-11 13:48:17 | 显示全部楼层
machao 发表于 2013-9-27 19:40
给你一个参考,本站上有这个方法使用的帖子,你自己试一下,然后再深入的分析和理解它。

硬件工程师和纯软 ...

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

出0入0汤圆

发表于 2013-12-14 19:26:46 | 显示全部楼层
blueice1108 发表于 2013-12-11 13:48
回个旧帖
如果我有10-12个按键以上
给个键有短按长按短按释放长按释放

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

出0入0汤圆

 楼主| 发表于 2013-12-15 00:10:50 | 显示全部楼层
machao 发表于 2013-12-14 19:26
唉!?你是要代码的还是要真正学点东西?

谢谢 马老师
惭愧 我花了一下午终于看懂代码了…
自己还太菜 上面又一直给压力
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 10:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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