状态机按键请教
状态机按键请教不知道马老师对这部分有没有了解
谢谢
http://www.amobbs.com/thread-5551688-1-1.html 能把功能要求描述的再明确点吗?
功能描述
使用POLLING(20MS) ==》这个作为消抖时间可以
按下KEY1按键释放后 传送A
按下KEY2按键释放后 传送B ==》为什么要按键释放后,确认按键按下传送可以吗?
当分开按时没有问题
但当按很快时 有时只会传送一个
或两个都不动作 ==》关键是这里,你的意思是KEY1传送A、key2传送B的功能都是唯一的,如果2个都按下了,传送A和B都要发生(不是发生第3个动作)
如何确保按键不会LOSS
扫描频率大概多少
有例子可以参考吗
谢谢 给你一个参考,本站上有这个方法使用的帖子,你自己试一下,然后再深入的分析和理解它。
硬件工程师和纯软件出身的工程师处理方法和思路不同,硬件工程师直接,简单。
假定你有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无按键
}
}
} 这个 好说,我也有一个相关的帖子。 感谢大家的回答
我先照帖子尝试一下
马老师的代码是只检测按键动作的下降沿 如果要检测按键动作的上升沿,修改key_return = (key_new ^ key_old)&key_new;为key_return = (key_new ^ key_old)&key_old; skyxjh 发表于 2013-9-30 23:33 static/image/common/back.gif
如果要检测按键动作的上升沿,修改key_return = (key_new ^ key_old)&key_new;为key_return = (key_n ...
請問如何由上升下降檢測求出式子? key_new^key_old是检测变化,两次检测值有变化就为真。这个值再与上一次检测的值key_old相与,也就是说只有在上次检测到按键按下时返回值才为真,所以检测的是按键释放时刻,即上升沿;同理与当前检测的值key_new相与,只有在当前检测到按键按下时返回值才为真,所以检测的是按键按下时刻,即下降沿。 针对LZ的要求,该段代码应该是比较简单的实现方法,但并不是通用的方法。针对不同的系统要求还应该作修改和调整,所以关键在于掌握和理解最基本的思路和方法。
感谢skyxjh网友给出检测上升沿动作的变化,其实只要数字逻辑基础好的话,工程师们在此基础上应该知道如何变化(本人犯严重的职业病,原想把检测上升沿动作作为一个思考题,后来怕被拍砖没敢写)。另外对于常规的按键应用,我喜欢按下就动作,这样操作者看到按键的反映后就马上释放了。如果是检测到释放再作动作,容易造成操作者一直按着键不放。 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
找到两篇文章
能说下如果没程序的情况下真值表怎写出吗
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
找到两篇文 ...
为什么要把简单的问题复杂化呢?
所谓真值表就是把所有可能的输入和输出列到一张表里,再从表里的数据找规律,进而得到描述一个输入输出模型的数学表达式。 skyxjh 发表于 2013-10-3 22:28 static/image/common/back.gif
为什么要把简单的问题复杂化呢?
所谓真值表就是把所有可能的输入和输出列到一张表里,再从表里的数据找 ...
我知道真值表的意义
但就这个问题 不知道真值表怎么列出来的
我想知道的是这个思维
http://bbs.21ic.com/blog-390105-106666.html
blueice1108 发表于 2013-10-4 12:01 static/image/common/back.gif
我知道真值表的意义
但就这个问题 不知道真值表怎么列出来的
我想知道的是这个思维
你如果真的理解了真值表的含义就不会写不出该问题的真值表了。 skyxjh 发表于 2013-10-4 20:47 static/image/common/back.gif
你如果真的理解了真值表的含义就不会写不出该问题的真值表了。
方便说明一下吗
谢谢
学习。。。 machao 发表于 2013-9-27 19:40
给你一个参考,本站上有这个方法使用的帖子,你自己试一下,然后再深入的分析和理解它。
硬件工程师和纯软 ...
回个旧帖
如果我有10-12个按键以上
给个键有短按长按短按释放长按释放
组合键
应如何修改?
blueice1108 发表于 2013-12-11 13:48
回个旧帖
如果我有10-12个按键以上
给个键有短按长按短按释放长按释放
唉!?你是要代码的还是要真正学点东西? machao 发表于 2013-12-14 19:26
唉!?你是要代码的还是要真正学点东西?
谢谢 马老师
惭愧 我花了一下午终于看懂代码了…
自己还太菜 上面又一直给压力
页:
[1]