独闷闷网

标题: 单片机的IO口可以作为函数的形参吗?如果想要很多IO口共用一段代码怎么办?已解答。 [打印本页]

作者: jianhong_wu    时间: 2015-2-2 23:35
标题: 单片机的IO口可以作为函数的形参吗?如果想要很多IO口共用一段代码怎么办?已解答。
小琪-山东:

  1. int keytest()
  2. {
  3.          uint key_temp=0;
  4.         if(key==0)
  5.         {
  6.                 delayms(50);
  7.                 if(key==0)
  8.                 {
  9.                

  10.                         key_temp=1;
  11.                                         
  12.                 }

  13.                  
  14.         }
  15.          while(key==0);
  16.   return key_temp;

  17. }
复制代码

为什么这个按键检测单独能用我把它写成
  1. int keytest(uint in_sr)
  2. {
  3.          uint key_temp=0;
  4.         if(in_sr==0)
  5.         {
  6.                 delayms(50);
  7.                 if(in_sr==0)
  8.                 {
  9.                

  10.                         key_temp=1;
  11.                                         
  12.                 }

  13.                  
  14.         }
  15.          while(in_sr==0);
  16.   return key_temp;

  17. }
复制代码

就不行了呢?我总不能一个按键写一次吧,郁闷死了。单独用能行,在函数里加上行参后就不能用了.


鸿哥-深圳:
形参是一个IO口的bit变量,所以不符合C语言规则,一般都不会用某个IO口作为形参的.
你想key_sec=keytest(P1^0)这样用,这样是妄想的。

小琪-山东:
那怎么办啊?我总不能一个按键写一次按键检测吧?

鸿哥-深圳:
我本人还是建议你把按键分开一个一个写比较好,不要企图去压缩代码。当然,你这个按键识别按键松开的方法和加delay消抖动的方法很多网友是不认可的,尤其是最后那个while(in_sr==0)。先不讨论这个问题,我先帮你改改你想要的结果,大概IO口复用代码的思路如下:

  1. sbit P1_0=P1^0;
  2. sbit P1_1=P1^1;
  3. sbit P1_2=P1^2;



  4. unsigned char key(unsigned char ucWhichKey)
  5. {
  6.   unsigned char ucKeyReturn=1;
  7.   switch(ucWhichKey)
  8.   {
  9.      case 10:  //P1.0
  10.          if(P1_0==0)
  11.          {
  12.              ucKeyReturn=0;
  13.          }
  14.          else
  15.          {
  16.              ucKeyReturn=1;
  17.          }
  18.          break;
  19.      case 11:  //P1.1
  20.          if(P1_1==0)
  21.          {
  22.              ucKeyReturn=0;
  23.          }
  24.          else
  25.          {
  26.              ucKeyReturn=1;
  27.          }
  28.          break;
  29.      case 12:  //P1.2
  30.          if(P1_2==0)
  31.          {
  32.              ucKeyReturn=0;
  33.          }
  34.          else
  35.          {
  36.              ucKeyReturn=1;
  37.          }
  38.          break;
  39.     // 继续往下添加你的IO口
  40.   }

  41.   return ucKeyReturn;
  42. }

  43. int keytest(unsigned char ucWhichKey)
  44. {
  45.          uint key_temp=0;
  46.         if(key(ucWhichKey)==0)
  47.         {
  48.                 delayms(50);
  49.                 if(key(ucWhichKey)==0)
  50.                 {
  51.                

  52.                         key_temp=1;
  53.                                         
  54.                 }

  55.                  
  56.         }
  57.          while(key(ucWhichKey)==0);
  58.   return key_temp;

  59. }
复制代码







欢迎光临 独闷闷网 (http://www.dumenmen.com/) Powered by Discuz! X3.2