Python set Parallel Port data pins high/low
Question: I am wondering how to set the data pins on a parallel port high and low. I
believe I could use PyParallel for this, but I am unsure how to set a specific
pin.

Thanks!


Answer: You're talking about a software-hardware interface here. They are usually set
low and high by assigning a 1-byte value to a register. A [parallel
port](http://en.wikipedia.org/wiki/Parallel_port) has 8 pins for data to
travel across. In a low level language like C, C++, there would be a register,
lets call it 'A', somewhere holding 8 bits corresponding to the 8 pins of
data. So for example:

Assuming resgister A is setup like pins: [7,6,5,4,3,2,1,0]

C-like pseudocode

    
    
    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
    

This idea follows through with
[PyParallel](http://en.wikipedia.org/wiki/Parallel_port)

    
    
    import parallel
    p = parallel.Parallel() # open LPT1
    p.setData(0x55) #<--- this is your bread and butter here  
    

p.setData is the function you're interested in. 0x55 converted to binary is

0b01010101

-or- 

[L H L H L H L H]

So now you can set the data to a certain byte, but how would I sent a bunch of
data... lets say 3 bytes 0x00, 0x01, 0x02? Well you need to watch the ack line
for when the receiving machine has confirmed receipt of whatever was just
sent.

A naive implementation:

    
    
    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.
    

Ok, that doesn't directly answer your question. Lets say i ONLY want to set
pin 5 high or low. Maybe I have an LED on that pin. Then you just need a bit
of binary operations.

    
    
    portState = 0b01100000 #Somehow the parallel port has this currently set
    newportState = portState | 0b00010000#<-- this is called a bitmask
    print newportState 
    >>> 0b011*1*0000
    

Now lets clear that bit...

    
    
    newportState = 0b01110000
    clearedPin5 = newportState & 11101111
    print clearedPin5
    >>> 0b011*0*0000
    

If these binary operations are foreign, I recommend this excellent
[tutorial](http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=40348&highlight=programming%20101#40348)
over on avrfreaks. I would become intimate with them before progressing
further. Embedded software concepts like these are full of bitmasks and
bitshifting.

