考考你!有兴趣的可以来看一下!

Leo 2005-06-28 04:57:39
用MSC51的P1口,最多可以接(识别)多少个按键?
条件:1.只准用P1口,不准借助其他的I/O口,但可以配合以软件算法!
2.同一时刻最多只有一个键被按下.
3.除了按键外,不准使用其他芯片和外围元件


提这个问题只是让大家开阔思维.
我可以识别76个键,如果你提供的方法可以识别更多的键,将独得200分!
...全文
131 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
deadline 2005-07-01
we
回复
netscaner 2005-07-01
不好意思,学艺不精。正因为P1有内部上拉,悬空的时候也是通过电阻接了Vcc,如果接通Vcc,电势差可能为零。不过,如果P1口和另外一个单片机的P1连接进行通讯,不知道另A的P1为FF的时候,B的P1电平情况是什么样的?或者在按键接地还是接Vcc上面还有潜力可挖。
有空要做做实验
回复
netscaner 2005-06-30
to doomleo(leo) :我贴子中已经纠正过,说明00000000的情况不可以。另外,按键接VCC还是接GND,和你的程序对IO口配置有关,都可以实现。我在脑海里想象,四层是可以的,但是我懒得去protel布线,所以说“布线做成6层PCB肯定可以实现255个键”。对于PCB,通常的要求是尺寸小,所以唯有增加层数了。protel99里可以布16层pcb,不知道一般pcb厂加工能做多少层?好像做手机、主板的很多都布6层。
回复
batboys 2005-06-30
关注中` ``````````````
回复
Leo 2005-06-30
to netscaner()
你的方法有缺陷,例如先把P1=0,这样还能从P1读到正确的数据吗?

不过你的方法修改一下的确是可行的,修改的方法是:
1.每一个键一端接GND,另外一端根据对键的编码和特定的i/o口相连.比如,A键的编码为01111110 就接P1.0和P1.7
2.把P1=0xff,读P1根据读到的数据来判断是否有键按下.例如,读到01111110,就是A键被按下,读到11111111则表示没有键被按下.
3.由于P1内部有上拉电阻,所以不需要外接上拉电阻.在没有上拉电阻的IO口,接上上拉电阻,此方案仍有效.
4.布线方面实际情况比想象的要简单(我已经实际布过),用4层足矣,如果板面积没有要求的,2层也行(板面积比4层大4倍).如果按键不采用矩阵方式的排列,而采用单排的形式(估计没人这么做),布线反而更简单.

总之, netscaner() 的255按键方案是可行的,估计也是最多的按键方案,如果三日内大家没有疑问就结帖.
回复
ldqmoon 2005-06-30
明白了,学到不少东西


回复
Leo 2005-06-30
令P1=0,那么读到的数据都会是0,不会正确读到P1口的状态,如果不信可以实际测试一下.
标准的P1口可以带动4(输出电流)~6(输入)个TTL器件
标准的P1口上拉的典型值为5k
回复
netscaner 2005-06-30
突然想起些东西,按键最好还是接VCC,每次定时中断后令P1=0,没有按键就是0。
单片机数据手册提到:Port 1 is an 8-bit bidirectional I/O port with internal pull-ups on all pins.Port 1 pins that have 1s written to them are pulled high by the internal pull-ups and can be used as inputs. As inputs, port 1 pins that are externally pulled low will
source current because of the internal pull-ups. (See DC Electrical Characteristics:
IIL).所以,如果按键接GND,按钮按下的时候,电平被外部拉低,这时候就出现source current(估计是内部上拉电阻集电),集电自然要放电,这样会有什么不良影响,我也不清楚。而对于我的方案,按键在不接通Vcc的时候,IO只是悬空。

还有一点,如果有些51芯片的P1是多功能口,没准有比较器,这样也没有违反“除了按键外,不准使用其他芯片和外围元件”,也许可以实现更多按钮,留给你们想吧。
回复
netscaner 2005-06-29
硬件我已经说了:每一个键一端接Vcc,另外一端和特定的i/o口(比如,10000001就接P10和P17)相连。先把P1=0,这样,你按一个键,如我举的例,那么P1端口的电平就是10000001,P10和P17是高电平。因为人按按钮是有一定时间长度的,那么用定时器定时(比如1毫秒)扫描P1不就得到键码了吗?00000000按键什么都不接,当然就测不到了。
布线做成6层PCB肯定可以实现255个键,再少怎么布线,现在还没想到。
回复
netscaner 2005-06-29
理论上应该是2^8-1=255,因为00000000的扫描码是捕捉不到的。每一个键一端接Vcc,另外一端和特定的i/o口(比如,10000001就接P10和P17)相连。这线路要几层pcb,那就你想吧。
回复
netscaner 2005-06-29
用三个5*5也就75个按键,用三个I/O来判断是哪个键盘。或许也可以2^3*5*5。理论上应该是2^8,这布线怎么设计,那就懒得想了。
回复
Leo 2005-06-29
如果没有人能超过我所做的,那么我在结帖时将公布完整的实现方法,并且给大家平分本贴的分数!
谢谢参与!
回复
galle 2005-06-29
真是厉害,但是光说没有用,能不能把源码提供,供大家验证呀!:)
回复
ldqmoon 2005-06-29
楼上的强!

如果不考虑布线,那要实现255按键,硬件和程序要怎么实现?
回复
dasfsdf111111 2005-06-28
是做复合键了吧。。。。
回复
zys0001 2005-06-28
如发明永动机般的奇才
回复
zys0001 2005-06-28
楼主真乃牛人,8个口居然能做出76个按键的识别,并且不借助任何其他硬件或IO口,神仙,佩服
回复
没有楼主利害! Mark一下, 等待高手的超越!!
回复
相关推荐
发帖
单片机/工控
创建于2007-09-28

2.6w+

社区成员

硬件/嵌入开发 单片机/工控
申请成为版主
帖子事件
创建了帖子
2005-06-28 04:57
社区公告
暂无公告