搜索
bottom↓
楼主: zhuhanliang

新型的按键扫描程序,仅三行程序

  [复制链接]
(314065410)

出0入0汤圆

发表于 2010-10-11 00:46:45 | 显示全部楼层
值得学习
(314038436)

出0入0汤圆

发表于 2010-10-11 08:16:19 | 显示全部楼层
good
(314038135)

出0入0汤圆

发表于 2010-10-11 08:21:20 | 显示全部楼层
经典按键处理
(314027974)

出0入0汤圆

发表于 2010-10-11 11:10:41 | 显示全部楼层
好象这里都发个两次了。
(313949725)

出0入0汤圆

发表于 2010-10-12 08:54:50 | 显示全部楼层
mark
(313807003)

出0入0汤圆

发表于 2010-10-14 00:33:32 | 显示全部楼层
mark
(313775932)

出0入0汤圆

发表于 2010-10-14 09:11:23 | 显示全部楼层
很好,谢谢!做个记号。
(313773768)

出0入0汤圆

发表于 2010-10-14 09:47:27 | 显示全部楼层
mark,以后再细看
(313773696)

出0入0汤圆

发表于 2010-10-14 09:48:39 | 显示全部楼层
不错,以后用得着,MARK
(313773207)

出0入0汤圆

发表于 2010-10-14 09:56:48 | 显示全部楼层
MARK
(313773020)

出0入0汤圆

发表于 2010-10-14 09:59:55 | 显示全部楼层
MARK先啊
(313771593)

出0入0汤圆

发表于 2010-10-14 10:23:42 | 显示全部楼层
把一件简单的事情做成这样,做绝了。精品!!
(313116913)

出0入0汤圆

发表于 2010-10-22 00:15:02 | 显示全部楼层
mark
(313115636)

出0入0汤圆

发表于 2010-10-22 00:36:19 | 显示全部楼层
没看完,看了前面部分,似乎和以前用汇编写51的时候用的算法类似。
(313081915)

出0入0汤圆

发表于 2010-10-22 09:58:20 | 显示全部楼层
有点长,没看完,但也是很精典的,保存了
(313061481)

出0入0汤圆

发表于 2010-10-22 15:38:54 | 显示全部楼层
Mark
(313060852)

出0入0汤圆

发表于 2010-10-22 15:49:23 | 显示全部楼层
mark
(313058371)

出0入0汤圆

发表于 2010-10-22 16:30:44 | 显示全部楼层
mark
(313047691)

出0入0汤圆

发表于 2010-10-22 19:28:44 | 显示全部楼层
mark
(313045451)

出0入0汤圆

发表于 2010-10-22 20:06:04 | 显示全部楼层
mark
(313033460)

出0入0汤圆

发表于 2010-10-22 23:25:55 | 显示全部楼层
确实经典!~
(313032335)

出0入0汤圆

发表于 2010-10-22 23:44:40 | 显示全部楼层
mark
(312998171)

出0入0汤圆

发表于 2010-10-23 09:14:04 | 显示全部楼层
想法很经典 学习了
按键扫描太简单了  但是很少有人去仔细这么研究  此做法实在是精妙 楼主值得大家好好学习
(312997507)

出0入8汤圆

发表于 2010-10-23 09:25:08 | 显示全部楼层
照楼主算法,我作了实际应用,确实很好,惊叹这算法的精妙!! 感谢楼主 zhuhanliang
(312995727)

出0入0汤圆

发表于 2010-10-23 09:54:48 | 显示全部楼层
学习学习
(312984017)

出0入0汤圆

发表于 2010-10-23 13:09:58 | 显示全部楼层
记号,稍后认真品尝,谢谢。。
(312982672)

出0入0汤圆

发表于 2010-10-23 13:32:23 | 显示全部楼层
记号下,回头学习!
(312956435)

出0入0汤圆

发表于 2010-10-23 20:49:40 | 显示全部楼层
高人,学习了!
(312951776)

出0入0汤圆

发表于 2010-10-23 22:07:19 | 显示全部楼层
先记下,学习学习!
(312946555)

出0入0汤圆

发表于 2010-10-23 23:34:20 | 显示全部楼层
mark一下,仔细看看~~
(312918719)

出0入0汤圆

发表于 2010-10-24 07:18:16 | 显示全部楼层
不错,
(312911917)

出0入0汤圆

发表于 2010-10-24 09:11:38 | 显示全部楼层
记号
(312911213)

出0入0汤圆

发表于 2010-10-24 09:23:22 | 显示全部楼层
和维纳的一样
(312879107)

出0入0汤圆

发表于 2010-10-24 18:18:28 | 显示全部楼层
呵呵,确实能体现C语言的精妙,感觉自己以前都是形而上学,痛定思痛啊!
(312876277)

出0入0汤圆

发表于 2010-10-24 19:05:38 | 显示全部楼层
此贴必须顶!
(312813783)

出0入0汤圆

发表于 2010-10-25 12:27:12 | 显示全部楼层
顶!
(312808908)

出0入0汤圆

发表于 2010-10-25 13:48:27 | 显示全部楼层
mark
(312805496)

出0入0汤圆

发表于 2010-10-25 14:45:19 | 显示全部楼层
不错
(312708166)

出0入0汤圆

发表于 2010-10-26 17:47:29 | 显示全部楼层
谢谢了
(312687628)

出0入0汤圆

发表于 2010-10-26 23:29:47 | 显示全部楼层
记号
(312257525)

出0入0汤圆

发表于 2010-10-31 22:58:10 | 显示全部楼层
mark
(312255431)

出0入0汤圆

发表于 2010-10-31 23:33:04 | 显示全部楼层
mark
(312218384)

出0入0汤圆

发表于 2010-11-1 09:50:31 | 显示全部楼层
mark。顶19楼,找到那个福利包了。
(312218076)

出0入0汤圆

发表于 2010-11-1 09:55:39 | 显示全部楼层
此贴要顶~~~~
(312201536)

出0入0汤圆

发表于 2010-11-1 14:31:19 | 显示全部楼层
标记,回头细读。
(312192845)

出0入0汤圆

发表于 2010-11-1 16:56:10 | 显示全部楼层
不错,学习了。
(312138365)

出0入0汤圆

发表于 2010-11-2 08:04:10 | 显示全部楼层
很久以前采用过同样的方法,只是不是C语言,是用汇编做的。
(312131999)

出0入0汤圆

发表于 2010-11-2 09:50:16 | 显示全部楼层
学习了!
(312129522)

出0入0汤圆

发表于 2010-11-2 10:31:33 | 显示全部楼层
不错
(312125357)

出0入0汤圆

发表于 2010-11-2 11:40:58 | 显示全部楼层
思路很不错,程序很简单
(312124901)

出0入0汤圆

发表于 2010-11-2 11:48:34 | 显示全部楼层
不错,学习了。
(312116540)

出0入0汤圆

发表于 2010-11-2 14:07:55 | 显示全部楼层
不错
值的研究
(312116094)

出0入0汤圆

发表于 2010-11-2 14:15:21 | 显示全部楼层
mark
(312108735)

出0入0汤圆

发表于 2010-11-2 16:18:00 | 显示全部楼层
真不错啊,mark
(312108067)

出0入0汤圆

发表于 2010-11-2 16:29:08 | 显示全部楼层
学习了!!!!
(312098013)

出0入0汤圆

发表于 2010-11-2 19:16:42 | 显示全部楼层
做个记号
(312097110)

出0入0汤圆

发表于 2010-11-2 19:31:45 | 显示全部楼层
要消化一下
(312087814)

出0入0汤圆

发表于 2010-11-2 22:06:41 | 显示全部楼层
做个记号,有空学习学习!
(312085832)

出0入0汤圆

发表于 2010-11-2 22:39:43 | 显示全部楼层
精简。
(312079415)

出0入0汤圆

发表于 2010-11-3 00:26:40 | 显示全部楼层
mark
(312014461)

出0入0汤圆

发表于 2010-11-3 18:29:14 | 显示全部楼层
mark
(311960329)

出0入0汤圆

发表于 2010-11-4 09:31:26 | 显示全部楼层
mark
(311935696)

出0入0汤圆

发表于 2010-11-4 16:21:59 | 显示全部楼层
为了这个算法,mark
(311929267)

出0入0汤圆

发表于 2010-11-4 18:09:08 | 显示全部楼层
Very Good!
(311925564)

出0入0汤圆

发表于 2010-11-4 19:10:51 | 显示全部楼层
mark
(311921889)

出0入0汤圆

发表于 2010-11-4 20:12:06 | 显示全部楼层
mark
(311920991)

出0入0汤圆

发表于 2010-11-4 20:27:04 | 显示全部楼层
GOOD
学习了!
(311920212)

出0入0汤圆

发表于 2010-11-4 20:40:03 | 显示全部楼层
不错,很简洁。
(311917135)

出0入0汤圆

发表于 2010-11-4 21:31:20 | 显示全部楼层
看了就要回帖,学习中。。。
(311917107)

出0入0汤圆

发表于 2010-11-4 21:31:48 | 显示全部楼层
MAEK
(311913087)

出0入0汤圆

发表于 2010-11-4 22:38:48 | 显示全部楼层
mark
(311905619)

出0入0汤圆

发表于 2010-11-5 00:43:16 | 显示全部楼层
果然深入,好好学习!!
(311869610)

出0入0汤圆

发表于 2010-11-5 10:43:25 | 显示全部楼层
不错啊。很实用。以后就用这种算法。
(311867518)

出0入0汤圆

发表于 2010-11-5 11:18:17 | 显示全部楼层
学习一下!!!
(311867399)

出0入0汤圆

发表于 2010-11-5 11:20:16 | 显示全部楼层
mARK
(311866980)

出0入0汤圆

发表于 2010-11-5 11:27:15 | 显示全部楼层
mark....
(311861236)

出0入0汤圆

发表于 2010-11-5 13:02:59 | 显示全部楼层
不错,感谢分享
(311856750)

出0入0汤圆

发表于 2010-11-5 14:17:45 | 显示全部楼层
MARK
(311856110)

出0入0汤圆

发表于 2010-11-5 14:28:25 | 显示全部楼层
谢谢分享
(311853055)

出0入0汤圆

发表于 2010-11-5 15:19:20 | 显示全部楼层
不错,学习
(311848579)

出0入0汤圆

发表于 2010-11-5 16:33:56 | 显示全部楼层
思路很新颖,不错!大家可以考虑一下同时按下几个键如何处理?怎样处理组合键等等!
(311825560)

出0入0汤圆

发表于 2010-11-5 22:57:35 | 显示全部楼层
记号
(311699697)

出0入0汤圆

发表于 2010-11-7 09:55:18 | 显示全部楼层
先顶上,但是,如果第一次就长按的话,会不会出现误判?第一次按键,不论长按或者短按,它都会按照短按来处理吧,只是下一个扫描来到之后才会判别出长或者短按。不知道理解的对不对呢?请大家赐教。谢谢
(311692156)

出0入0汤圆

发表于 2010-11-7 12:00:59 | 显示全部楼层
回去试试
(311682993)

出0入0汤圆

发表于 2010-11-7 14:33:42 | 显示全部楼层
早就有人转了。
(311681794)

出0入0汤圆

发表于 2010-11-7 14:53:41 | 显示全部楼层
mark    好东西!!!!
(311328071)

出0入0汤圆

发表于 2010-11-11 17:09:04 | 显示全部楼层
留个记号,有空分析!
(311325789)

出0入0汤圆

发表于 2010-11-11 17:47:06 | 显示全部楼层
值得学习!
(311248224)

出0入0汤圆

发表于 2010-11-12 15:19:51 | 显示全部楼层
mark
(311230699)

出0入0汤圆

发表于 2010-11-12 20:11:56 | 显示全部楼层
我十年前就用过类似思路
(311227749)

出0入0汤圆

发表于 2010-11-12 21:01:06 | 显示全部楼层
分析的不错,但Trg只记录了按键动作的的下降沿
(311222467)

出0入0汤圆

发表于 2010-11-12 22:29:08 | 显示全部楼层
you have a good concept but the code isn't modular enough.

here is what I would recommend:

==========code=============
#include <regx51.h>
#include "gpio.h"

//hardware configuration
#define KEY_PORT                        P2
#define KEY_PORT_IN                        P2
#define KEY_DDR                                P2
#define KEY0                                (1<<3)                                        //key0 on key_port.3
#define KEY1                                (1<<3)                                        //key1 on key_port.3
#define KEY2                                (1<<3)                                        //key2 on key_port.3
#define KEY_LOOP                        50                                                //number of loops for debouncing

#define LED_PORT                        KEY_PORT
#define LED_DDR                                KEY_DDR
#define LED0                                (1<<0)                                        //ledo on key_port.0
#define LED1                                (1<<1)                                        //led1 on key_port.1
#define LED2                                (LED0 | LED1)                        //led2 = led0+led1
//end hardware configuration

unsigned char key_read(unsigned char keys) {
        unsigned char tmp;                                                                //temp variable
        static unsigned char keys_prev=0;                                //read out from the last call

        tmp=keys_prev;                                                                        //save keys_prev
        keys_prev=IO_GET(KEY_PORT_IN, keys);                        //read the button, active high
        return (tmp ^ keys_prev);                                                //1) returns bits that have changed
        //return (tmp ^ keys_prev) & tmp;                                //2) return s bits that have changed from high to low / falling edge
        //return (tmp ^ keys_prev) & keys_prev;                        //3) returns bits that have changed from low to high / rising edge
}

unsigned char key_read_sm(unsigned char keys) {
        unsigned char tmp;
        unsigned short loop=KEY_LOOP;

        tmp=key_read(keys);                                                                                //read the keys
        if (tmp)                                                                                                //key has been pressed
                while (loop--) if (key_read(keys)) return 0x00;
        return tmp;                                                                                                //loop exhausted -> keys did stablize
}

void mcu_init(void) {
        IO_IN(KEY_DDR, KEY0 | KEY1 | KEY2);                                                //key0/key1/key2 as input

        IO_CLR(LED_PORT, LED2);                                                                        //led2 cleared
        IO_OUT(LED_DDR, LED2);                                                                        //led2 as output
}

int main(void) {
        mcu_init();                                                                                                //reset the mcu
        while (1) {
                if (key_read_sm(KEY0)) IO_FLP(LED_PORT, LED0);                //if key0 is pressed, flip led0
                else IO_FLP(LED_PORT, LED1);                                                //flip led1
        }
}
=============end code=============

it utilizes two routines: key_read() that returns 1 if a key has seen its level changed (by using the different return statements in key_read(), you can read level changes, or falling edges or rising edges), and key_read_sm() that returns a valid key read only if the key remains stabilized over a given number of cycles (defined by KEY_LOOP).

no global variables, all you need is those two routines.

see the simulation below:


(原文件名:26. key debouncing.gif)

KEY0 simulates a bouncing key press, as in the time period highlighted by red traces, between 0.5ms and 1.3ms. it stabilizes after that.

LED0 is the debounced output: it stays low while KEY0 is being stabilized and then stay stabilized during the next KEY_LOOP (=50) consecutive reads before it is considered a valid read.

the code is entirely C so it is portable to any mcu that has a c compiler.

you can customize the code to your application by tailoring the hardware configuration section, at the beginning at the code.

hope it helps.
(311221678)

出0入0汤圆

发表于 2010-11-12 22:42:17 | 显示全部楼层
好思路!
(311217354)

出0入0汤圆

发表于 2010-11-12 23:54:21 | 显示全部楼层
(311215496)

出0入0汤圆

发表于 2010-11-13 00:25:19 | 显示全部楼层
mark
(310620809)

出0入0汤圆

发表于 2010-11-19 21:36:46 | 显示全部楼层
学习!谢谢
(310615994)

出0入0汤圆

发表于 2010-11-19 22:57:01 | 显示全部楼层
mark
(310529453)

出0入0汤圆

发表于 2010-11-20 22:59:22 | 显示全部楼层
回复【楼主位】zhuhanliang
新型的按键扫描程序
不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为c语言强大的可移植性。
同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。
对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。因为这是实际项目中总结出来的经验,学校里面学不到的东西。
以下假设你懂c语言,因为纯粹的c语言描述,所以和处理器平台无关,你可以在mcs-51,avr,pic,甚至是arm平台上面测试这个程序性能。当然,我自己也是在多个项目用过,效果非常好的。
好了,工程人员的习惯,废话就应该少说,开始吧。以下我以a......
-----------------------------------------------------------------------

这个需要有定时(按键间隔)调用函数,完成去抖,区别单次和长按,好的思路。我想矩阵键盘也可以处理,只有键盘返回的码是唯一的,把PINB 换成 getkey之类的函数。我想这个可能用来分析脉冲信号,比如红外遥控信号
(310460484)

出0入0汤圆

发表于 2010-11-21 18:08:51 | 显示全部楼层
mark!
(310458568)

出0入0汤圆

发表于 2010-11-21 18:40:47 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-9-23 01:10

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

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