我想知道如何将并行端口上的数据引脚设置为高电平和低电平。我相信我可以使用PyParallel,但我不确定如何设置特定的引脚。
谢谢!
答案 0 :(得分:2)
您在这里谈论的是软件 - 硬件接口。它们通常通过为寄存器分配1字节值来设置为低电平和高电平。 parallel port有8个引脚可供数据传输。在像C,C ++这样的低级语言中,会有一个寄存器,我们称之为'A',某处有8位对应8个数据引脚。例如:
假设resgister A设置为引脚:[7,6,5,4,3,2,1,0]
类似C的伪代码
A=0x00 // all pins are set low
A=0xFF // all pins are high
A=0xF0 // Pins 0:3 are low, Pins 4:7 are high
这个想法贯穿于PyParallel
import parallel
p = parallel.Parallel() # open LPT1
p.setData(0x55) #<--- this is your bread and butter here
p.setData是你感兴趣的函数。转换为二进制的0x55是
0b01010101
- 或 -
[L H L H L H L H]
所以现在你可以将数据设置为某个字节,但是我如何发送一堆数据......让我们说3个字节0x00,0x01,0x02?那么你需要在接收机确认收到刚发送的东西时观察确认线。
天真的实施:
data=[0x00, 0x01, 0x02]
while data:
onebyte=data.pop()
p.setDataStrobe('low') #signal that we're sending data
p.setData(onebyte)
while p.getInAcknowledge() == 'high': #wait for this line to go 'low'
# to indicate an ACK
pass #we're waiting for it to acknowledge...
p.setDataStrobe('high')#Ok, we're done sending that byte.
好的,这并没有直接回答你的问题。让我们说我只想将引脚5设置为高电平或低电平。也许我在那个引脚上有一个LED。那你只需要一些二进制操作。
portState = 0b01100000 #Somehow the parallel port has this currently set
newportState = portState | 0b00010000#<-- this is called a bitmask
print newportState
>>> 0b011*1*0000
现在让我们清楚一下......
newportState = 0b01110000
clearedPin5 = newportState & 11101111
print clearedPin5
>>> 0b011*0*0000
如果这些二进制操作是外来的,我建议在avrfreaks上使用这个优秀的tutorial。在进一步发展之前,我会与他们保持亲密关系。像这样的嵌入式软件概念充满了位掩码和位移。
答案 1 :(得分:1)
我已经使这个功能单独控制引脚(代码来自here和here):
def setPin(pin,value):
if(pin==1):
p.setDataStrobe(value)
elif(pin>=2 and pin<=9):
pin = pin-2
if(value==0):
# clear the bit
p.setData(p.getData() & (255 - pow(2, pin)))
else:
#set the bit
p.setData(p.getData() | pow(2, pin))
elif(pin==14):
p.setAutoFeed(value)
elif(pin==16):
p.setInitOut(value)
elif(pin==17):
p.setSelect(value)
else:
raise(ValueError("invalid pin number"))