在设计硬件电路的时候,稍有马虎,就有可能把 8 位接口的口线序号弄反了。
比如,本打算用 P3.0~P3.7 连接到 D0~D7 的,
一不小心,却把 P3.7~P3.0 连接到 D0~D7 了。
可参考下图:
图中的上部,是正确的接法。而在设计电路板的时候,却用了下部的接法。
电路板已经做好,想要更改,是不可能的。这时就需要在软件方面来解决。
也就是说,在硬件设计时,是把 8 条线,全弄拧了。因此就需要在软件中,用一个函数,把 8 位数,再拧回来。呵呵
请看下面的函数:
uchar num(uchar dat)
{
uchar val;
val = ((dat & 0x01) << 7) | ((dat & 0x02) << 5) | ((dat & 0x04) << 3) | ((dat & 0x08) << 1) |
((dat & 0x10) >> 1) | ((dat & 0x20) >> 3) | ((dat & 0x40) >> 5) | ((dat & 0x80) >> 7);
return val;
}
在这个函数中,即实现了把 dat 中的
第 7 位和第 0 位交换、
第 6 位和第 1 位交换、
第 5 位和第 2 位交换、
第 4 位和第 3 位交换。
使用这个函数,就可以解决接口序号弄反的问题。
这个函数,来自于:百度知道的题目
这个函数,不怎么好,比较冗长,执行起来,也不算快。不值得推荐。
做而论道写了一个函数如下:
char x_shift (char x)
{
char i = 0, y = 0;
for ( ; i < 8; i++) if (x & (1 << i)) y += (128 >> i);
reture y;
}
在这个函数中,使用了循环结构,所以,生成的程序代码,就会简短得多。
同时,在函数中,使用了 if else 分支结构,这就会根据具体的问题,越过某一段代码,使得执行速度得以提高。
上述两个函数,做而论道都做过检验,都是好用的。各位网友可以放心使用。
--本文完--