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. 学习~~~~~~~~~~~~ 记号 个人我用不到,不过还是顶 to 18楼
我的程序是经过实际电路检验工作正常的,本贴中原来发的程序稳定性稍欠,我在另一个帖子中详细说明了提高稳定性的方法,链接在17楼,3线的键盘也是经过实践检验的。
用一跟线检测两个键并非在一次完成,第一步是关闭内部上拉电阻,此时外部下拉电阻将其作用,此时按下S1就会把端口拉高,即可检测到,如果第一轮没检测到按键,则打开内部上拉,因为外部下拉电阻阻值非常大,所以此时不能发挥作用,端口处于高电平,如果按下S2将会把端口拉低,即可被检测到。
当两个键同时按下时,因为上拉弱,下拉强,所以端口会被强制拉低,所以程序会认为S2被按下。 提个问题:
LZ,对于普通IO口来说,输入的电平我们在软件中只能检测到0或者1,用您说的方法,如果我用一根线做两个按键,那么看您上面的图,在S1,S2两个键都没有按下的情况,我们的按键检测出来是个什么情况?而分别按下S1和S2检测出来又是个什么情况?并且,我已经将您的软件拿来仿真过,具体情况是程序启动的时候没问题,当我按下S1不动的时候,所对应的一个LED是一直闪烁的,按下S2也是同样的情况,不知道是软件的问题还是这个想法有缺陷,当然,我是个新手,可能最基本没吃透,请看到这个贴子的朋友们讨论一下........ 此贴已经有了新的版本,原来的有部分小错误,新的位于:
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个键 记号 看上去气势汹汹
喜欢 说的不客气点,如今有关IO扫键的讨论,有点向“一个针尖上能站多少个天使”靠拢的趋势……
MCU研发不是理论物理,更不是理论数学,拿这种纯粹是死钻牛角尖的方式“思考”,不会给解决现实问题带来任何帮助…… 学习了哈~ 学习! 有创意 顶 mark 你黑我啊!这么牛!做个记号,有时间再看! 顶。 嗯,这个跟我那个帖所提的问题的思路大同小异。
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1529268&bbs_page_no=1&bbs_id=1006 很好很强大,有空研究研究,先做记号 mark
有空再研究 再追加一个
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_436112.JPG
(原文件名:51_S4.JPG)
电路图ourdev_436113.rar(文件大小:25K) (原文件名:51_S4.rar) 先看看,好像不错,大家一起讨论一下 GOOD!JIHAO. 记号 很厉害,大开眼界 记号,看到眼都花了, jh 大开眼界 学习学习。 顶一个 学习了。 MARI 这样编程会不会狠麻烦? mark! 好强大 biaoji 顶~ 顶,但是用在低要求时 高 大开眼界 高手 mark MARK mark mark! Mark mark 啊啊,太强了。 mark MARK 太麻烦了,我用AVR一个AD引脚串上一串N个电阻加1个电容实现了N个键,电路比你的简单,程序应该也比你的简单。
http://cache.amobbs.com/bbs_upload782111/files_31/ourdev_568881.jpg
(原文件名:新建 文本文档.jpg) 高手,好好研究一下 mark mark mrk powerful! mark 就冲楼主这精神也得收藏啊,谢谢分享!!慢慢品了 学习! 记号记号 现在有专用的芯片才几毛钱,不比这个好。只要两个总线 mark mark 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. mark~ 回复【2楼】h2feo4 无机酸
再追加一个
<center>
-----------------------------------------------------------------------
~~~~数二极管中.............. 说的也是,那么多的二极管,价值加起来也不少了,不如用个专用芯片了 mark mark 学习了 Mark 好帖马克之 mark mark mark 顶 mark key MARK 记号 一种好的键盘扫描方法,我顶!顶,顶! mark mark mark mark mark mark mm mark 强悍! 楼主,可否要一下你的QQ!! 楼主您好!请问您给的一段程序为什么没加去抖? I/O口在高阻状态下也能读PINC寄存器吗? 要花點時間研究研究,看怎樣把它放在實際應用上。 先mark下 好牛逼啊 太牛了!!!! 一片165加一片595可以扫描64个按键了吧 很牛啊。。。 有研究价值确毫无使用价值!也就学生哥喜欢这东东! 记号一下,以后研究
页:
[1]
2