用AD法扫描按键

[复制链接]
 楼主| colinluan 发表于 2008-8-27 19:26 | 显示全部楼层 |阅读模式
http://space.**/upload/2008/8/27/710028f4-5f75-4e01-a4c2-061f5042fce8.jpg<br /><br />如图,利用单片机的AD口进行按键扫描,利用不同按键按下时的电压不同以区分是哪个键按下。<br /><br />这样做的好处是:节省单片机的I/O口,只要用一个I/O,就可以接多个开关,如果开关多了,电阻可以细分。<br /><br />缺点是不支持组合键。且按键有一定的优先级,越靠近I/O口的按键优先级越高,在图中KEY1&gtKEY2&gtKEY3。<br /><br />&nbsp;<br /><br />//pic16f883,10bitAD,ccs编译环境<br /><br />#define&nbsp;KeyScan()&nbsp;Get_Adc16(3)<br /><br />&nbsp;<br /><br />int16&nbsp;&nbsp;KeyCurrent=0,KeyOld=0,KeyPress=0;<br />int8&nbsp;&nbsp;&nbsp;KeyDown=0,KeyUp=0,KeyLas=0,KeyCount=0;<br /><br /><br /><br />void&nbsp;ADKeyScan()<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;<br />&nbsp;KeyCurrent=KeyScan();&nbsp;&nbsp;//获取当前键值<br /><br />//前后两次差值越过40,便认为发生了改变<br />&nbsp;if((KeyCurrent&gtKeyOld)?(KeyCurrent-KeyOld):(KeyOld-KeyCurrent)&gt40)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;KeyOld=KeyCurrent;&nbsp;&nbsp;//保存新键值。<br />&nbsp;&nbsp;&nbsp;&nbsp;KeyCount=&quot;0&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;}<br />&nbsp;else<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;KeyCount++;<br />&nbsp;&nbsp;&nbsp;if(KeyCount&gt=10)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//2ms的时间片,延时20ms<br /><br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyCount=10;&nbsp;&nbsp;&nbsp;//停止计数<br />&nbsp;&nbsp;&nbsp;KeyPress=0;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;if(KeyLast!=0&nbsp;&&&nbsp;KeyOld&lt=0x3d0)&nbsp;return;&nbsp;&nbsp;//等待弹起<br /><br />&nbsp;&nbsp;&nbsp;if(KeyOld&lt=0x050&nbsp;&&&nbsp;!(KeyDown&0x01))&nbsp;KeyPress|=0x01;<br />&nbsp;&nbsp;&nbsp;if(KeyOld&lt=0x220&nbsp;&&&nbsp;KeyOld&gt=0x1e0)&nbsp;KeyPress|=0x02;<br />&nbsp;&nbsp;&nbsp;if(KeyOld&lt=0x2c0&nbsp;&&&nbsp;KeyOld&gt=0x280)&nbsp;KeyPress|=0x04;<br /><br />&nbsp;&nbsp;&nbsp;KeyDown|=(KeyPress)&(~KeyLast);&nbsp;&nbsp;&nbsp;//按下的键<br /><br />&nbsp;&nbsp;&nbsp;KeyUp|=(~KeyPress)&(KeyLast);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//弹起的键<br /><br />&nbsp;&nbsp;&nbsp;KeyLast=KeyPress;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;}&nbsp;&nbsp;<br />}<br /><br />操作:<br /><br />&nbsp;ADKeyScan();<br />&nbsp;if(KeyDown&0x01)<br />&nbsp;{<br />&nbsp;&nbsp;Accu_Mode_Flag=~Accu_Mode_Flag;<br />&nbsp;&nbsp;SoundStart_Flag=TRUE;<br />&nbsp;&nbsp;KeyDown&=0xfe;<br />&nbsp;}<br /><br />&nbsp;<br /><br />以上是我的一些看法,欢迎路过的留下看法,也欢迎指出不足。<br /><br />
alex74 发表于 2008-8-27 19:33 | 显示全部楼层

可以的

早期的日本walkman,线控就是这么做的。但是要注意,天长地久开关会氧化,电阻会变,要做好保护
lyjian 发表于 2008-8-27 19:38 | 显示全部楼层

AD做按键输入都用了十多年了

现在几乎所有的电视产品都是用的AD做按键检测的
edanzg 发表于 2008-8-28 00:00 | 显示全部楼层

我这里康佳的电视,开关受潮了,误动作,按键出错。

  
tengfei123 发表于 2008-8-29 22:11 | 显示全部楼层

ok

是支持组合键的,只是你没有想到而已
PowerAnts 发表于 2008-8-30 00:05 | 显示全部楼层

电视机遥控器不可能是AD按键

AD法,需要与按键相同数量的电阻,电阻不值钱,加工费可贵着呢<br />再则,AD法需要具有ADC的MCU,MCU要具有微供耗电压基准源,成本上,康佳还做不到<br /><br />==================================================================<br />edanzg&nbsp;发表于&nbsp;2008-8-28&nbsp;00:00&nbsp;技术交流&nbsp;←返回版面&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />4楼:&nbsp;我这里康佳的电视,开关受潮了,误动作,按键出错。&nbsp;<br />
edanzg 发表于 2008-8-30 04:59 | 显示全部楼层

LS我可没有说是遥控器啊,是机器面板的按键,

遥控器早就换了,12块钱一只,成本应该在5块以内的。
PowerAnts 发表于 2008-8-30 07:04 | 显示全部楼层

误会

是俺读贴不仔细,面被子去哈
 楼主| colinluan 发表于 2008-8-30 11:39 | 显示全部楼层

如果优先级低的键先按下,才能检测到组合键。

<br />如果优先级低的键先按下,才能检测到组合键。<br /><br />==================================<br />tengfei123&nbsp;发表于&nbsp;2008-8-29&nbsp;22:11&nbsp;技术交流&nbsp;←返回版面&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />5楼:&nbsp;ok&nbsp;<br /><br />是支持组合键的,只是你没有想到而已&nbsp;<br /><br />
awey 发表于 2008-8-30 11:45 | 显示全部楼层

电阻用并联,就可以判断组合键

  
 楼主| colinluan 发表于 2008-8-30 11:59 | 显示全部楼层

LS说的极是。

LS说的极是。<br /><br />==================================<br />awey&nbsp;发表于&nbsp;2008-8-30&nbsp;11:45&nbsp;技术交流&nbsp;←返回版面&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />10楼:&nbsp;电阻用并联,就可以判断组合键&nbsp;<br /><br />&nbsp;<br />
lyjian 发表于 2008-8-30 12:20 | 显示全部楼层

用并联也不一定可以判断组合键

两个键按下的阻值是有可能和另外一个键按下的阻值是一样的
glf 发表于 2009-8-17 09:06 | 显示全部楼层
ls能详细说一下吗?该怎么实现组合键的,谢谢。
ljm810010 发表于 2009-8-18 00:25 | 显示全部楼层
哎,你的电阻用1K,2K,4K,8K..........65536K,131072K,262144K
这样任意的键组合都不会与其它的重复啦~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

83

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

43

主题

83

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部