完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在编程序时,发现书本上写的矩阵键盘检测步骤是:先将某一行置0,其他行与列全部置1,然后扫描键盘端口值并与0xf0按位相与,当检测到按位与后的值与0xf0不同后,说明改行有键被按下,延时后再次检测,如果与之前一样,则读取与键盘相连的端口的值,用switch case语句对比,得出哪个键被按下了。用同样的方法再检测其他行。
这个方法可行,但是我觉得太麻烦,直接扫描键盘,将读取后的值与switch case语句中的值比较就行了,为什么还要一行行检测呢?我试了我的方法,不行。但是我想不通为什么,请高手帮忙解释,谢谢了。 |
|
相关推荐
8个回答
|
|
如果一个I/O口就接一个按键,的确可以直接检测I/O口,就知道哪个按键按下,但如果需要较多按键时,此法会浪费很多I/O口,不合适。
所以需要进行扫描的方式,即节约I/O口,又扩展建盘。 以4X4键盘为例,P3口八个I/o口分四条列线,四条行线,各线都有四个按键,一条线上的端口值变化,可由四个按键中的任意一个按下实现,故需要多行扫描的方式。 另外还有线反转法扫描键盘,你可以看看。 目前我知道的8个I/O口最多接的为36个按键。 |
|
|
|
请查看 反转扫描法。
|
|
|
|
谢谢了,不过用以下程序为什么不行呢?
void keyscan() { //P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay10ms(); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) {case 0xee: key=1; break; case 0xde: key=2; break; case 0xbe: key=3; break; case 0x7e: key=4; break; case 0xed: key=5; break; case 0xdd: key=6; break; case 0xbd: key=7; break; case 0x7d: key=8; break; case 0xeb: key=9; break; case 0xdb: key=10; break; case 0xbb: key=11; break; case 0x7b: key=12; break; case 0xe7: key=13; break; case 0xd7: key=14; break; case 0xb7: key=15; break; case 0x77: key=16; break; } } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } desplay(key); } } |
|
|
|
补充说明以下:为什么用以下程序不行呢?
void keyscan() { temp=P3;//直接读取P3口的值 temp=temp&0xf0; if(temp!=0xf0)/* 判断是否有按键按下,如果有键按下,P3.5~P3.7肯定有低电平, 所以temp不等于0xf0;*/ { delay10ms(); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) {case 0xee: key=1; break; case 0xde: key=2; break; case 0xbe: key=3; break; case 0x7e: key=4; break; case 0xed: key=5; break; case 0xdd: key=6; break; case 0xbd: key=7; break; case 0x7d: key=8; break; case 0xeb: key=9; break; case 0xdb: key=10; break; case 0xbb: key=11; break; case 0x7b: key=12; break; case 0xe7: key=13; break; case 0xd7: key=14; break; case 0xb7: key=15; break; case 0x77: key=16; break; } } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } desplay(key); } } |
|
|
|
我不知道这样说对不对,矩阵键盘没按下时相当悬空,如果你想使用矩阵键盘,那么你应该先置某一I/O为低电平,当你按下键盘时该按键才会被拉低,这样才能读出有效值来。而现在你没先置某I/O为低电平,你即使按下某一按键那该按键还是高低平,即你读出P3口的值都是高电平...
|
|
|
|
|
|
楼主不理解矩阵键盘的原理啊!
|
|
|
|
谢谢诸位,搞定了,呵呵!!
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11790 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 19:08 , Processed in 0.587857 second(s), Total 54, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号