ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:124.24KB ,
资源ID:2150956      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2150956.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(5个IO口最多能扫描多少个按键.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

5个IO口最多能扫描多少个按键.docx

1、5个IO口最多能扫描多少个按键5个IO口最多能扫描多少个按键?简介:在做项目(工程)的时候,我们经常要用到比较多的按键,而且IO资源紧张,于是我们就想方设法地在别的模块中节省IO口,好不容易挤出一两个IO口,却发现仍然不够用,实在没办法了就添加一个IC来扫键。一个IC虽然价 .在做项目(工程)的时候,我们经常要用到比较多的按键,而且IO资源紧张,于是我们就想方设法地在别的模块中节省IO口,好不容易挤出一两个IO口,却发现仍然不够用,实在没办法了就添加一个IC来扫键。一个IC虽然价格不高,但对于大批量生产而且产品利润低的厂家来说,这是一笔不菲的开支!那,我们能不能想到比较好的扫键方法:用最少的I

2、O口,扫最多的键?可以吗?举个例:给出5个IO口,能扫多少键?有人说是2*36个,如图一: 图一对,大部分技术参考书都这么做,我们也经常这样做:用3个IO口作行扫描,2个IO作列检测(为方便描述,我们约定:设置某一IO口输出为“0”称其为“扫某IO口”)。用行线输出扫键码,列线检测是否有按键的查询方法进行扫键。扫键流程:在行线依次输出011,101,110扫键值,行线每输出一个扫键值,列线检测一次。当列线检测到有按键时,结合输出的扫键值可以判断相应的按键。但是,5个IO真的只能扫6个键吗?有人说可以扫9个,很聪明!利用行IO与地衍生3个键(要注意上拉电阻),如图二:图二扫键流程:先检测3个行I

3、O口,对K1,K2,K3进行扫键,之后如上述2*3扫键流程。5个IO口能扫9个键,够厉害吧,足足比6个键多了1/2!动动脑,还能不能再多扫几个?就几个?一个也行!好,再想一下,硬是被逼出来了!如图三:图三不多不少,正好10个键!这种扫键方式比较少见吧!漂亮!扫键流程:设IO1输出为“0”,检测IO2IO5,若判断有相应健按下,则可知有健;若无键,则继续扫键:设IO2输出为“0”,检测IO3,IO4,IO5,判断有无键按下,如此类推。这里应注意:当扫某一IO口(输出为“0”)时,不要去检测已经扫过的IO口。如:此时设置IO2输出为“0”,依次检测IO3,IO4,IO5,但不要去检测IO1,否则会

4、出错(为什么,请思考)。感觉怎么样?不错吧!让我们再看看图三,好有成就感!看着,看着又看到了什么?快!见图四:图四真强!被您看出20个键!多了一个对称的三角形。可是,像这样的排列能正确扫20个键吗?回答是肯定的:不能!上下三角形相互对称,其对称扫出的键无法区别。有没有注意到分析图三时提到的注意点?(“当扫某IO口时,不要去检测已经扫过的IO口,否则会出错”)我们分析一下图四:当IO1输出“0”时,按下K11或K11键都能被IO2检测到,但IO2检测却无法区别K11和K11键!同理,不管扫哪个IO口,都有两个对称的键不能区分。我们假想,如果能把对称键区分开来,我们就能正常地去判断按键。我们在思考

5、:有没有单向导通性器件?有!见图五!图五很巧妙的思路!利用二极管的单向导通性,区别两个对称键。扫键思路:对逐个IO口扫键,其他四个IO口可以分别检测其所在的四个按键。这样,就不会有分析图三时提到的注意点。够酷吧!等等,大家先别满足现状,我们再看一下图二,是不是有点启发?对,我们再分析一下“用5个IO口对地衍生的5个键”。看图六:图六25个键!5个IO口扫出25个键!先别激动,我们再分析一下它的可行性,分析通得过才能真正使用。假设扫键流程:先扫对地的5个键,再如图五扫键。先扫对地5个键,判断没有按键,接着对逐一对IO口进行扫键。但当对某一IO口扫键时,如果有对地的键按下,这时有可能会误判按键,因

6、为对地键比其他键有更高的响应优先级。例如:扫IO1,IO1输出“0”,恰好此时K62按下,IO2检测到有按键,那就不能判断是K11还是K62。我们可以在程序上避免这种按键误判:若IO2检测到有按键,那下一步就去判断是否有对地键按下,如果没有,那就可以正确地判断是K11了。我们小结扫键个数S:S = (N-1)*N + N 启用二极管S = (N-1)*N /2 + N 省掉二极管经典吗?太经典了!告诉大家一个小道消息:第一个设计出此电路的人是一个美国大佬,他(她?)还为此申请了专利!示例代码如下(出自孩儿们之手哈):硬件描述:键盘连接说明;IO1 PC1IO2 PC2IO3 PC3IO4 PC

7、4IO5 PC5核心函数:/* 函数说明:五个端口扫描25个键盘的函数 * 输入: 无 * 输出: 键盘编号 * 调用函数:无 */UINT8 _25Key_Scan(void)UINT8 i = 0,Key_Num = 0;/扫描最下面一行开关DDRC |= BIT(PC1)|BIT(PC2)|BIT(PC3)|BIT(PC4)|BIT(PC5);PORTC |= BIT(PC1)|BIT(PC2)|BIT(PC3)|BIT(PC4)|BIT(PC5);NOP();NOP();for(i = 1; i = 5; i+)if(!(PINC & BIT(i) /PCi=0Key_Num = i+

8、20;return Key_Num;/扫描第一行开关DDRC |= BIT(PC1); /PC1 输出PORTC &= BIT(PC1); /PC1=0DDRC &= (BIT(PC2)|BIT(PC3)|BIT(PC4)|BIT(PC5); /PC2-PC5 输入PORTC |= BIT(PC2)|BIT(PC3)|BIT(PC4)|BIT(PC5); /PC2PC5=1NOP();NOP();for(i = 2; i =5; i+)if(!(PINC & BIT(i)Key_Num = i-1;return Key_Num;/扫描第二行开关DDRC |= BIT(PC2); /PC2 输出

9、PORTC &= BIT(PC2); /PC2=0DDRC &= (BIT(PC1)|BIT(PC3)|BIT(PC4)|BIT(PC5); /PC1、PC3-PC5 输入PORTC |= BIT(PC1)|BIT(PC3)|BIT(PC4)|BIT(PC5); /PC1、PC3PC5=1if(!(PINC & BIT(1)Key_Num = 5;return Key_Num;elsefor(i = 3; i = 5; i+)if(!(PINC & BIT(i)Key_Num = i+3;return Key_Num;/扫描第三行开关DDRC |= BIT(PC3); /PC3 输出PORTC

10、 &= BIT(PC3); /PC2=0DDRC &= (BIT(PC1)|BIT(PC2)|BIT(PC4)|BIT(PC5); /PC1、PC2、PC4、PC5 输入PORTC |= BIT(PC1)|BIT(PC2)|BIT(PC4)|BIT(PC5); /PC1、PC2、PC4、PC5=1if(!(PINC & BIT(1)Key_Num = 9;return Key_Num;else if(!(PINC & BIT(2)Key_Num = 10;return Key_Num;else if(!(PINC & BIT(4)Key_Num = 11;return Key_Num;else

11、 if(!(PINC & BIT(5)Key_Num = 12;return Key_Num;/扫描第四行开关DDRC |= BIT(PC4); /PC4 输出PORTC &= BIT(PC4); /PC4=0DDRC &= (BIT(PC1)|BIT(PC2)|BIT(PC3)|BIT(PC5); /PC1PC3、PC5 输入PORTC |= BIT(PC1)|BIT(PC2)|BIT(PC3)|BIT(PC5); /PC1PC3、PC5=1for(i = 1; i = 3; i+)if(!(PINC & BIT(i)Key_Num = i+12;return Key_Num;if(!(PI

12、NC & BIT(5)Key_Num = 16;return Key_Num;/扫描第五行开关DDRC |= BIT(PC5); /PC5 输出PORTC &= BIT(PC5); /PC5=0DDRC &= (BIT(PC1)|BIT(PC2)|BIT(PC3)|BIT(PC4); /PC1-PC4 输入PORTC |= BIT(PC1)|BIT(PC2)|BIT(PC3)|BIT(PC4); /PC1PC4=1for(i = 1; i = 4; i+)if(!(PINC & BIT(i)Key_Num = i+16;return Key_Num;return Key_Num;/循环的方法实现使用的是PORTD口/*uint8 i = 0, j =0;DDRD = 0;PORTD = 0xff;for(i = 0; i 5; i+)if(!(PIND&BIT(i)return i+1;for(i = 0; i 5; i+)DDRD = BIT(i);PORTD = BIT(i);for(j = 0; j =i)return i*4+j+5;return i*4+j+6;return 0;*/根据最新成果,如果只考虑单个按键被按下的情况,键盘已经可以扩展为25 + 5 * (4 * 3 / 2) = 25 + 30 = 55个按键了实现这种方法的原理其实很简单。假设,我们考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1