Некоторые приемы программирования



   Передавая в порт значения 0...255 мы можем получить различные комбинации сигналов на разъёме. Однако одно дело записать 16 чтобы включить бит D3, другое дело вычислять число, необходимое для включения бит 2,4,5,7. Поэтому лучше поручить это дело компьютеру.

   Откроем наш предыдущий проект и добавим ещё один модуль со следующим кодом:


'************ установка бита в 1 (Value = 0...7) ************************
'Включить соответствующий выходной бит в порту выходов LPT1

Public Sub SetOutBit(Value As Byte)

'считываем состояние порта выходов и устанавливаем соответствующий
'бит в 1 не меняя состояния остальных бит

  DlPortWritePortUchar ByVal OUT_PORT, (ReadOutPort Or 2 ^ Value)
End Sub


'************ установка бита в 0 (Value = 0...7) ************************
'Выключить соответствующий выходной бит в порту выходов LPT1
Public Sub ResetOutBit(Value As Byte)
'считываем состояние порта выходов и устанавливаем соответствующий
'бит в 0 не меняя состояния остальных бит
  DlPortWritePortUchar ByVal OUT_PORT, (ReadOutPort Xor 2 ^ Value)
End Sub


'************ чтение состояния порта выходов **************
Public Function ReadOutPort() As Byte

'чтение байта из порта выходов LPT1

  ReadOutPort = DlPortReadPortUchar(OUT_PORT)
End Function


'************ чтение состояния порта входов **************
Public Function ReadInPort() As Byte

'чтение байта из порта входов LPT1

  ReadInPort = DlPortReadPortUchar(IN_PORT)
End Function


'************ выключить порт ************************
Public Sub ResetPort()
  DlPortWritePortUchar ByVal OUT_PORT, ByVal (0)
End Sub

  Почему именно отдельный модуль?Во первых вы можете использовать мой модуль..Во вторых вы можете написать свой собственный и включать его в другие программы.В третьих код для управления портами не будет болтаться в модуле формы и отвлекать внимание. Впрочем это только рекомендация.
  Теперь из модуля формы просто обращаемся к подпрограммам модуля:

SetOutBit(0...7)    ResetOutBit(0...7)     ResetPort    a%=ReadInPort


Здесь находится исходный код примера.
  Обратите внимание,что константы,объявленные нами для портов входа и выхода перенесены в модуль!

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

  В модуле формы объявим массив

Dim inPort(5) as Boolean

и напишем процедуру для таймера:

'процедура с интервалом Timera опрашивает порт входов

Private Sub Timer1_Timer()
 Dim pinPort As Byte
  'результат опроса порта
    pinPort = ReadInPort

     'поверяем бит 3 (нога 15 разъема)
     If (8 And pinPort) = 0 Then
      'определяем переменную массива
      inPort(0) = True
         Else
          'определяем переменную массива
          inPort(0) = False
             End If

     'поверяем бит 4 (нога 13 разъема)
     If (16 And pinPort) = 0 Then
      inPort(1) = True
         Else
          inPort(1) = False
             End If

     'поверяем бит 5 (нога 12 разъема)
     If (32 And pinPort) = 0 Then
      inPort(2) = True
         Else
          inPort(2) = False
             End If

     'поверяем бит 6 (нога 10 разъема)
     If (64 And pinPort) = 0 Then
      inPort(3) = True
         Else
          inPort(3) = False
             End If

     'поверяем бит 7 (нога 11 разъема)
      If (127 Or pinPort) = 255 Then
      inPort(4) = True
         Else
          inPort(4) = False
             End If
End Sub

  Теперь надо установить свойство таймера Interval в 50 и процедура будет опрашивать порт с интервалом 50 миллисекунд и заносить в массив значения входных бит.

Главная Оглавление Назад
Hosted by uCoz