独闷闷网

 找回密码
 立即注册
搜索
查看: 2254|回复: 0
收起左侧

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

[复制链接]
发表于 2015-2-2 23:35:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
小琪-山东:

  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. }
复制代码


乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2024-11-11 13:11 , Processed in 0.147834 second(s), 18 queries .

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