给我一个C思路,简单事情不重复
马老师好!各位好!我有一个简单的问题请教各位:我现在要逐个检测多个输入端口,处理相应的事件。
比如
if(PINB.1)
{
//TO DO
}
else
{
.....
}
if(PINB.2)
{
//TO DO
}
else
{
.....
}
所做的事情是一样的,而且要分时处理,只是端口不一样,该如何把端口作为参数传递,谢谢! 弄个掩码表和指针函数表就可以了,然后在循环中用端口的数据与逐个与掩码表相与,然后根据结果调用函数表 掩码表是什么,请1楼的讲仔细点,帮我写一个伪代码好吗,谢谢! if(PINB & MARK)
{
}
else
{
} 掩码表好处是可以改变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
}
} 明白了 谢谢各位讲解,谢谢! 受教啊 这个不错。要的就是思路 mark 好,受教了 思路好 armok 好思路,受启发! for(i = 0; i<8; i++)
{
if(PINB &= 1<<i)
{
;
}
else
;
} 强 13楼的,AVR移位只能一位一位地移,考虑过这个问题没? 受教了 学习思路了。 mark TO 15L :为什么说AVR只能一位一位的移?我试了13楼的方法是可行的(用PROTUES仿真的) 【19楼】 laolu
可行是可行,你单步跟踪一下汇编指令就知道怎么回事了。
因为AVR一次只能移一位,1<<i这个操作,编译器是用循环来做的,最坏情况i=8时,要几十个指令周期才能完成,效率比较低。
我4楼第二个方法中,mask<<=1每次移一位,其实是将移位和大循环结合在一起了,省去了大循环中的小循环。
页:
[1]