搜索
bottom↓
回复: 6

AVR_M16 按键+数码管显示遇到的问题,我是解决不了,请大神

[复制链接]

出10入0汤圆

发表于 2013-1-21 13:54:12 | 显示全部楼层 |阅读模式
先上原理图,这个硬件要想做好显示和按键是有问题的,我是这样做的,当按键按下的时候停止显示,显示程序是2MS执行一次。
下面说说问题:
在PROTUES仿真的时候,想要的现象是对的,但是下载到板子上,按键却不能用,但是在板子上单独调试按键这一款的时候按键是好用的,最终把问题锁定在这里为什么呢?百思不得其解


unsigned char key_scan(void)
{
         static unsigned char statuse = 0;
         static unsigned char key_cnt = 0;
         static unsigned char   scan_f = 0;
         
          unsigned char temp;
          unsigned char key_value = 0;
          unsigned char now_key = 0;
          

                           if(key_cnt >3)
                            {
                             key_cnt = 0;       
                            }
                          
                            temp = PINA;
                        temp |= 0x70;  
                            PORTA = key_sel[key_cnt] & temp;
         
                            now_key = PINA;
                            now_key >>=7;


          switch(statuse)
          {
           case 0: if(now_key == 0)     //有键按下
                                      {
                                         statuse = 1;
                                        key_value = 0xf0;
                                }
                                else
                                {
                                         if(++scan_f >20 )
                                        {
                                         scan_f = 0;
                                         key_cnt ++;
                                        }
                                 
                                 statuse = 0;
                                 key_value = 0xff;
                                 
                                }       
                                break;
                case 1: if(now_key == 0)        //延时去抖
                                      {
                                  statuse = 2;
                                  key_value = 0xf0;
                                }
                                else
                                {
                                 statuse = 0;
                                 key_value = 0xff;
                                }       
                               
                                break;
                case 2: if(now_key == 1)     //按键松开
                                 {
                                 key_value = key_cnt;
                                 statuse = 0;
                                }
                                else
                                {
                                 key_value  = 0xf0;
                                 statuse = 2;
                                }
                                break;
           default:
           key_value = 0xff;
           break;
          }

          return key_value;
          
          

}

unsigned char Key(void)
{
unsigned char key_value = 0;

key_value = key_scan();

  //PORTD = Distance;
  //PORTD = key_value;

  switch(key_value)
  {
           case 0:                                //距离+
                if(Distance > 9)
                {
                         Distance = 1;
                }
                else
                {
                         Distance ++;
                }
               
          break;   
          
        case 1:                                //距离-
                 if(Distance < 2)
                {
                         Distance = 10;
                }
                else
                {
                         Distance --;
                }
       
       
        break;
            
        case 2:                                      //I+
                if(Current > 9)
                {
                         Current = 1;
                }
                else
                {
                         Current ++;
                }
       
       
         break ;   
        case 3:                                       //I-

           if(Current < 2)
                {
                         Current = 10;
                }
                else
                {
                         Current --;
                }

        break ;
       
        default: break;   
  }
  

return key_value;

}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出10入0汤圆

 楼主| 发表于 2013-1-21 13:55:16 | 显示全部楼层
求解啊                                          

出0入0汤圆

发表于 2013-1-22 16:21:34 | 显示全部楼层
看这个C的结构就是 跟马老师书上的写完差不多。

出10入0汤圆

 楼主| 发表于 2013-1-22 16:25:30 | 显示全部楼层
问题自己解决了,是对IO位操作的时候有问题
头像被屏蔽

出0入0汤圆

发表于 2013-1-22 22:06:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2013-1-23 00:43:37 来自手机 | 显示全部楼层
~楼主可否将改完的程序上传?

出10入0汤圆

 楼主| 发表于 2013-1-23 08:28:03 | 显示全部楼层
unsigned char key_scan(void)
{
         static unsigned char statuse = 0;     //按键状态
         static unsigned char key_cnt = 0;//扫描计数
         static unsigned char   scan_f = 0;  //扫描频率
         
          unsigned char key_value = 0;   //返回键值
          unsigned char now_key = 0;     //当前键值
          

                           if(key_cnt >4)    //正常应该是3,应为111,所以重复一次
                            {
                             key_cnt = 0;       
                            }
               
                          switch(key_cnt)
                          {
                          case 0:   PORTA &= ~(1 << PA4) ; PORTA &= ~(1 << PA5) ;; PORTA |= (1 << PA6);           break;  //100
                          case 1:   PORTA |= (1 << PD4)  ; PORTA &= ~(1 << PA5) ;PORTA |= (1 << PA6);           break;   //101
                          case 2:   PORTA &= ~(1 << PA4)  ; PORTA |= (1 << PA5)  ;PORTA |= (1 << PA6);           break;   //110
                          case 3:   PORTA |= (1 << PA4)  ; PORTA |= (1 << PA5)  ;PORTA |= (1 << PA6);           break;   //111
                          case 4:   PORTA |= (1 << PA4)  ; PORTA |= (1 << PA5)  ;PORTA |= (1 << PA6);           break;   //111,重复一次,否则111时候的按键检测不到
                          default:break;
                          }
                          
                          now_key =PINA & (1 << PA7);
                          now_key >>=7;
                          
          switch(statuse)
          {
           case 0: if(now_key == 0)     //有键按下
                                      {
                                         statuse = 1;
                                        key_value = 0xf0;            //这个值是为了区分按键正常时候的状态,根据自己要求来。
                                        disp_en = 0;             ///////disp_en = 按键不扫描,数码管不显示 =1按键扫描,数码管正常显示
                                }
                                else
                                {
                                         disp_en = 1;
                                         if(++scan_f >20 )      ////扫描一次查询20次
                                        {
                                         scan_f = 0;
                                         key_cnt ++;
                                        }
                                 
                                 statuse = 0;
                                 key_value = 0xff;
                                 
                                }       
                                break;
                case 1: if(now_key == 0)        //延时去抖
                                      {
                                  statuse = 2;
                                  key_value = 0xf0;
                                }
                                else
                                {
                                 statuse = 0;
                                 key_value = 0xff;
                                }       
                                disp_en = 0;
                                break;
                case 2: if(now_key == 1)     //按键松开
                                 {
                                 key_value = key_cnt;
                                 statuse = 0;
                                }
                                else
                                {
                                 key_value  = 0xf0;
                                 statuse = 2;
                                }
                                disp_en = 0;
                                break;
           default:
           key_value = 0xff;
           break;
          }

          return key_value;
  

}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表