|
发表于 2011-11-7 17:44:27
|
显示全部楼层
我比较笨,花了好长时间才稍微有点明白了,刚好比较闲,分析一下,供网友参考,
cowboy哥要是发现我哪里分析不对了就指证一下:
首先从帖子http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=991644&bbs_id=1006 取个图片,先分析一下这个

这个应该先抽象地从IO口状态方面入手
当三个IO口都设置为高,即111时,通过按键,可以制造7种状态: 000, 001, 010, 011, 100, 101, 110
这就是原理图中按键K0 K1 ... K6 的作用,因为K0 - K6可以用这个方法直接扫描出来,所以后面的按键扫描可以不考虑这几个按键了
当三个IO口的状态设置为110时,就是说有一个IO口设置为低电平,这里不妨先分析I/O1为低的情况,那么可以通过按键制造出3种状态 010, 000, 100
这就是图中K8, K9, K13的作用
同理,设置为101, 011的时候各有3种状态,
这样就有 3*3 = 9个按键了
分析到这里,已经有 9 + 7 = 16 个按键了, cowboy的是22个按键, 还有6个从哪来? 先别急,这个稍后再分析
分析出各种状态了,再来从更实际的角度看看二极管在这里面起的用作是什么,
二极管嘛,单向导电,
可以先假设原理图里面的二极管全部短路了会怎么样?
这样很明显三个IO口都接在一起了,还能扫描按键吗?
可以得出一个结论,这里的二极管可以隔离三个IO口,
还有一个作用,比如D9和D7和D3,可以保证K3和K4和K6互不影响,也就是隔离那些连接着同一个IO口的并直接连着地的按键,
再有,利用单向导电性,一个IO口能被单向地被另一个拉低.也就是K7 , K8 ... K12
分析到这里,就开始脱离这个图吧,
刚刚分析完二极管,利用单向导电性,这个按键扫描可以从另一个角度去想
111的IO口设置还是只有7种状态,这个是地对三个IO口的7种影响
但是110, 101, 011的设置的分析可以从另一角度去想,因为IO这三个设置都是三个IO口互相影响的,可以利用二极管创造出更多的可能性
情况1: 1 个IO口仅被另 1 个 IO 口单向地拉低,并且不带其它的影响(区别情况2), 有 3*2 = 6 个按键 (K7 , K8 ... K12)
情况2: 1 个IO口把两个IO口同时拉低, 有 3*1 个按键 (图中的K13, K14, K15)
情况3: 1 个IO口和另一个IO口双向拉低 有 3*2/2 = 3个按键(这个情况是上图中没有利用到的)
情况4: 1 个IO口可以被其它两个IO口中的任意一个单向拉低 有 3*1 个按键(这个情况是上图中没有利用到的)
这样, 就有 7 + 6 + 3 + 3 + 3 = 22个按键了
唉,虽然理了一遍了,可我还是觉得有点混乱,或许cowboy使用映射表也是这个原因吧...
抽象分析完了,再来看看刚才那个图,该从哪里优化好呢?
D1, D2, D3 是可以去掉的, 因为地是无敌的...---------------------------------------抱歉,这里我分析错了......应该改成4个电阻(按照6楼的方案,如果是为了省二极管的话)(研究了一下cowboy的图片...22号键要把三个地方一起短了,对于常规的二脚按键来说...有作弊嫌疑,哈哈~)注意最终我给的图片的电路图也有错误,就是有一个地方(就是22号键那里)把3个IO口给短路了,稍微改动一下就行了,
再对比看看cowboy漂亮的图,噢,D10, D11, D12都反过来,阳极脱离地, 都接在一起
然后K0, K1, K2 直接分别一端连IO口,另一端连地
那K7 - K16怎么办?分析一下,这个属于情况2的. 那么,K7 是IO2单向拉低IO3的,并在D8两端可以吧?
同理K8 (IO1单向拉低IO3) 可以并在D6两端, 以此类推...
嗯,这样硬件上基本一致了
继续,
刚才说到情况3和情况4在图里面是没有的,那么利用这个图怎么制造出来呢?
先看情况3:
1 个IO口和另一个IO口双向拉低, 这个简单, 直接在IO口之间都跨接按键就行了
再看情况4:
1 个IO口可以被其它两个IO口中的任意一个单向拉低,
这个...我再从刚才的图分析大家估计就更凌乱了,直接看cowboy的硬件图吧

(原文件名:1.jpg)
就是三个按键分别并在中间的三个二极管上
比如,最顶上的触点和中间的触点连在一起的时候, 另外两个IO口都可以把最上面的那个IO口拉低...
最后大概就是这样子

(原文件名:3.jpg)
基本原理分析就到这里了...程序我就不分析了...没认真看...看别人的程序还是比较辛苦的...我比较懒...呃,大家不要喷我...
编程原因:修正错误
抽象分析完了,再来看看刚才那个图,该从哪里优化好呢?
D1, D2, D3 是可以去掉的, 因为地是无敌的...---------------------------------------抱歉,这里我分析错了......应该改成4个电阻(按照6楼的方案,如果是为了省二极管的话)(研究了一下cowboy的图片...22号键要把三个地方一起短了,对于常规的二脚按键来说...有作弊嫌疑,哈哈~)注意最终我给的图片的电路图也有错误,就是有一个地方(就是22号键那里)把3个IO口给短路了,稍微改动一下就行了, |
|