网站公告列表     本站开通全国范围代收货款业务,详情请点击  [dycxin  2008年5月14日]            黑金刚系列AVR单片机已经上市,欢迎选购!!  [dycxin  2007年8月17日]        
加入收藏
设为首页
联系站长
您现在的位置: EDA加油站 >> AVR单片机 >> 提高 >> 实战分析 >> 正文
  [推荐]用AVR单片机的ADC功能实现1个I/O口连接4个按键         ★★★ 【字体:
用AVR单片机的ADC功能实现1个I/O口连接4个按键
用AVR单片机的ADC功能实现1个I/O口连接4个按键
作者:未知    AVR单片机来源:网络    点击数:    更新时间:2007-10-11    

最近用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;  
 }

AVR单片机录入:dycxin    责任编辑:dycxin 
  • 上一篇AVR单片机:

  • 下一篇AVR单片机:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    MEGA128操作TLC2543
    ATMEGA162接收四路韦根数据
    AVR的几个USART接口函数
    AVR单片机JTAG接口的使用方法
    接受和发送中断服务程序
    AVR-GCC如何调用存储于Flash…
    [AVR单片机学习]JTAG学习笔记…
    [AVR单片机学习]JTAG学习笔记…
    [AVR单片机学习]JTAG学习笔记…
    JTAG与ISP的区别
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    EDA加油站|我要EDA网|山东电子网--东营市荣燕商贸有限公司版权所有! 站长:阿荣
    联系电话:0546-7870320,13371507828 电邮:51edacn@163.com
    山东东营西城济南路百祥电脑商城B302室 邮编:257000 鲁ICP备07018763号  鲁ICP备07000091号 鲁ICP备05003434号
    公司帐号:1615011209000037682 户名:东营市荣燕商贸有限公司 开户行:工行西城支行石油大学分理处