搜索
bottom↓
回复: 20

给我一个C思路,简单事情不重复

[复制链接]

出0入0汤圆

发表于 2009-9-5 18:16:45 | 显示全部楼层 |阅读模式
马老师好!各位好!我有一个简单的问题请教各位:
我现在要逐个检测多个输入端口,处理相应的事件。
比如
if(PINB.1)
{
  //TO DO
}
else
{
.....
}
if(PINB.2)
{
  //TO DO
}
else
{
.....
}
所做的事情是一样的,而且要分时处理,只是端口不一样,该如何把端口作为参数传递,谢谢!

出0入0汤圆

发表于 2009-9-5 18:54:31 | 显示全部楼层
弄个掩码表和指针函数表就可以了,然后在循环中用端口的数据与逐个与掩码表相与,然后根据结果调用函数表

出0入0汤圆

 楼主| 发表于 2009-9-5 21:24:13 | 显示全部楼层
掩码表是什么,请1楼的讲仔细点,帮我写一个伪代码好吗,谢谢!

出0入0汤圆

发表于 2009-9-6 01:51:31 | 显示全部楼层
if(PINB & MARK)
{
}
else
{
}

出0入618汤圆

发表于 2009-9-6 03:58:13 | 显示全部楼层
掩码表好处是可以改变MASK数组中掩码的顺序来控制端口的处理顺序:

static const unsigned char MASK[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

unsigned char n;

for (n = 0; n < 8; n++)
{
  if (PINB & MASK[n])
  {
    // TODO
  }
  else
  {
    // TODO
  }
}


如果端口是按顺序读的,以上代码可以简化成这样:

unsigned char mask;

for (mask = 1; mask != 0; mask <<= 1)
{
  if (PINB & mask)
  {
    // TODO
  }
  else
  {
    // TODO
  }
}

出0入0汤圆

 楼主| 发表于 2009-9-6 11:05:36 | 显示全部楼层
明白了 谢谢各位讲解,谢谢!

出0入0汤圆

发表于 2009-9-9 22:38:25 | 显示全部楼层
受教啊

出0入0汤圆

发表于 2009-9-10 12:25:05 | 显示全部楼层
这个不错。要的就是思路

出0入0汤圆

发表于 2009-9-18 09:51:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-18 12:27:34 | 显示全部楼层
好,受教了

出0入10汤圆

发表于 2009-9-18 13:40:39 | 显示全部楼层
思路好

出0入0汤圆

发表于 2009-9-18 13:42:13 | 显示全部楼层
armok

出0入0汤圆

发表于 2009-9-22 16:58:05 | 显示全部楼层
好思路,受启发!

出0入0汤圆

发表于 2009-9-22 17:56:39 | 显示全部楼层
for(i = 0; i<8; i++)
{
  if(PINB &= 1<<i)
  {
   ;
  }
  else
  ;
}

出0入4汤圆

发表于 2009-9-22 18:03:53 | 显示全部楼层

出0入618汤圆

发表于 2009-9-22 18:03:57 | 显示全部楼层
13楼的,AVR移位只能一位一位地移,考虑过这个问题没?

出0入0汤圆

发表于 2009-9-22 21:11:06 | 显示全部楼层
受教了

出0入0汤圆

发表于 2009-9-26 09:28:22 | 显示全部楼层
学习思路了。

出0入0汤圆

发表于 2009-10-9 00:56:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-9 08:54:30 | 显示全部楼层
TO 15L :为什么说AVR只能一位一位的移?我试了13楼的方法是可行的(用PROTUES仿真的)

出0入618汤圆

发表于 2009-10-9 17:50:43 | 显示全部楼层
【19楼】 laolu

可行是可行,你单步跟踪一下汇编指令就知道怎么回事了。
因为AVR一次只能移一位,1<<i这个操作,编译器是用循环来做的,最坏情况i=8时,要几十个指令周期才能完成,效率比较低。
我4楼第二个方法中,mask<<=1每次移一位,其实是将移位和大循环结合在一起了,省去了大循环中的小循环。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 14:09

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

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