打印
[Atmel]

用AVR单片机的ADC功能实现1个I/O口连接4个按键

[复制链接]
746|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
奥德赛|  楼主 | 2015-8-31 21:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用AVR的M48作一个东西,这一个口那一个口突然发现IO口不够用了。用扩展芯片是没问题,但是感觉太浪费了,恰巧AVR有ADC功能,我看到好多人用ADC功能做按键一个IO口实现24按键,我就4个按键做起来应该不是很难。看完datasheet的ADC和参考网上资料,程序写完以后运行效果还不错,下面是电路图和源程序:
    /*
    *************************************************************************
    *名称: unsigned int GetADCValue(unsigned char uchADCChannel)     *
    *功能: 获取按键ADC值             *
    *参数: 无                                   *
    *返回: 按键ADC值                                 *
    *************************************************************************
    */   
    unsigned int GetADCValue(unsigned char uchADCChannel)
      {
       unsigned char i;
       unsigned int uiADCValue = 0;
      
       ADMUX = _BV(REFS0)|uchADCChannel;          // 参考电压AVCC选择
       for (i=0; i<4; i++)                 // 连续转换4次
        {
         ADCSRA |= (1<     ADCSRA |= (1<     loop_until_bit_is_set(ADCSRA, ADIF); // 等待ADC转换结束
         ADCSRA |= (1 << ADIF);      // 写1清除标志位
         uiADCValue =uiADCValue + ADC;     
         
        }
      
       uiADCValue /= 4;        // 取平均值
       return uiADCValue;
      }
    /*
    *************************************************************************
    *名称: unsigned char GetKeyValue(void)          *
    *功能: 获取按键值              *
    *参数: 无                                   *
    *返回: 按键值                                  *
    *************************************************************************  
    */
    unsigned char GetKeyValue(void)
    {
      // 5.24V下按键与对应ADC值如下
      // KEY  NO  KEY0     KEY1  KEY2  KEY3
      // ADC  1023 0012 390     565  669

      unsigned char uchKeyValue = NOKEY;  // 按键码
      unsigned int uiKeyADC = 0;    // 按键ADC值
      uiKeyADC = GetADCValue(ADC_CHANNEL);
      if(uiKeyADC<1000)      // 如果有键按下  
       {
        DelayNms(10);     // 延时10ms消抖   
        uiKeyADC = GetADCValue(ADC_CHANNEL);
        if(uiKeyADC < 32)     // KEY0
         {
          uchKeyValue = KEY0;
         }
        else if(uiKeyADC < 410)    // KEY1
         {
          uchKeyValue = KEY1;
         }
        else if(uiKeyADC < 585)    // KEY2
         {
          uchKeyValue = KEY2;
         }
        else if(uiKeyADC < 689)    // KEY3
         {
          uchKeyValue = KEY3;
         }
       }
      return uchKeyValue;  
    }


相关帖子

沙发
波越| | 2015-8-31 21:43 | 只看该作者
r是什么原理?

使用特权

评论回复
板凳
波越| | 2015-8-31 21:44 | 只看该作者
上拉电阻的不同吗

使用特权

评论回复
地板
会飞の鱼| | 2015-8-31 21:52 | 只看该作者
楼主做4个按键还是挺幸运的,代码量也不是很多。

使用特权

评论回复
5
xyz549040622| | 2015-8-31 22:11 | 只看该作者
楼主图片挂了,应该是电阻分压,然后不同的按键按下的时候,有不同的电压值。但这么做也有缺点,反应比较慢。

使用特权

评论回复
6
lzbf| | 2015-8-31 22:16 | 只看该作者
键盘扫描么?

使用特权

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

本版积分规则

46

主题

397

帖子

3

粉丝