所以我对并行端口很新,我一直在研究这段代码 - >> http://pyserial.svn.sourceforge.net/viewvc/pyserial/trunk/pyparallel/examples/lcd.py?revision=49&view=markup
我很困惑这里发生了什么
def reveseout(self, x):
r = ((x & (1<<0) and 1) << 7) |\
((x & (1<<1) and 1) << 6) |\
((x & (1<<2) and 1) << 5) |\
((x & (1<<3) and 1) << 4) |\
((x & (1<<4) and 1) << 3) |\
((x & (1<<5) and 1) << 2) |\
((x & (1<<6) and 1) << 1) |\
((x & (1<<7) and 1) << 0)
#print "%02x" % r, "%02x" %x
self.p.setData(r)
我理解它是反转引脚,但我不理解语法本身以及字面意思。
非常感谢任何帮助谢谢!
答案 0 :(得分:6)
让我们一块一块:1<<n
左移1个n位,所以这些值给出了0x01,0x02,0x04,0x08,0x10等位,字节。 x & (1<<n)
被x掩盖了该位,因此我们得到x的各个位。 x & (1<<n) and 1
很棘手:如果该位在x中设置,那么它将作为第二个参数进行计算,它将为1.如果该位未在x中设置,则它将为零。因此,如果该位在x中设置,则x & (1<<n) and 1
为1,否则为0。
(x & (1<<n) and 1) << m
取零或一个并将其移到左边的m个位置,因此它基本上复制了第n个位并将其置于第m位。八行使用0和7表示n和m,然后是1和6,然后是2和5等,因此我们得到8个值。第一个是第7位的第0位,然后是第6位的第1位,依此类推。最后,它们全部或与|
一起构建一个字节,反转位。