2012-03-29 2 views
1

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

Вот мой код:

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 

«X» означает, что дисплей выключен, а число представляет себя в положение дисплея, как вы можете видеть в цепи.

+0

Трудно угадать, что подключен к параллельному порту. У вас есть схема или некоторые спецификации? –

+0

http://i.imgur.com/RFeJi.gif – aerojun

+0

Параллельный порт имеет 8 линий передачи данных и 3 других выхода. Я не думаю, что вы можете управлять светодиодом очень ярко непосредственно с выходов, поэтому я думаю, что еще нет недостающей схемы. –

ответ

1

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

Ниже приведен примерный алгоритм, используя объект 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) 
+0

Он работает! Благодарю. Я собираюсь изучить код, чтобы понять его. Кроме того, могу ли я поделиться кодом для людей в моей ситуации? – aerojun

1
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) 

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

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

Это побитовое OR-нут с последними 4 битой ASCII код номера, чтобы указать значение, необходимое для записи на параллельный порт.

+0

Я уже это сделал. В любом случае, спасибо. Проблема в том, что она должна прокручивать строку. – aerojun

+0

Затем используйте 'для i, n в перечислении (numStr [x: x + 4], 4):' и измените значение 'x', когда вы хотите сдвинуть на 1 позицию –

+0

@aerojun, если вы уже сделали это, почему вы не отправили _working_ код? –

 Смежные вопросы

  • Нет связанных вопросов^_^