h2feo4 发表于 2008-9-29 17:47:25

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

以下所有文字、表格、图片、文件、程序等除特别声明以外均为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时的情况



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_436090.JPG

表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



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_436091.JPG

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



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_436092.JPG

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



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_436093.JPG

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



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_436094.JPG

 (原文件名:AVR_1.JPG) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_436095.JPG

 (原文件名:AVR_2.JPG) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_436096.JPG

 (原文件名:51_2.JPG) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_436097.JPG

 (原文件名:AVR_F3.JPG) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_436098.JPG

 (原文件名:AVR_S3.JPG) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_436099.JPG

 (原文件名:51_F3.JPG) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_436100.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.

djl310 发表于 2008-11-28 12:39:22

学习~~~~~~~~~~~~

sun424 发表于 2008-11-23 12:15:51

记号

htal 发表于 2008-10-14 13:33:18

个人我用不到,不过还是顶

h2feo4 发表于 2008-10-12 21:45:09

to 18楼

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

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

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

chengtina 发表于 2008-10-12 21:12:23

提个问题:

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

h2feo4 发表于 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个键

wear778899 发表于 2008-10-12 18:22:13

记号

hecb999 发表于 2008-10-6 21:48:23

看上去气势汹汹

喜欢

watercat 发表于 2008-10-6 21:26:54

说的不客气点,如今有关IO扫键的讨论,有点向“一个针尖上能站多少个天使”靠拢的趋势……



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

ppa2001 发表于 2008-10-6 20:48:32

学习了哈~

haizaolan 发表于 2008-10-6 20:39:28

学习!

sunmake 发表于 2008-10-6 09:21:10

有创意

dongni 发表于 2008-10-5 23:56:38

zuoyou 发表于 2008-10-5 23:09:46

mark

honami520 发表于 2008-10-5 21:24:06

你黑我啊!这么牛!做个记号,有时间再看!

zxq6 发表于 2008-10-5 20:45:43

顶。

jjj206 发表于 2008-10-5 20:42:48

嗯,这个跟我那个帖所提的问题的思路大同小异。



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

fuliaokai 发表于 2008-9-29 20:22:03

很好很强大,有空研究研究,先做记号

eagle2006 发表于 2008-9-29 19:33:39

mark



有空再研究

h2feo4 发表于 2008-9-29 18:04:39

再追加一个



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_436112.JPG

 (原文件名:51_S4.JPG) 



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

huayan 发表于 2008-9-29 17:54:13

先看看,好像不错,大家一起讨论一下

fangbao 发表于 2009-2-4 00:01:28

GOOD!JIHAO.

ndust 发表于 2008-9-29 19:51:37

记号

tiger1125 发表于 2009-6-29 16:04:55

很厉害,大开眼界

chinamanzhong 发表于 2009-6-30 17:00:22

记号,看到眼都花了,

ndust 发表于 2009-6-30 17:13:12

jh

guangan854214 发表于 2009-7-1 11:59:27

大开眼界

D.lovers 发表于 2009-7-2 22:51:06

学习学习。

wnju 发表于 2009-7-6 18:59:46

顶一个

hm_huang 发表于 2009-7-28 15:27:59

学习了。

liangbmw 发表于 2009-7-28 15:59:33

MARI

laodangong 发表于 2009-7-28 16:03:46

这样编程会不会狠麻烦?

weifeng99 发表于 2009-8-13 20:58:18

mark!

shark313 发表于 2009-11-11 16:27:05

好强大

askhua520 发表于 2009-11-11 21:14:40

yunqian09 发表于 2009-12-2 10:00:56

biaoji

wjy6264 发表于 2009-12-12 11:15:27

顶~

ggddll 发表于 2009-12-12 12:30:49

顶,但是用在低要求时

lv998127 发表于 2009-12-12 12:46:33

zhuyi2576 发表于 2009-12-12 17:28:47

大开眼界

bin8 发表于 2009-12-22 02:37:14

高手

student88 发表于 2010-5-19 22:48:08

mark

haowei236 发表于 2010-5-20 12:50:55

MARK

afei8856 发表于 2010-6-3 20:35:09

mark

number007cool 发表于 2010-6-4 14:39:41

mark!

weiloon 发表于 2010-6-26 15:55:49

Mark

aadu1122 发表于 2010-7-3 16:49:58

mark

xunpianzhen 发表于 2010-7-3 19:55:33

啊啊,太强了。

xuejianhua1986 发表于 2010-7-3 20:57:25

mark

sailfish 发表于 2010-7-18 20:21:23

MARK

asusy 发表于 2010-7-18 22:32:38

太麻烦了,我用AVR一个AD引脚串上一串N个电阻加1个电容实现了N个键,电路比你的简单,程序应该也比你的简单。
http://cache.amobbs.com/bbs_upload782111/files_31/ourdev_568881.jpg
(原文件名:新建 文本文档.jpg)

tengfei123 发表于 2010-9-16 09:27:40

高手,好好研究一下

fushengrucha 发表于 2010-10-6 13:35:18

mark

dianzifanfan 发表于 2010-10-6 13:59:01

mark

xtaens 发表于 2010-10-27 14:18:15

mrk

zhusai2008 发表于 2010-12-16 23:48:21

powerful!

liumaojun_cn 发表于 2010-12-17 08:47:40

mark

BINGSHUIHUO 发表于 2010-12-24 02:34:18

就冲楼主这精神也得收藏啊,谢谢分享!!慢慢品了

YL_L 发表于 2011-2-23 10:14:42

学习!

jingwaner 发表于 2011-2-23 11:34:10

记号记号

lloovve 发表于 2011-2-23 11:36:45

现在有专用的芯片才几毛钱,不比这个好。只要两个总线

leif 发表于 2011-2-23 17:26:46

mark

shaoyidong 发表于 2011-2-23 22:21:20

mark

millwood0 发表于 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.

voval 发表于 2011-5-2 10:41:53

mark~

jrcsh 发表于 2011-5-2 10:48:35

回复【2楼】h2feo4 无机酸
再追加一个

<center>
   

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

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

xiaobenyi 发表于 2011-5-3 13:20:44

说的也是,那么多的二极管,价值加起来也不少了,不如用个专用芯片了

ubuntuman 发表于 2011-5-3 13:34:17

mark

ttwxh 发表于 2011-5-22 19:43:08

mark 学习了

SDbeijixing 发表于 2011-5-22 21:54:23

Mark

fish47 发表于 2011-7-1 15:13:35

好帖马克之

ARMXIN 发表于 2011-7-4 19:14:32

mark

ARMXIN 发表于 2011-7-4 19:15:00

mark

stoneke 发表于 2011-8-11 15:35:14

mark

xrwf_2009 发表于 2011-8-11 16:39:54

fjfhss135790 发表于 2011-8-11 23:11:36

mark

fjfhss135790 发表于 2011-8-12 01:21:21

key MARK

atgfpeyv 发表于 2011-8-12 07:41:21

记号

lihp1603 发表于 2011-8-12 10:07:59

一种好的键盘扫描方法,我顶!顶,顶!

catwill 发表于 2011-9-7 22:07:12

mark

xiaoli5341623 发表于 2011-10-13 17:25:57

mark

xslyk 发表于 2011-10-14 16:46:58

mark

jyjmaster 发表于 2011-11-9 21:46:44

mark

wy2000 发表于 2011-11-9 22:03:09

mark

445451023 发表于 2012-2-17 13:56:36

mark

rongDDR 发表于 2012-2-17 23:06:26

mm

onlylgb0 发表于 2012-2-18 21:12:40

mark

zhuhaioudi 发表于 2012-2-19 10:56:41

强悍!

xianruisun 发表于 2012-2-20 12:09:45

楼主,可否要一下你的QQ!!

djingm1234 发表于 2012-2-23 16:57:23

楼主您好!请问您给的一段程序为什么没加去抖?

djingm1234 发表于 2012-2-23 17:02:59

I/O口在高阻状态下也能读PINC寄存器吗?

billmok 发表于 2012-2-28 16:04:47

要花點時間研究研究,看怎樣把它放在實際應用上。

micyoco 发表于 2013-7-7 20:05:46

先mark下

四轴飞行器 发表于 2013-12-20 20:32:39

好牛逼啊

LY新手上路 发表于 2013-12-21 02:21:56

太牛了!!!!

nos002 发表于 2014-8-22 14:29:56

一片165加一片595可以扫描64个按键了吧

llx04 发表于 2015-8-26 14:03:33

很牛啊。。。

py-industry 发表于 2015-9-1 23:06:32

有研究价值确毫无使用价值!也就学生哥喜欢这东东!

xiaoluo2009 发表于 2016-12-19 17:43:10

记号一下,以后研究
页: [1] 2
查看完整版本: 1个io=2键,2个io=8键,3个io=26键,超级键盘扫描大法,只用两只电阻和若干二极管 【恢复】