搜索
bottom↓
楼主: zhuhanliang

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

  [复制链接]

出0入0汤圆

发表于 2011-10-23 22:14:20 | 显示全部楼层
先mark一下,慢慢看。

出0入0汤圆

发表于 2011-11-2 23:40:47 | 显示全部楼层
神奇,再看一遍,嘿嘿

出0入0汤圆

发表于 2011-11-4 09:30:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-6 17:44:35 | 显示全部楼层
学习...

出0入0汤圆

发表于 2011-11-6 18:57:49 | 显示全部楼层
回复【楼主位】zhuhanliang
-----------------------------------------------------------------------

mark、以后慢慢看

出0入0汤圆

发表于 2011-11-6 22:40:50 | 显示全部楼层
谢谢,慢慢看

出0入0汤圆

发表于 2011-11-7 00:03:45 | 显示全部楼层
楼主这个思路很不错,我已试了,但有变通,因我的不是用IO口的。很好用。可以简化很多手脚。

出0入0汤圆

发表于 2011-11-7 13:15:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-8 08:56:12 | 显示全部楼层
果然牛逼

出0入0汤圆

发表于 2011-11-11 17:18:54 | 显示全部楼层
回复【楼主位】zhuhanliang
-----------------------------------------------------------------------

不错,值得借鉴

出0入0汤圆

发表于 2011-11-13 00:14:57 | 显示全部楼层
这个方法的算法建议学习,但是实际应用中会有问题,在干扰严重的环境中会出现误动作,我以前用过此方法,干扰严重的情况下会有按键误动作,建议按键少的话是用1个2毫秒的计时器,按键多的话用个5毫秒的计时器,中断判断按键接口电平状态,连续40毫秒为防抖时间,判断到有效按键放入缓冲区,简单实用,主程序在缓冲区中取数。一家之言,仅供参考。

出0入0汤圆

发表于 2011-11-13 00:56:07 | 显示全部楼层
不错,有收获。

出0入0汤圆

发表于 2011-11-13 08:11:07 | 显示全部楼层
精炼按键程序。记号!

出0入8汤圆

发表于 2011-11-13 11:07:43 | 显示全部楼层
算法真的很不错,已用在程序中,简化了按键处理,使用效果很好,感谢楼主

出0入0汤圆

发表于 2011-11-13 15:02:23 | 显示全部楼层
程序的流程思路很是精炼,恐怕可靠性没有经典的方法可靠。如果和经典防抖延时结合起来,估计效果才会好些

出0入0汤圆

发表于 2011-11-14 15:09:16 | 显示全部楼层
思路很好!学习了

出0入0汤圆

发表于 2011-11-15 14:34:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-15 15:15:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-15 15:35:11 | 显示全部楼层
先马克再学习

出0入0汤圆

发表于 2011-11-15 15:47:14 | 显示全部楼层
不错 顶

出0入0汤圆

发表于 2011-11-17 15:24:56 | 显示全部楼层
试试看吧!

出0入0汤圆

发表于 2011-11-17 16:12:27 | 显示全部楼层
算法很巧妙!

出0入0汤圆

发表于 2011-11-17 20:17:37 | 显示全部楼层
mark,等会详细看

出0入0汤圆

发表于 2011-11-18 12:27:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-18 12:49:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-18 13:44:21 | 显示全部楼层
好贴留名

出0入0汤圆

发表于 2011-11-18 22:38:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-19 00:11:37 | 显示全部楼层
受教,很不错

出0入0汤圆

发表于 2011-11-19 09:03:28 | 显示全部楼层
回复【楼主位】zhuhanliang
-----------------------------------------------------------------------

很透彻,多谢!

出0入0汤圆

发表于 2011-11-19 11:25:50 | 显示全部楼层
好长~~mark,再细看...

出0入0汤圆

发表于 2011-11-19 14:53:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-19 19:20:21 | 显示全部楼层
学习一下。

出0入0汤圆

发表于 2011-11-19 21:17:44 | 显示全部楼层
好奇妙!

出0入0汤圆

发表于 2011-11-19 23:09:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-19 23:20:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-20 00:48:38 | 显示全部楼层
mark、以后慢慢看

出0入0汤圆

发表于 2011-11-21 15:15:11 | 显示全部楼层
神奇的按键

出0入0汤圆

发表于 2011-11-21 22:42:44 | 显示全部楼层
只差同时按下了、、

出0入0汤圆

发表于 2011-11-21 23:32:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-22 08:52:44 | 显示全部楼层
回复【21楼】hetao7241
-----------------------------------------------------------------------

楼主解释很详细,辛苦!

出0入0汤圆

发表于 2011-11-22 11:41:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-22 12:26:53 | 显示全部楼层
回复【5楼】hy317  
-----------------------------------------------------------------------
感谢分享

出0入0汤圆

发表于 2011-11-22 13:01:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-27 18:55:42 | 显示全部楼层
有空看看。

出0入0汤圆

发表于 2011-11-27 20:26:54 | 显示全部楼层
mark,这个现在看不来。

出0入0汤圆

发表于 2011-11-27 21:46:42 | 显示全部楼层
得细细品味一下,谢谢LZ分享!

出0入0汤圆

发表于 2011-11-27 21:48:52 | 显示全部楼层
必须MARK

出0入0汤圆

发表于 2011-11-27 21:53:16 | 显示全部楼层
嗯嗯 学习

出0入0汤圆

发表于 2011-11-28 10:15:20 | 显示全部楼层
昨天晚上粗略的看了一下感觉不错,今天早上来细细的读了一遍,发现LZ的消抖没看懂,LZ的程序是每隔20ms扫描一次按键,在执行完
KeyRead(); // 将每个子程序都扫描一遍
KeyProc();
Func1();
Funt2();
… …
这几个函数后,然后延时20ms,再这20ms的延时中,cpu还不是一直在等待这个延时的到来,在这期间cpu也没有做任何事情。还不是浪费20ms。
还有第一次扫描按键的状态为(第一次按下)
ReadData = 0x01;
Trg = 0x01;Trg只会在这个时候对应位的值为1,其它时候都为0
Cont = 0x01
20ms延时到了后,再去检测按键,假设抖动在10ms时就消失了,按键已经稳定。第二次去检测按键的结果将会是(在第一次的基础上检测第二次)
ReadData = 0x01;
Trg = 0x00;
Cont = 0x01;
这两次结果不一样啊???望解答!!!

出0入0汤圆

发表于 2011-11-28 20:53:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-28 22:23:45 | 显示全部楼层
make

出0入0汤圆

发表于 2011-11-28 22:45:15 | 显示全部楼层
好贴,mark

出0入0汤圆

发表于 2011-11-29 00:11:21 | 显示全部楼层
只得一溜,不错

出0入0汤圆

发表于 2011-11-29 21:17:40 | 显示全部楼层
想通了就简单了。

出0入0汤圆

发表于 2011-11-29 22:41:12 | 显示全部楼层
学习学习~~

出0入0汤圆

发表于 2011-12-2 15:55:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-2 20:09:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-3 00:05:55 | 显示全部楼层
这个看看神奇不神奇。

出0入0汤圆

发表于 2011-12-3 01:06:03 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-12-3 02:53:45 | 显示全部楼层
简单才是真

出0入0汤圆

发表于 2011-12-4 22:18:37 | 显示全部楼层
这···还是试了再说

出0入0汤圆

发表于 2011-12-4 22:41:58 | 显示全部楼层
标记

出0入30汤圆

发表于 2011-12-4 23:11:40 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-12-4 23:59:53 | 显示全部楼层
厉害。受教了

出0入0汤圆

发表于 2011-12-5 00:09:26 | 显示全部楼层
学习了,谢谢你
回复【楼主位】zhuhanliang  
-----------------------------------------------------------------------

出0入0汤圆

发表于 2011-12-5 09:28:39 | 显示全部楼层
标记一下,这个做法不错~期待用到项目中~

出0入0汤圆

发表于 2011-12-5 09:45:12 | 显示全部楼层
哈哈哈

出0入0汤圆

发表于 2011-12-5 09:59:03 | 显示全部楼层
标记一下,这个做法不错~期待用到项目中~

出0入0汤圆

发表于 2011-12-5 13:22:47 | 显示全部楼层
mark,再慢慢看

出0入0汤圆

发表于 2011-12-5 14:54:31 | 显示全部楼层
吗课

出0入0汤圆

发表于 2011-12-6 16:32:44 | 显示全部楼层
好思路!MARK!!!

出0入0汤圆

发表于 2011-12-8 11:45:05 | 显示全部楼层
长按有点不好使。

出0入0汤圆

发表于 2011-12-9 15:21:22 | 显示全部楼层
这个以前看过了,确实挺好。

出0入0汤圆

发表于 2011-12-22 12:34:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-22 16:50:32 | 显示全部楼层
标记先

出0入0汤圆

发表于 2011-12-22 21:40:40 | 显示全部楼层
mark//

出0入0汤圆

发表于 2011-12-22 21:55:03 | 显示全部楼层
回复【679楼】pisces_zk
昨天晚上粗略的看了一下感觉不错,今天早上来细细的读了一遍,发现lz的消抖没看懂,lz的程序是每隔20ms扫描一次按键,在执行完
keyread(); // 将每个子程序都扫描一遍  
keyproc();  
func1();  
funt2();  
… …
这几个函数后,然后延时20ms,再这20ms的延时中,cpu还不是一直在等待这个延时的到来,在这期间cpu也没有做任何事情。还不是浪费20ms。
还有第一次扫描按键的状态为(第一次按下)
readdata = 0x01;
trg = 0x01;trg只会在这个时候对应位的值为1,其它时候都为0  
cont = 0x01
20ms延时到了后,再去检测按键,假设抖动在10ms时就消失了,按键已经稳定。第二次去检测按键的结果将会是(在第一次的基础上检测第二次)
readdata = 0x01;  
trg = 0x00; ......
-----------------------------------------------------------------------

我的理解是这样的,既然延时20ms,如果在10ms出现的抖动,它不管,因为延时还没到,它肯定不会去检测,它只会以20ms时检测为准……

出0入0汤圆

发表于 2011-12-22 22:19:10 | 显示全部楼层
解释比程序还复杂

出0入0汤圆

发表于 2011-12-22 22:59:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-23 17:00:54 | 显示全部楼层
这个好巧妙..

出0入0汤圆

发表于 2011-12-24 13:25:18 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-12-24 14:16:56 | 显示全部楼层
前面确实很经典,但是去抖这个过程,好像不是按键短按触发,而是按到就工作,不管时间长短,然后等10ms在响应按键,但是还是很经典。

出0入0汤圆

发表于 2011-12-24 15:09:23 | 显示全部楼层

出0入0汤圆

发表于 2011-12-24 17:46:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-24 22:20:41 | 显示全部楼层
回头看看

出0入0汤圆

发表于 2011-12-25 09:01:26 | 显示全部楼层
mark‘

出0入0汤圆

发表于 2011-12-25 10:51:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-26 19:01:19 | 显示全部楼层
谢谢楼主

出0入0汤圆

发表于 2012-1-1 07:44:12 | 显示全部楼层
的仔细看看

出0入0汤圆

发表于 2012-2-9 18:08:48 | 显示全部楼层
好东西,学习

出0入0汤圆

发表于 2012-2-9 20:11:21 | 显示全部楼层

出0入0汤圆

发表于 2012-2-9 23:44:43 | 显示全部楼层
不需要性能的时候可读性尤其重要....
GPIOB 高8 低8  8X8扫键盘....


const char keyboard_array[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
char keyboard_pressed = 0;
char keyboard_value_x;
char keyboard_value_y;

void keyboard_delay(int n)
{
    OSTimeDly(n);       
}

void keyboard_send(char x, char y, char status)
{

}

void keyboard_scan(void)
{
    int i;
    int j;
    unsigned short int value;
    GPIO_Write(GPIOB, 0x00ff);    //写数据
    value = GPIO_ReadInputData(GPIOB); //读端口
    if ((value >> 8) != 0)
    {
        keyboard_delay(50);
        value = GPIO_ReadInputData(GPIOB); //读端口
        if ((value >> 8) != 0)
        {
            for(i = 0; i < 8; i++)
            {
               GPIO_Write(GPIOB, keyboard_array);
               value = GPIO_ReadInputData(GPIOB); //读端口
               for(j = 0; j < 8; j++)
               {
                  if (((value >> 8) == keyboard_array[j]) && (keyboard_pressed == 0))
                  {
                       keyboard_value_x = i;
                      keyboard_value_y = j;
                      keyboard_pressed = 1;
                      keyboard_send(keyboard_value_x, keyboard_value_y, keyboard_pressed);
                  }
                }
            }
         }
     }
     else
     {
        keyboard_delay(50);
        if ((value >> 8) == 0)
        {
            if (keyboard_pressed == 1)
            {
                keyboard_pressed = 0;
                keyboard_send(keyboard_value_x, keyboard_value_y, keyboard_pressed);
             }
        }
      }

}

出0入0汤圆

发表于 2012-2-10 13:55:47 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-2-10 13:59:22 | 显示全部楼层
謝謝楼主分享,先回复,再慢慢品尝其中的奥妙

出0入0汤圆

发表于 2012-2-10 14:13:34 | 显示全部楼层
回复【724楼】a276841134  小毅
謝謝楼主分享,先回复,再慢慢品尝其中的奥妙
-----------------------------------------------------------------------
  同感。

出0入0汤圆

发表于 2012-2-11 10:32:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-11 11:51:18 | 显示全部楼层
cool!!!

出0入0汤圆

发表于 2012-2-11 13:30:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-12 02:55:19 | 显示全部楼层
mark

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-19 22:28

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

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