三国小兵 发表于 2018-1-11 10:15:06

按键部分程序不理解,请大家帮忙看下

void key_scan(void)
       {
      
                     present_key_dig++;
                  if(present_key_dig>=3900)//延时?
                      present_key_dig=1;
      
         if(key_down)
                   return;
          if(pre_key_dig!=present_key_dig)
                {if(pre_key_dig!=0)return;
                     else prekey=0; //松手检测?
                }
         elseif( pre_key_dig==present_key_dig)   prekey=1;
         if(P3.4&&!P12.2&&!P12.1)
               {   
               
                  keyesc=0;
                  pre_key_dig=0;
                  present_key_dig=1;
               
                  return;
               }
          else if( !P3.4&&P12.2&&P12.1)
                         keyesc=1;
                        
               
            if(keyesc)
                   {
                           
                   return; }
                  
            else if(!prekey)
                  {
                     pre_key_dig=present_key_dig;
                  
                     return;
                      }
                     if(!P3.4)
                         {
                           
                           if(debuge_f==0)
                              {
                               key_down=1;
                              debuge_f=1;
                              
                              on_led=1;
                                  off_led=0;
                                  out_set=0;
                                 
                                 
                              
                              }
                              
                              
                           else
                               {
                                 debuge_f=0;
                                 key_down=1;
                                 l_move_t=0;
                                 l_move_s=0;
                                 
                                 
                                 
                                 
                                 
                               }   
                              
                              
                         }
                        
                      else if(P12.2&&debuge_f)
                           {
                              if(l_move_s>=4)l_move_s=0;
                                  l_move_s++;
                               debug_s_f=1;
                                 wr_f=1;
                              debug_t_f=0;
                              key_down=1;
                              l_move_t=0;
                              
                              
                           }
                      else if(P12.1&&debuge_f)
                        {
                           
                              if(l_move_t>=2)l_move_t=0;
                              l_move_t++;
                              debug_t_f=1;
                              debug_s_f=0;
                               l_move_s=0;
                              key_down=1;
                              wr_f=1;
                              
                           
                        }
                        
                         keyesc=1; //??
                           
                           
         
   }

三国小兵 发表于 2018-1-11 10:16:13

pre_key_dig      keyesc=1表示什么含义,没看明白

三国小兵 发表于 2018-1-11 10:17:16


void key_scan(void)
       {
      
                     present_key_dig++;
                  if(present_key_dig>=3900)//延时?
                      present_key_dig=1;
      
         if(key_down)
                   return;
          if(pre_key_dig!=present_key_dig)
                {if(pre_key_dig!=0)return;
                     else prekey=0; //松手检测?
                }
         elseif( pre_key_dig==present_key_dig)   prekey=1;
         if(P3.4&&!P12.2&&!P12.1)
               {   
               
                  keyesc=0;
                  pre_key_dig=0;
                  present_key_dig=1;
               
                  return;
               }
          else if( !P3.4&&P12.2&&P12.1)
                         keyesc=1;
                        
               
            if(keyesc)
                   {
                           
                   return; }
                  
            else if(!prekey)
                  {
                     pre_key_dig=present_key_dig;
                  
                     return;
                      }
                     if(!P3.4)
                         {
                           
                           if(debuge_f==0)
                              {
                               key_down=1;
                              debuge_f=1;
                              
                              on_led=1;
                                  off_led=0;
                                  out_set=0;
                                 
                                 
                              
                              }
                              
                              
                           else
                               {
                                 debuge_f=0;
                                 key_down=1;
                                 l_move_t=0;
                                 l_move_s=0;
                                 
                                 
                                 
                                 
                                 
                               }   
                              
                              
                         }
                        
                      else if(P12.2&&debuge_f)
                           {
                              if(l_move_s>=4)l_move_s=0;
                                  l_move_s++;
                               debug_s_f=1;
                                 wr_f=1;
                              debug_t_f=0;
                              key_down=1;
                              l_move_t=0;
                              
                              
                           }
                      else if(P12.1&&debuge_f)
                        {
                           
                              if(l_move_t>=2)l_move_t=0;
                              l_move_t++;
                              debug_t_f=1;
                              debug_s_f=0;
                               l_move_s=0;
                              key_down=1;
                              wr_f=1;
                              
                           
                        }
                        
                         keyesc=1; //??
                           
                           
         
   }

三国小兵 发表于 2018-1-11 10:18:03

重新排版了下,

xiaobendan 发表于 2018-1-11 16:10:16

小声的问下,这是什么CPU?还有P12?

xiaobendan 发表于 2018-1-11 16:18:43

写的很分散,也繁琐,帮你整理了一下。
void key_scan(void){   
present_key_dig++;
if(present_key_dig>=3900)present_key_dig=1; //延时?
if(key_down)return;
if(pre_key_dig!=present_key_dig){
        if(pre_key_dig!=0)return;else prekey=0; //松手检测?
        }else if( pre_key_dig==present_key_dig) prekey=1;
if(P3.4&&!P12.2&&!P12.1){
        keyesc=0;
        pre_key_dig=0;
        present_key_dig=1;
        return;
        }else if( !P3.4&&P12.2&&P12.1) keyesc=1;
if(keyesc){
        return;
        }else if(!prekey){
           pre_key_dig=present_key_dig;
           return;
           }
if(!P3.4){
       if(debuge_f==0){
                key_down=1;
                debuge_f=1;
                on_led=1;
          off_led=0;
          out_set=0;
           }else{
             debuge_f=0;
             key_down=1;
             l_move_t=0;
             l_move_s=0;
          }
        }else if(P12.2&&debuge_f){
             if(l_move_s>=4)l_move_s=0;
                l_move_s++;
                debug_s_f=1;
                 wr_f=1;
             debug_t_f=0;
             key_down=1;
             l_move_t=0;
             }else if(P12.1&&debuge_f){
             if(l_move_t>=2)l_move_t=0;
             l_move_t++;
             debug_t_f=1;
             debug_s_f=0;
                l_move_s=0;
             key_down=1;
             wr_f=1;
                  }
keyesc=1; //
}

三个IO是接三个按键?为何有低有效,有高有效?KEY_DOWN在被=1后,没地方=0。
前边有个不等于,这里pre_key_dig==present_key_dig再==有意思?

kcfoo1 发表于 2018-1-12 15:00:01

xiaobendan 发表于 2018-1-11 16:18
写的很分散,也繁琐,帮你整理了一下。

三个IO是接三个按键?为何有低有效,有高有效?KEY_DOWN在被=1后, ...

KEY_DOWN应该是个标志,等待后面的按键处理程序识别后清零,pre_key_dig估计也是个标志,外面的程序处理完后就置1,避免按键还没松开程序又去处理一次,程序里使用了大量外部标志,可读性和通用性极差,lz没必要借鉴

xiaobendan 发表于 2018-1-12 16:00:56

kcfoo1 发表于 2018-1-12 15:00
KEY_DOWN应该是个标志,等待后面的按键处理程序识别后清零,pre_key_dig估计也是个标志,外面的程序处理 ...

是,可读性不太好
楼主还是参考一下以前那个老师发的状态机的方法比较好

Ilove51andAVR 发表于 2018-1-12 16:20:02

楼主,你的程序可读性真不太好啊,没有注释,大家没动力帮你分析啊{:lol:}

NFC 发表于 2018-1-12 16:39:13

xiaobendan 发表于 2018-1-12 16:00
是,可读性不太好
楼主还是参考一下以前那个老师发的状态机的方法比较好 ...

哪个老师发的状态机啊?
关键字是什么,我也学习下状态机,谢谢!

EMC菜鸟 发表于 2018-1-12 17:03:54

这个按键程序看得真叫人蛋疼,,,实在是想不通要实现什么按键功能、把代码写的如此复杂?

xiaobendan 发表于 2018-1-12 17:50:22

NFC 发表于 2018-1-12 16:39
哪个老师发的状态机啊?
关键字是什么,我也学习下状态机,谢谢!

上次发帖一下忘了老师姓啥了,马老师啊,老前辈了。果然人到40往后脑子 不行了。
搜索状态机按键,有很多可以参考的东西啊

NFC 发表于 2018-1-15 08:51:33

xiaobendan 发表于 2018-1-12 17:50
上次发帖一下忘了老师姓啥了,马老师啊,老前辈了。果然人到40往后脑子 不行了。
搜索状态机按键,有很多 ...

感谢。我写按键程序也和楼主差不多,只是可读性强一些。总是把按键功能写在按键里面,显得很混乱,也学习下状态机。

三国小兵 发表于 2018-1-15 09:09:03

好的,我去参考参考,搜索下,

zyw19987 发表于 2018-1-17 14:59:45

这样的代码没有看的必要
页: [1]
查看完整版本: 按键部分程序不理解,请大家帮忙看下