搜索
bottom↓
回复: 102

1个io=2键,2个io=8键,3个io=26键,超级键盘扫描大法,只用两只电阻和若干二极管 【恢复】

  [复制链接]

出0入0汤圆

发表于 2008-9-29 17:47:25 | 显示全部楼层 |阅读模式
以下所有文字、表格、图片、文件、程序等除特别声明以外均为h2feo4原创

本次讨论的内容,用单片机通用IO+有限个电阻和二极管实现扫描键盘

项目名称:Super_Scan_Key

除表3第二列第2-8行以外的所有数据和公式均由h2feo4独立推导或计算,h2feo4尽力保证其正确性,但不对可能的错误和使用其所造成的后果负责,请勿用于可靠性要求较高的场合

h2feo4并没有对下文中的所有键盘都进行验证,不能保证其正确性

AVR型键盘所使用的1M下拉电阻可能会导致系统可靠性降低,如果工作不稳定请酌情降低该电阻阻值,插入延时,增加屏蔽措施,或者改用51型键盘。

使用慢扫型键盘的系统电源电压应高于所使用二极管压降的3倍,否则可能导致工作不稳定

强烈推荐使用下面各种键盘的系统使用软件消抖

下述键盘只适合在每次只按下一个键的用途,同时按下多个键将可能无法得到正确的结果

标题所指的是下述AVR型慢扫方式



下面声明本次要使用的词语

51型:  IO口具有弱上拉,强下拉两种能力的单片机,没有弱上拉的单片机在外加上拉电阻后也符合本条

AVR型: IO口具有强上拉,强下拉,弱上拉,高阻四种能力的单片机

快扫:  扫描整个键盘所需的IO周期数可以表达为N的有限次多项式(本例中是1次多项式)

慢扫:  扫描整个键盘所需的IO周期数不能表达为N的有限次多项式(本例中是指数式)

N:     用于扫描键盘的IO数量(N>0)

Keys:   可以扫描的按键数量

Diodes: 需要的二极管数量

Bits:   扫描时返回的信息位数

Cycles: 扫描一个键盘周期所需的IO周期数



下面介绍本例所有附件命名规则

XXX_ZN.FFF

XXX: 类型,51或者AVR

Z:   快扫(F),或者慢扫(S),无此位表示快扫与慢扫相同,作为快扫处理

N:   IO数量

FFF: 文件类型

例:51_S3.SchDoc表示51型慢扫,3个IO,电路原理图

例:AVR_N.jpg表示AVR型快扫,多种IO,图片



下面介绍4种类型键盘扫描方式

AVR型快扫,AVR型慢扫(N>2),51型快扫(N>1),51型慢扫(N>2)

慢扫方式在N=1和N=2时与快扫方式完全相同

51型在N=1时不属于扫描键盘,不在本文讨论范围内

所有公式均指在N>1时的情况





表1:AVR型快扫性能:(表中N=3的部分借鉴和改进了http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1529268&bbs_page_no=1&bbs_id=1006) (原文件名:AVR_FN.JPG) 

【勘误】表1中N=3时 Keys应该为23,而表中错写为19

【勘误】表1中N=1时 Cycles应该为2,而表中错写为3





表2:AVR型慢扫性能: (原文件名:AVR_SN.JPG) 





表3:51型快扫性能:(非原创,参见http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=991644&bbs_page_no=3&bbs_id=1006) (原文件名:51_FN.JPG) 





表4:51型慢扫性能: (原文件名:51_SN.JPG) 





 (原文件名:AVR_1.JPG) 





 (原文件名:AVR_2.JPG) 





 (原文件名:51_2.JPG) 





 (原文件名:AVR_F3.JPG) 





 (原文件名:AVR_S3.JPG) 





 (原文件名:51_F3.JPG) 





 (原文件名:51_S3.JPG) 



N<4 的所有电路图ourdev_436101.rar(文件大小:56K) (原文件名:Super_Scan_Key.rar) 



=======================================================================

AVR_1的测试程序:

本程序中预定义段非h2feo4原创

/*程序开始*/

/**********************************************/

/* Super_Scan_Key_A1C1                        */

/* ATmaga16-16PI @ 1MHz                       */

/* 2008-09-29                                 */

/* h2feo4                                     */

/**********************************************/



//================= include ==================//

// WinAVR-20060421



#include <avr/io.h>  





//================== define ==================//



#define set_bit(io, bit) (io |= (1<<bit) ) 

#define clr_bit(io, bit) (io &= ~(1<<bit) )

#define get_bit(pin, bit) (pin & (1<<bit) )



void delay_1ms(void)                 //1ms延时函数 

{ 

  unsigned int i; 

  for (i=0;i<1140;i++); 

} 





//=================== init ===================//



//=================== main ===================//



void main(void) 

{ 



  DDRC = 0xff;



  while(1) 

  {    



  clr_bit(DDRC, 0);

  clr_bit(PORTC, 0);

  if (get_bit(PINC, 0) == 1)

  {

    set_bit(PORTC, 3);

  }

  else

  {

    clr_bit(PORTC, 3);

  }

  delay_1ms();



  set_bit(PORTC, 0);

  if (get_bit(PINC, 0) == 0)

  {

    set_bit(PORTC, 2);

  }

  else

  {

    clr_bit(PORTC, 2);

  }

  delay_1ms();



  } 



} 



/*程序结束*/

本贴被 h2feo4 编辑过,最后修改时间:2008-09-29,20:06:37.

出0入0汤圆

发表于 2008-9-29 17:54:13 | 显示全部楼层
先看看,好像不错,大家一起讨论一下

出0入0汤圆

 楼主| 发表于 2008-9-29 18:04:39 | 显示全部楼层
再追加一个





 (原文件名:51_S4.JPG) 



电路图ourdev_436113.rar(文件大小:25K) (原文件名:51_S4.rar) 

出0入0汤圆

发表于 2008-9-29 19:33:39 | 显示全部楼层
mark



有空再研究

出0入0汤圆

发表于 2008-9-29 19:51:37 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-9-29 20:22:03 | 显示全部楼层
很好很强大,有空研究研究,先做记号

出0入0汤圆

发表于 2008-10-5 20:42:48 | 显示全部楼层
嗯,这个跟我那个帖所提的问题的思路大同小异。



http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1529268&bbs_page_no=1&bbs_id=1006

出0入22汤圆

发表于 2008-10-5 20:45:43 | 显示全部楼层
顶。

出0入90汤圆

发表于 2008-10-5 21:24:06 | 显示全部楼层
你黑我啊!这么牛!做个记号,有时间再看!

出0入0汤圆

发表于 2008-10-5 23:09:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-10-5 23:56:38 | 显示全部楼层

出0入0汤圆

发表于 2008-10-6 09:21:10 | 显示全部楼层
有创意

出0入0汤圆

发表于 2008-10-6 20:39:28 | 显示全部楼层
学习!

出0入0汤圆

发表于 2008-10-6 20:48:32 | 显示全部楼层
学习了哈~

出0入0汤圆

发表于 2008-10-6 21:26:54 | 显示全部楼层
说的不客气点,如今有关IO扫键的讨论,有点向“一个针尖上能站多少个天使”靠拢的趋势……



MCU研发不是理论物理,更不是理论数学,拿这种纯粹是死钻牛角尖的方式“思考”,不会给解决现实问题带来任何帮助……

出0入0汤圆

发表于 2008-10-6 21:48:23 | 显示全部楼层
看上去气势汹汹

喜欢

出0入0汤圆

发表于 2008-10-12 18:22:13 | 显示全部楼层
记号

出0入0汤圆

 楼主| 发表于 2008-10-12 18:28:00 | 显示全部楼层
此贴已经有了新的版本,原来的有部分小错误,新的位于:

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1600359&bbs_page_no=1&bbs_id=9999

2个I/O=9个键,3个I/O=42个键

出0入10汤圆

发表于 2008-10-12 21:12:23 | 显示全部楼层
提个问题:

    LZ,对于普通IO口来说,输入的电平我们在软件中只能检测到0或者1,用您说的方法,如果我用一根线做两个按键,那么看您上面的图,在S1,S2两个键都没有按下的情况,我们的按键检测出来是个什么情况?而分别按下S1和S2检测出来又是个什么情况?并且,我已经将您的软件拿来仿真过,具体情况是程序启动的时候没问题,当我按下S1不动的时候,所对应的一个LED是一直闪烁的,按下S2也是同样的情况,不知道是软件的问题还是这个想法有缺陷,当然,我是个新手,可能最基本没吃透,请看到这个贴子的朋友们讨论一下........

出0入0汤圆

 楼主| 发表于 2008-10-12 21:45:09 | 显示全部楼层
to 18楼

我的程序是经过实际电路检验工作正常的,本贴中原来发的程序稳定性稍欠,我在另一个帖子中详细说明了提高稳定性的方法,链接在17楼,3线的键盘也是经过实践检验的。

用一跟线检测两个键并非在一次完成,第一步是关闭内部上拉电阻,此时外部下拉电阻将其作用,此时按下S1就会把端口拉高,即可检测到,如果第一轮没检测到按键,则打开内部上拉,因为外部下拉电阻阻值非常大,所以此时不能发挥作用,端口处于高电平,如果按下S2将会把端口拉低,即可被检测到。

当两个键同时按下时,因为上拉弱,下拉强,所以端口会被强制拉低,所以程序会认为S2被按下。

出0入0汤圆

发表于 2008-10-14 13:33:18 | 显示全部楼层
个人我用不到,不过还是顶

出610入42汤圆

发表于 2008-11-23 12:15:51 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-11-28 12:39:22 | 显示全部楼层
学习~~~~~~~~~~~~

出0入0汤圆

发表于 2009-2-4 00:01:28 | 显示全部楼层
GOOD!JIHAO.

出0入0汤圆

发表于 2009-6-29 16:04:55 | 显示全部楼层
很厉害,大开眼界

出0入0汤圆

发表于 2009-6-30 17:00:22 | 显示全部楼层
记号,看到眼都花了,

出0入0汤圆

发表于 2009-6-30 17:13:12 | 显示全部楼层
jh

出0入0汤圆

发表于 2009-7-1 11:59:27 | 显示全部楼层
大开眼界

出0入4汤圆

发表于 2009-7-2 22:51:06 | 显示全部楼层
学习学习。

出0入0汤圆

发表于 2009-7-6 18:59:46 | 显示全部楼层
顶一个

出0入0汤圆

发表于 2009-7-28 15:27:59 | 显示全部楼层
学习了。

出0入0汤圆

发表于 2009-7-28 15:59:33 | 显示全部楼层
MARI

出0入0汤圆

发表于 2009-7-28 16:03:46 | 显示全部楼层
这样编程会不会狠麻烦?

出0入0汤圆

发表于 2009-8-13 20:58:18 | 显示全部楼层
mark!

出0入0汤圆

发表于 2009-11-11 16:27:05 | 显示全部楼层
好强大

出0入0汤圆

发表于 2009-11-11 21:14:40 | 显示全部楼层

出0入0汤圆

发表于 2009-12-2 10:00:56 | 显示全部楼层
biaoji

出0入0汤圆

发表于 2009-12-12 11:15:27 | 显示全部楼层
顶~

出0入0汤圆

发表于 2009-12-12 12:30:49 | 显示全部楼层
顶,但是用在低要求时

出0入0汤圆

发表于 2009-12-12 12:46:33 | 显示全部楼层

出0入0汤圆

发表于 2009-12-12 17:28:47 | 显示全部楼层
大开眼界

出0入0汤圆

发表于 2009-12-22 02:37:14 | 显示全部楼层
高手

出0入0汤圆

发表于 2010-5-19 22:48:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-20 12:50:55 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-6-3 20:35:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-4 14:39:41 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-6-26 15:55:49 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-7-3 16:49:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-3 19:55:33 | 显示全部楼层
啊啊,太强了。

出0入0汤圆

发表于 2010-7-3 20:57:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-18 20:21:23 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-7-18 22:32:38 | 显示全部楼层
太麻烦了,我用AVR一个AD引脚串上一串N个电阻加1个电容实现了N个键,电路比你的简单,程序应该也比你的简单。

(原文件名:新建 文本文档.jpg)

出0入0汤圆

发表于 2010-9-16 09:27:40 | 显示全部楼层
高手,好好研究一下

出0入0汤圆

发表于 2010-10-6 13:35:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-6 13:59:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-27 14:18:15 | 显示全部楼层
mrk

出0入0汤圆

发表于 2010-12-16 23:48:21 | 显示全部楼层
powerful!

出0入0汤圆

发表于 2010-12-17 08:47:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-24 02:34:18 | 显示全部楼层
就冲楼主这精神也得收藏啊,谢谢分享!!慢慢品了

出0入0汤圆

发表于 2011-2-23 10:14:42 | 显示全部楼层
学习!

出0入8汤圆

发表于 2011-2-23 11:34:10 | 显示全部楼层
记号记号

出0入0汤圆

发表于 2011-2-23 11:36:45 | 显示全部楼层
现在有专用的芯片才几毛钱,不比这个好。只要两个总线

出0入0汤圆

发表于 2011-2-23 17:26:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-23 22:21:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-23 22:37:01 | 显示全部楼层
alternatively, you can read keys with shift registers. two pins for hc164, and three pins for hc595 to read as many pins as you want.

出0入0汤圆

发表于 2011-5-2 10:41:53 | 显示全部楼层
mark~

出0入0汤圆

发表于 2011-5-2 10:48:35 | 显示全部楼层
回复【2楼】h2feo4 无机酸
再追加一个

<center>
   

-----------------------------------------------------------------------

~~~~数二极管中..............

出0入0汤圆

发表于 2011-5-3 13:20:44 | 显示全部楼层
说的也是,那么多的二极管,价值加起来也不少了,不如用个专用芯片了

出0入0汤圆

发表于 2011-5-3 13:34:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-22 19:43:08 | 显示全部楼层
mark 学习了

出0入0汤圆

发表于 2011-5-22 21:54:23 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-7-1 15:13:35 | 显示全部楼层
好帖马克之

出0入0汤圆

发表于 2011-7-4 19:14:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-4 19:15:00 | 显示全部楼层
mark

出0入0汤圆

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

出0入0汤圆

发表于 2011-8-11 16:39:54 | 显示全部楼层

出0入0汤圆

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

出0入0汤圆

发表于 2011-8-12 01:21:21 | 显示全部楼层
key MARK

出0入0汤圆

发表于 2011-8-12 07:41:21 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-8-12 10:07:59 | 显示全部楼层
一种好的键盘扫描方法,我顶!顶,顶!

出0入0汤圆

发表于 2011-9-7 22:07:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-13 17:25:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-14 16:46:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-9 21:46:44 | 显示全部楼层
mark

出0入476汤圆

发表于 2011-11-9 22:03:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-17 13:56:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-17 23:06:26 | 显示全部楼层
mm

出0入0汤圆

发表于 2012-2-18 21:12:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-19 10:56:41 | 显示全部楼层
强悍!

出0入0汤圆

发表于 2012-2-20 12:09:45 | 显示全部楼层
楼主,可否要一下你的QQ!!

出0入0汤圆

发表于 2012-2-23 16:57:23 | 显示全部楼层
楼主您好!请问您给的一段程序为什么没加去抖?

出0入0汤圆

发表于 2012-2-23 17:02:59 | 显示全部楼层
I/O口在高阻状态下也能读PINC寄存器吗?

出0入0汤圆

发表于 2012-2-28 16:04:47 | 显示全部楼层
要花點時間研究研究,看怎樣把它放在實際應用上。

出0入0汤圆

发表于 2013-7-7 20:05:46 | 显示全部楼层
先mark下

出0入0汤圆

发表于 2013-12-20 20:32:39 | 显示全部楼层
好牛逼啊  

出0入0汤圆

发表于 2013-12-21 02:21:56 | 显示全部楼层
太牛了!!!!

出0入0汤圆

发表于 2014-8-22 14:29:56 | 显示全部楼层
一片165加一片595可以扫描64个按键了吧

出0入0汤圆

发表于 2015-8-26 14:03:33 | 显示全部楼层
很牛啊。。。

出0入0汤圆

发表于 2015-9-1 23:06:32 | 显示全部楼层
有研究价值确毫无使用价值!也就学生哥喜欢这东东!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-20 14:09

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

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