Мультиплексирование строки чисел в Python для параллельного порта - PullRequest
1 голос
/ 29 марта 2012

Я пытаюсь сделать что-то вроде этого .Проблема в том, что я не могу построить цикл, который делает это.Circuit:

Вот мой код:

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

Если кто-то может мне помочь, это будет приятно

Самые значимые биты в numBin, определите, чтодисплей, чтобы включить.И менее значимо определить число.Например:

Строка: {'7', '1', '5', '4', '8'}.Таким образом, первое число, отображаемое на последнем дисплее, - «7».Итак, мы берем двоичный код 7, который является '0111', и соединяем эту двоичную строку с первой позицией отображения, которая является '0001'.Поэтому мы создаем двоичное число: «00010111».Мы конвертируем это число в десятичное и отправляем на параллельный порт.Параллельный порт включает дисплей las и показывает число 7. Во второй раз он должен показывать «7» и «1» во втором и первом положении и т. Д.

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 'означает, что дисплей выключен, а число представляет себя в положении дисплея, как вы можете видеть в схеме.

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Глядя на свою схему, вы не можете одновременно отображать разные числа. У меня была такая схема на демонстрационной плате ПЛИС, и мне пришлось создать программный драйвер для мерцания чисел на дисплее в правильных положениях со скоростью, превышающей скорость, которую мог обнаружить глаз.

Ниже приведен грубый алгоритм, использующий объект Mock для симуляции параллельного порта и дисплея для моего тестирования. Он должен работать на терминале, который поддерживает возврат каретки без перевода строки.

Вместо этого вы сможете включить параллельную библиотеку, но, возможно, придется настроить биты управления в соответствии с вашим оборудованием:

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)
1 голос
/ 29 марта 2012
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)

В цикле for i принимает значения 4,5,6,7, поэтому для 1<<i получаем:

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

Это побитовое значение или значение с последними 4 битами кода ascii для числа, чтобы дать значение, которое нужно записать в параллельный порт

...