搜索
bottom↓
回复: 14

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

[复制链接]

出0入0汤圆

发表于 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; //松手检测?
                }
         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; //??
                           
                           
         
     }

出0入0汤圆

 楼主| 发表于 2018-1-11 10:16:13 | 显示全部楼层
pre_key_dig      keyesc=1表示什么含义,没看明白

出0入0汤圆

 楼主| 发表于 2018-1-11 10:17:16 | 显示全部楼层

  1. void key_scan(void)
  2.        {
  3.       
  4.                      present_key_dig++;
  5.                     if(present_key_dig>=3900)  //延时?
  6.                       present_key_dig=1;
  7.       
  8.          if(key_down)
  9.                    return;
  10.           if(pre_key_dig!=present_key_dig)
  11.                 {  if(pre_key_dig!=0)return;
  12.                      else prekey=0; //松手检测?
  13.                 }
  14.          else  if( pre_key_dig==present_key_dig)   prekey=1;
  15.          if(P3.4&&!P12.2&&!P12.1)
  16.                {   
  17.                
  18.                     keyesc=0;
  19.                     pre_key_dig=0;
  20.                     present_key_dig=1;
  21.                
  22.                     return;
  23.                  }
  24.           else if( !P3.4&&P12.2&&P12.1)
  25.                          keyesc=1;
  26.                         
  27.                
  28.             if(keyesc)
  29.                    {
  30.                              
  31.                    return; }
  32.                   
  33.             else if(!prekey)
  34.                     {
  35.                      pre_key_dig=present_key_dig;
  36.                     
  37.                        return;
  38.                       }
  39.                        if(!P3.4)
  40.                          {
  41.                            
  42.                            if(debuge_f==0)
  43.                               {
  44.                                key_down=1;
  45.                                 debuge_f=1;
  46.                                 
  47.                                 on_led=1;
  48.                                   off_led=0;
  49.                                   out_set=0;
  50.                                  
  51.                                  
  52.                                 
  53.                               }
  54.                               
  55.                               
  56.                            else
  57.                                {
  58.                                  debuge_f=0;
  59.                                  key_down=1;
  60.                                  l_move_t=0;
  61.                                  l_move_s=0;
  62.                                  
  63.                                  
  64.                                  
  65.                                  
  66.                                  
  67.                                }   
  68.                               
  69.                               
  70.                          }
  71.                         
  72.                       else if(P12.2&&debuge_f)
  73.                            {
  74.                               if(l_move_s>=4)l_move_s=0;
  75.                                   l_move_s++;
  76.                                debug_s_f=1;
  77.                                  wr_f=1;
  78.                               debug_t_f=0;
  79.                               key_down=1;
  80.                               l_move_t=0;
  81.                               
  82.                               
  83.                            }
  84.                       else if(P12.1&&debuge_f)
  85.                           {
  86.                              
  87.                               if(l_move_t>=2)l_move_t=0;
  88.                               l_move_t++;
  89.                               debug_t_f=1;
  90.                               debug_s_f=0;
  91.                                l_move_s=0;
  92.                               key_down=1;
  93.                               wr_f=1;
  94.                               
  95.                              
  96.                           }
  97.                         
  98.                          keyesc=1; //??
  99.                            
  100.                            
  101.          
  102.      }
复制代码

出0入0汤圆

 楼主| 发表于 2018-1-11 10:18:03 | 显示全部楼层
重新排版了下,

出0入0汤圆

发表于 2018-1-11 16:10:16 | 显示全部楼层
小声的问下,这是什么CPU?还有P12?

出0入0汤圆

发表于 2018-1-11 16:18:43 | 显示全部楼层
写的很分散,也繁琐,帮你整理了一下。
  1. void key_scan(void){   
  2. present_key_dig++;
  3. if(present_key_dig>=3900)present_key_dig=1; //延时?
  4. if(key_down)return;
  5. if(pre_key_dig!=present_key_dig){
  6.         if(pre_key_dig!=0)return;else prekey=0; //松手检测?
  7.         }else if( pre_key_dig==present_key_dig) prekey=1;
  8. if(P3.4&&!P12.2&&!P12.1){  
  9.         keyesc=0;
  10.         pre_key_dig=0;
  11.         present_key_dig=1;
  12.         return;
  13.         }else if( !P3.4&&P12.2&&P12.1) keyesc=1;
  14. if(keyesc){
  15.         return;
  16.         }else if(!prekey){
  17.            pre_key_dig=present_key_dig;
  18.            return;
  19.            }
  20. if(!P3.4){
  21.          if(debuge_f==0){
  22.                 key_down=1;
  23.                 debuge_f=1;
  24.                 on_led=1;
  25.             off_led=0;
  26.             out_set=0;
  27.            }else{
  28.              debuge_f=0;
  29.              key_down=1;
  30.              l_move_t=0;
  31.              l_move_s=0;
  32.             }
  33.         }else if(P12.2&&debuge_f){
  34.                if(l_move_s>=4)l_move_s=0;
  35.                   l_move_s++;
  36.                 debug_s_f=1;
  37.                  wr_f=1;
  38.                debug_t_f=0;
  39.                key_down=1;
  40.                l_move_t=0;
  41.              }else if(P12.1&&debuge_f){
  42.                if(l_move_t>=2)l_move_t=0;
  43.                l_move_t++;
  44.                debug_t_f=1;
  45.                debug_s_f=0;
  46.                 l_move_s=0;
  47.                key_down=1;
  48.                wr_f=1;
  49.                     }
  50. keyesc=1; //
  51. }
复制代码

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

出0入4汤圆

发表于 2018-1-12 15:00:01 | 显示全部楼层
xiaobendan 发表于 2018-1-11 16:18
写的很分散,也繁琐,帮你整理了一下。

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

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2018-1-12 16:20:02 | 显示全部楼层
楼主,你的程序可读性真不太好啊,没有注释,大家没动力帮你分析啊

出0入0汤圆

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

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

出5入14汤圆

发表于 2018-1-12 17:03:54 | 显示全部楼层
这个按键程序看得真叫人蛋疼,,,实在是想不通要实现什么按键功能、把代码写的如此复杂?

出0入0汤圆

发表于 2018-1-12 17:50:22 | 显示全部楼层
NFC 发表于 2018-1-12 16:39
哪个老师发的状态机啊?
关键字是什么,我也学习下状态机,谢谢!

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

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2018-1-15 09:09:03 | 显示全部楼层
好的,我去参考参考,搜索下,

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-20 05:40

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

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