本帖最后由 naiqiqnus 于 2012-7-12 09:38 编辑
经常会碰到这样的事情:
这个项目要用A端口,下个项目要用B端口,资源有限,或者考虑布板图方便,不得不用一些凌乱的IO作为指示灯、继电器输出,若果就几个还好说,当有30多个IO需要调整时,头就大了。
我想到的方法,大家分享一下:
#define sAdd(x,y) x ## y // 宏命令 合并字符串 举例:sAdd(PORT,A) 等价于 PORTA
#define SetOn(x,y) sAdd(PORT,x)|=(1<<y)
#define SetOff(x,y) sAdd(PORT,x)&=~(1<<y)
#define SuperSet(x,y,a,b); {if(x&(1<<y))SetOn(a,b);else SetOff(a,b);}
void OUT_Init(void)
{
DDRG|=0x1f;
DDRF|=0xff;
DDRA|=0xff;
DDRC|=0xff;
DDRD|=0xf3;
}
void OUT(unsigned char a[])
{
SuperSet(a[0],0,G,4);//1-8
SuperSet(a[0],1,D,0);
SuperSet(a[0],2,D,1);
SuperSet(a[0],3,D,4);
SuperSet(a[0],4,D,5);
SuperSet(a[0],5,D,6);
SuperSet(a[0],6,D,7);
SuperSet(a[0],7,G,0);
SuperSet(a[1],0,G,1);//9-16
SuperSet(a[1],1,C,0);
SuperSet(a[1],2,C,1);
SuperSet(a[1],3,C,2);
SuperSet(a[1],4,C,3);
SuperSet(a[1],5,C,4);
SuperSet(a[1],6,C,5);
SuperSet(a[1],7,C,6);
SuperSet(a[2],0,C,7);//17-24
SuperSet(a[2],1,G,2);
SuperSet(a[2],2,A,7);
SuperSet(a[2],3,A,6);
SuperSet(a[2],4,A,5);
SuperSet(a[2],5,A,4);
SuperSet(a[2],6,A,3);
SuperSet(a[2],7,A,2);
SuperSet(a[3],0,A,1);//25-32
SuperSet(a[3],1,A,0);
SuperSet(a[3],2,F,7);
SuperSet(a[3],3,F,6);
SuperSet(a[3],4,F,5);
SuperSet(a[3],5,F,4);
SuperSet(a[3],6,F,3);
SuperSet(a[3],7,F,2);
SuperSet(a[4],0,G,3);//0
}
也许你有更好的办法,说出来大家分享一下!
|