Question

I'm trying to do something like this. The problem is that i can't build the loop that does that. Circuit:

Here is my code:

import parallel 
import time
p=parallel.Parallel() #object to use the parallel port
print ("Enter a string of numbers: ")
numStr = raw_input() #read line
numList=list(numSTr) #converts string to list
numlen=len(numList) #the length of the list
numBin=[['1','0001'], ['2','0010'],
 ['4','0100'], ['5','0101'],
 ['6','0110'], ['7','0111'],
 ['8','1000'], ['9','1001'],
 ['3','0011'], ['0','0000']] #Less significant bits of the numbers from 0 to 9 in a bidimesional array
p.setData(0) #clear the displays
pos=['0001','0010','0100','1000'] #Unique possible positions for the number from 0 to 9. 
c=(str(pos[])+str((numBin[][1]))) #here if the number in the list numList exist and also is in numBin. It joins the position and the number in binary, creating an number that will be send in decimal to the parallel port.
p.setData(int(c,2)) #send the binary number in decimal

If someone can help me, that would be gratifying

The most significant bits that are in numBin, define what display to turn on. And the less significant define the number. For example:

The string is {'7', '1', '5', '4', '8'}. So the first number to show in the last display is '7'. SO we take the binary 7 that is '0111' and join that binary string with the first display position that is '0001'. SO we create a binary number: '00010111'. We conver that number to decimal and send it to the parallel port. The parallel port turns on the las display and shows the number 7. The second time, it must show a '7' and a '1' in the second and fist position and so.

X X X X
X X X 7
X X 7 1
X 7 1 5
7 1 5 4
1 5 4 8
5 4 8 X
4 8 X X
8 X X X
X X X X

The 'X' represents that the display is off and the number represents itself in the display position as you can see in the circuit.

Was it helpful?

Solution

Looking at your circuit, you can't actually display different numbers simultaneously. I had a circuit like this on a demo FPGA board, and had to create a software driver to flicker the numbers on the display in the correct positions at a speed faster than the eye could detect.

Below is a a rough algorithm, using a Mock object to simulate the parallel port and the display for my testing. It must be run on a terminal that supports carriage return without linefeed.

You should be able to drop in your parallel library instead, but may have to adjust the control bits to match your hardware:

import sys

class ParallelMock(object):

    def __init__(self):
        '''Init and blank the "display".'''
        self.display = [' '] * 4
        self._update()

    def setData(self,data):
        '''Bits 0-3 are the "value".
           Bits 4-7 are positions 0-3 (first-to-last).
        '''
        self.display = [' '] * 4
        value = data & 0xF
        if data & 0x10:
            self.display[0] = str(value)
        if data & 0x20:
            self.display[1] = str(value)
        if data & 0x40:
            self.display[2] = str(value)
        if data & 0x80:
            self.display[3] = str(value)
        self._update()

    def _update(self):
        '''Write over the same four terminal positions each time.'''
        sys.stdout.write(''.join(self.display) + '\r')

if __name__ == '__main__':
    p = ParallelMock()

    nums = raw_input("Enter a string of numbers: ")

    # Shift over the steam four-at-a-time.
    stream = 'XXXX' + nums + 'XXXX'
    data = [0] * 4
    for i in range(len(stream)-3):
        # Precompute data
        for pos in range(4):
            value = stream[i+pos]
            data[pos] = 0 if value == 'X' else (1<<(pos+4)) + int(value)
        # "Flicker" the display...
        for delay in xrange(1000):
            # Display each position briefly.
            for d in data:
                p.setData(d)
        # Clear the display when done
        p.setData(0)

OTHER TIPS

import parallel 
import time
p=parallel.Parallel()                        # object to use the parallel port
print ("Enter a string of numbers: ")
numStr = bytearray(raw_input())
p.setData(0)                                 # clear the displays
while True:                                  # refresh as fast as you need to
    for i,n in enumerate(numStr,4):
        p.setData(1<<i | n&0xf)

In the for loop, i takes the values 4,5,6,7 so for 1<<i we get:

4 => 0b00010000
5 => 0b00100000
6 => 0b01000000
7 => 0b10000000

This is bitwise or'd with the last 4 bits of the ascii code of the number to give the value you need to write to the parallel port

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top