NewNew 发表于 2009-9-5 18:16:45

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

马老师好!各位好!我有一个简单的问题请教各位:
我现在要逐个检测多个输入端口,处理相应的事件。
比如
if(PINB.1)
{
//TO DO
}
else
{
.....
}
if(PINB.2)
{
//TO DO
}
else
{
.....
}
所做的事情是一样的,而且要分时处理,只是端口不一样,该如何把端口作为参数传递,谢谢!

tomhe666 发表于 2009-9-5 18:54:31

弄个掩码表和指针函数表就可以了,然后在循环中用端口的数据与逐个与掩码表相与,然后根据结果调用函数表

NewNew 发表于 2009-9-5 21:24:13

掩码表是什么,请1楼的讲仔细点,帮我写一个伪代码好吗,谢谢!

STM32_Study 发表于 2009-9-6 01:51:31

if(PINB & MARK)
{
}
else
{
}

gzhuli 发表于 2009-9-6 03:58:13

掩码表好处是可以改变MASK数组中掩码的顺序来控制端口的处理顺序:

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

unsigned char n;

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


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

unsigned char mask;

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

NewNew 发表于 2009-9-6 11:05:36

明白了 谢谢各位讲解,谢谢!

qzf368 发表于 2009-9-9 22:38:25

受教啊

bg6agf 发表于 2009-9-10 12:25:05

这个不错。要的就是思路

51hubao 发表于 2009-9-18 09:51:00

mark

xad74 发表于 2009-9-18 12:27:34

好,受教了

ylei12 发表于 2009-9-18 13:40:39

思路好

googse 发表于 2009-9-18 13:42:13

armok

longfeixue 发表于 2009-9-22 16:58:05

好思路,受启发!

Forever.c 发表于 2009-9-22 17:56:39

for(i = 0; i<8; i++)
{
if(PINB &= 1<<i)
{
   ;
}
else
;
}

fulitun 发表于 2009-9-22 18:03:53

gzhuli 发表于 2009-9-22 18:03:57

13楼的,AVR移位只能一位一位地移,考虑过这个问题没?

win100 发表于 2009-9-22 21:11:06

受教了

jacobson 发表于 2009-9-26 09:28:22

学习思路了。

397379140 发表于 2009-10-9 00:56:37

mark

laolu 发表于 2009-10-9 08:54:30

TO 15L :为什么说AVR只能一位一位的移?我试了13楼的方法是可行的(用PROTUES仿真的)

gzhuli 发表于 2009-10-9 17:50:43

【19楼】 laolu

可行是可行,你单步跟踪一下汇编指令就知道怎么回事了。
因为AVR一次只能移一位,1<<i这个操作,编译器是用循环来做的,最坏情况i=8时,要几十个指令周期才能完成,效率比较低。
我4楼第二个方法中,mask<<=1每次移一位,其实是将移位和大循环结合在一起了,省去了大循环中的小循环。
页: [1]
查看完整版本: 给我一个C思路,简单事情不重复