打印

用AD法扫描按键

[复制链接]
5354|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
colinluan|  楼主 | 2008-8-27 19:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
http://space.**/upload/2008/8/27/710028f4-5f75-4e01-a4c2-061f5042fce8.jpg

如图,利用单片机的AD口进行按键扫描,利用不同按键按下时的电压不同以区分是哪个键按下。

这样做的好处是:节省单片机的I/O口,只要用一个I/O,就可以接多个开关,如果开关多了,电阻可以细分。

缺点是不支持组合键。且按键有一定的优先级,越靠近I/O口的按键优先级越高,在图中KEY1>KEY2>KEY3。

 

//pic16f883,10bitAD,ccs编译环境

#define KeyScan() Get_Adc16(3)

 

int16  KeyCurrent=0,KeyOld=0,KeyPress=0;
int8   KeyDown=0,KeyUp=0,KeyLas=0,KeyCount=0;



void ADKeyScan()
{       
 
 KeyCurrent=KeyScan();  //获取当前键值

//前后两次差值越过40,便认为发生了改变
 if((KeyCurrent>KeyOld)?(KeyCurrent-KeyOld):(KeyOld-KeyCurrent)>40)      

{
    KeyOld=KeyCurrent;  //保存新键值。
    KeyCount="0";
    return;
 }
 else
 {
   KeyCount++;
   if(KeyCount>=10)           //2ms的时间片,延时20ms

   {
     KeyCount=10;   //停止计数
   KeyPress=0; 

   if(KeyLast!=0 && KeyOld<=0x3d0) return;  //等待弹起

   if(KeyOld<=0x050 && !(KeyDown&0x01)) KeyPress|=0x01;
   if(KeyOld<=0x220 && KeyOld>=0x1e0) KeyPress|=0x02;
   if(KeyOld<=0x2c0 && KeyOld>=0x280) KeyPress|=0x04;

   KeyDown|=(KeyPress)&(~KeyLast);   //按下的键

   KeyUp|=(~KeyPress)&(KeyLast);     //弹起的键

   KeyLast=KeyPress;
   }
 }  
}

操作:

 ADKeyScan();
 if(KeyDown&0x01)
 {
  Accu_Mode_Flag=~Accu_Mode_Flag;
  SoundStart_Flag=TRUE;
  KeyDown&=0xfe;
 }

 

以上是我的一些看法,欢迎路过的留下看法,也欢迎指出不足。

相关帖子

沙发
alex74| | 2008-8-27 19:33 | 只看该作者

可以的

早期的日本walkman,线控就是这么做的。但是要注意,天长地久开关会氧化,电阻会变,要做好保护

使用特权

评论回复
板凳
lyjian| | 2008-8-27 19:38 | 只看该作者

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

现在几乎所有的电视产品都是用的AD做按键检测的

使用特权

评论回复
地板
edanzg| | 2008-8-28 00:00 | 只看该作者

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

使用特权

评论回复
5
tengfei123| | 2008-8-29 22:11 | 只看该作者

ok

是支持组合键的,只是你没有想到而已

使用特权

评论回复
6
PowerAnts| | 2008-8-30 00:05 | 只看该作者

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

AD法,需要与按键相同数量的电阻,电阻不值钱,加工费可贵着呢
再则,AD法需要具有ADC的MCU,MCU要具有微供耗电压基准源,成本上,康佳还做不到

==================================================================
edanzg 发表于 2008-8-28 00:00 技术交流 ←返回版面    

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

使用特权

评论回复
7
edanzg| | 2008-8-30 04:59 | 只看该作者

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

遥控器早就换了,12块钱一只,成本应该在5块以内的。

使用特权

评论回复
8
PowerAnts| | 2008-8-30 07:04 | 只看该作者

误会

是俺读贴不仔细,面被子去哈

使用特权

评论回复
9
colinluan|  楼主 | 2008-8-30 11:39 | 只看该作者

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


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

==================================
tengfei123 发表于 2008-8-29 22:11 技术交流 ←返回版面    

5楼: ok 

是支持组合键的,只是你没有想到而已 

使用特权

评论回复
10
awey| | 2008-8-30 11:45 | 只看该作者

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

使用特权

评论回复
11
colinluan|  楼主 | 2008-8-30 11:59 | 只看该作者

LS说的极是。

LS说的极是。

==================================
awey 发表于 2008-8-30 11:45 技术交流 ←返回版面    

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

 

使用特权

评论回复
12
lyjian| | 2008-8-30 12:20 | 只看该作者

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

两个键按下的阻值是有可能和另外一个键按下的阻值是一样的

使用特权

评论回复
13
glf| | 2009-8-17 09:06 | 只看该作者
ls能详细说一下吗?该怎么实现组合键的,谢谢。

使用特权

评论回复
14
ljm810010| | 2009-8-18 00:25 | 只看该作者
哎,你的电阻用1K,2K,4K,8K..........65536K,131072K,262144K
这样任意的键组合都不会与其它的重复啦~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

83

帖子

0

粉丝