//---------------------------------------------------------------------------
//--- Quad 2-input NAND gates ---
#pragma hdrstop

#include "universal.h"          // переменные для универсальных команд
#include "PortFunctions.h"      // переменные для функций работы с портом
#include "LogFunctions.h"       // переменные для отправки сообщений в лог
#include "Main.h"               // переменные для работы с главной формой
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
//--- ДЕАКТИВИРОВАНИЕ ЭЛЕМЕНТОВ НА ФОРМЕ ------------------------------------
//---------------------------------------------------------------------------
void universal_disable()
{ Form1->TabSheet2->Visible = false;
  Form1->CheckBox18->Enabled    = false;        // +5 V
  Form1->CheckBox36->Enabled    = false;        // +12 V
  //--- USE checkboxes ---
  Form1->CheckBox19->Enabled    = false;        // PB0 use
  Form1->CheckBox20->Enabled    = false;        // PB1 use
  Form1->CheckBox21->Enabled    = false;        // PB2 use
  Form1->CheckBox22->Enabled    = false;        // PB3 use
  Form1->CheckBox23->Enabled    = false;        // PB4 use
  Form1->CheckBox24->Enabled    = false;        // PB5 use
  Form1->CheckBox25->Enabled    = false;        // PB6 use
  Form1->CheckBox26->Enabled    = false;        // PB7 use
  Form1->CheckBox27->Enabled    = false;        // PC0 use
  Form1->CheckBox28->Enabled    = false;        // PC1 use
  Form1->CheckBox29->Enabled    = false;        // PC4 use
  Form1->CheckBox30->Enabled    = false;        // PC5 use
  Form1->CheckBox31->Enabled    = false;        // PD2 use
  Form1->CheckBox32->Enabled    = false;        // PD3 use
  Form1->CheckBox33->Enabled    = false;        // PD4 use
  Form1->CheckBox34->Enabled    = false;        // PD6 use
  Form1->CheckBox35->Enabled    = false;        // PD7 use
  //--- DIR comboboxes ---
  Form1->ComboBox3->Enabled     = false;        // PB0 dir
  Form1->ComboBox5->Enabled     = false;        // PB1 dir
  Form1->ComboBox7->Enabled     = false;        // PB2 dir
  Form1->ComboBox9->Enabled     = false;        // PB3 dir
  Form1->ComboBox11->Enabled    = false;        // PB4 dir
  Form1->ComboBox13->Enabled    = false;        // PB5 dir
  Form1->ComboBox15->Enabled    = false;        // PB6 dir
  Form1->ComboBox17->Enabled    = false;        // PB7 dir
  Form1->ComboBox19->Enabled    = false;        // PC0 dir
  Form1->ComboBox21->Enabled    = false;        // PC1 dir
  Form1->ComboBox23->Enabled    = false;        // PC4 dir
  Form1->ComboBox25->Enabled    = false;        // PC5 dir
  Form1->ComboBox27->Enabled    = false;        // PD2 dir
  Form1->ComboBox29->Enabled    = false;        // PD3 dir
  Form1->ComboBox31->Enabled    = false;        // PD4 dir
  Form1->ComboBox33->Enabled    = false;        // PD6 dir
  Form1->ComboBox35->Enabled    = false;        // PD7 dir
  //--- PULL-UP comboboxes ---
  Form1->ComboBox36->Enabled    = false;        // PB0 pull-up
  Form1->ComboBox37->Enabled    = false;        // PB1 pull-up
  Form1->ComboBox38->Enabled    = false;        // PB2 pull-up
  Form1->ComboBox39->Enabled    = false;        // PB3 pull-up
  Form1->ComboBox40->Enabled    = false;        // PB4 pull-up
  Form1->ComboBox41->Enabled    = false;        // PB5 pull-up
  Form1->ComboBox42->Enabled    = false;        // PB6 pull-up
  Form1->ComboBox43->Enabled    = false;        // PB7 pull-up
  Form1->ComboBox44->Enabled    = false;        // PC0 pull-up
  Form1->ComboBox45->Enabled    = false;        // PC1 pull-up
  Form1->ComboBox46->Enabled    = false;        // PC4 pull-up
  Form1->ComboBox47->Enabled    = false;        // PC5 pull-up
  Form1->ComboBox48->Enabled    = false;        // PD2 pull-up
  Form1->ComboBox49->Enabled    = false;        // PD3 pull-up
  Form1->ComboBox50->Enabled    = false;        // PD4 pull-up
  Form1->ComboBox51->Enabled    = false;        // PD6 pull-up
  Form1->ComboBox52->Enabled    = false;        // PD7 pull-up
  //--- STATE checkboxes ---
  Form1->CheckBox1->Enabled     = false;        // PB0 state
  Form1->CheckBox2->Enabled     = false;        // PB1 state
  Form1->CheckBox3->Enabled     = false;        // PB2 state
  Form1->CheckBox4->Enabled     = false;        // PB3 state
  Form1->CheckBox5->Enabled     = false;        // PB4 state
  Form1->CheckBox6->Enabled     = false;        // PB5 state
  Form1->CheckBox7->Enabled     = false;        // PB6 state
  Form1->CheckBox8->Enabled     = false;        // PB7 state
  Form1->CheckBox9->Enabled     = false;        // PC0 state
  Form1->CheckBox10->Enabled    = false;        // PC1 state
  Form1->CheckBox11->Enabled    = false;        // PC4 state
  Form1->CheckBox12->Enabled    = false;        // PC5 state
  Form1->CheckBox13->Enabled    = false;        // PD2 state
  Form1->CheckBox14->Enabled    = false;        // PD3 state
  Form1->CheckBox15->Enabled    = false;        // PD4 state
  Form1->CheckBox16->Enabled    = false;        // PD6 state
  Form1->CheckBox17->Enabled    = false;        // PD7 state
  //--------------------------------
  Form1->TabSheet2->Visible = true;
}
//---------------------------------------------------------------------------
//--- АКТИВИРОВАНИЕ ЭЛЕМЕНТОВ НА ФОРМЕ --------------------------------------
//---------------------------------------------------------------------------
void universal_enable()
{ Form1->TabSheet2->Visible = false;
  Form1->CheckBox18->Enabled    = true;         // +5 V
  Form1->CheckBox36->Enabled    = true;         // +12 V
  //--- USE checkboxes ---
  Form1->CheckBox19->Enabled    = true;         // PB0 use
  Form1->CheckBox20->Enabled    = true;         // PB1 use
  Form1->CheckBox21->Enabled    = true;         // PB2 use
  Form1->CheckBox22->Enabled    = true;         // PB3 use
  Form1->CheckBox23->Enabled    = true;         // PB4 use
  Form1->CheckBox24->Enabled    = true;         // PB5 use
  Form1->CheckBox25->Enabled    = true;         // PB6 use
  Form1->CheckBox26->Enabled    = true;         // PB7 use
  Form1->CheckBox27->Enabled    = true;         // PC0 use
  Form1->CheckBox28->Enabled    = true;         // PC1 use
  Form1->CheckBox29->Enabled    = true;         // PC4 use
  Form1->CheckBox30->Enabled    = true;         // PC5 use
  Form1->CheckBox31->Enabled    = true;         // PD2 use
  Form1->CheckBox32->Enabled    = true;         // PD3 use
  Form1->CheckBox33->Enabled    = true;         // PD4 use
  Form1->CheckBox34->Enabled    = true;         // PD6 use
  Form1->CheckBox35->Enabled    = true;         // PD7 use
  //-------------------------------
  Form1->TabSheet2->Visible = true;
}
//---------------------------------------------------------------------------
//--- ВКЛЮЧЕНИЕ ПИТАНИЯ ЧИПА +5В --------------------------------------------
//---------------------------------------------------------------------------
bool universal_5power_on()
{ WRITE_BUFFER wr_buf;          // буфер для отправки данных
  READ_BUFFER rd_buf;           // буфер для приёма данных
  bool result;                  // результат выполнения команды

  result = true;
  //--- читаем состояние защёлок порта C
  wr_buf.Size=1;
  wr_buf.Data[0]=0x12;                                          // PORTCRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read PORTC");         // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий PORTC
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (PORTC)");                // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  //--- настраиваем порт C
  wr_buf.Size=2;
  wr_buf.Data[0] = 0x11;                                        // PORTCSetup
  wr_buf.Data[1] = rd_buf.Data[0] & ~(1<<VCC5);                 // убираем подтяжку с линии PC2
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," set PORTC2 = 0");     // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- читаем направление линий порта C
  wr_buf.Size=1;
  wr_buf.Data[0]=0x10;                                          // DDRCRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read DDRC");          // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий DDRC
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (DDRC)");                 // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  //--- настраиваем порт C
  wr_buf.Size=2;
  wr_buf.Data[0] = 0x0F;                                        // DDRCSetup
  wr_buf.Data[1] = rd_buf.Data[0]|(1<<VCC5);                    // переводим линию PC2 - на выход
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," set DDRC2 = 1");      // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  SendMsgToLog(0,"+5V Power ON");
  Sleep(10);
  return result;
}
//---------------------------------------------------------------------------
//--- ВЫКЛЮЧЕНИЕ ПИТАНИЯ ЧИПА +5В -------------------------------------------
//---------------------------------------------------------------------------
bool universal_5power_off()
{ WRITE_BUFFER wr_buf;          // буфер для отправки данных
  READ_BUFFER rd_buf;           // буфер для приёма данных
  bool result;                  // результат выполнения команды

  result = true;
  //--- читаем состояние защёлок порта C
  wr_buf.Size=1;
  wr_buf.Data[0]=0x12;                                          // PORTCRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read PORTC");         // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий PORTC
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (PORTC)");                // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  //--- настраиваем порт C
  wr_buf.Size=2;
  wr_buf.Data[0] = 0x11;                                        // PORTCSetup
  wr_buf.Data[1] = rd_buf.Data[0] & ~(1<<VCC5);                 // убираем подтяжку с линии PC2
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," set PORTC2 = 0");     // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- читаем направление линий порта C
  wr_buf.Size=1;
  wr_buf.Data[0]=0x10;                                          // DDRCRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read DDRC");          // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий DDRC
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (DDRC)");                 // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  //--- настраиваем порт C
  wr_buf.Size=2;
  wr_buf.Data[0] = 0x0F;                                        // DDRCSetup
  wr_buf.Data[1] = rd_buf.Data[0] & ~(1<<VCC5);                  // переводим линию PC2 - на вход
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," set DDRC2 = 0");      // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  SendMsgToLog(0,"+5V Power OFF");
  Sleep(10);
  return result;
}
//---------------------------------------------------------------------------
//--- ВКЛЮЧЕНИЕ ПИТАНИЯ ЧИПА +12В -------------------------------------------
//---------------------------------------------------------------------------
bool universal_12power_on()
{ WRITE_BUFFER wr_buf;          // буфер для отправки данных
  READ_BUFFER rd_buf;           // буфер для приёма данных
  bool result;                  // результат выполнения команды

  result = true;
  //--- читаем направление линий порта C
  wr_buf.Size=1;
  wr_buf.Data[0]=0x10;                                          // DDRCRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read DDRC");          // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий DDRC
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (DDRC)");                 // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  //--- настраиваем порт C
  wr_buf.Size=2;
  wr_buf.Data[0] = 0x0F;                                        // DDRCSetup
  wr_buf.Data[1] = rd_buf.Data[0]|(1<<VCC12);                   // переводим линию PC3 - на выход
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," set DDRC3 = 1");      // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- читаем состояние защёлок порта C
  wr_buf.Size=1;
  wr_buf.Data[0]=0x12;                                          // PORTCRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read PORTC");         // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий PORTC
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (PORTC)");                // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  //--- настраиваем порт C
  wr_buf.Size=2;
  wr_buf.Data[0] = 0x11;                                        // PORTCSetup
  wr_buf.Data[1] = rd_buf.Data[0] | (1<<VCC12);                 // устанавливаем PC3 в единицу
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," set PORTC3 = 1");     // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  SendMsgToLog(0,"+12V Power ON");
  Sleep(10);
  return result;
}
//---------------------------------------------------------------------------
//--- ВЫКЛЮЧЕНИЕ ПИТАНИЯ ЧИПА +12В -------------------------------------------
//---------------------------------------------------------------------------
bool universal_12power_off()
{ WRITE_BUFFER wr_buf;          // буфер для отправки данных
  READ_BUFFER rd_buf;           // буфер для приёма данных
  bool result;                  // результат выполнения команды

  result = true;
  //--- читаем состояние защёлок порта C
  wr_buf.Size=1;
  wr_buf.Data[0]=0x12;                                          // PORTCRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read PORTC");         // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий PORTC
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (PORTC)");                // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  //--- настраиваем порт C
  wr_buf.Size=2;
  wr_buf.Data[0] = 0x11;                                        // PORTCSetup
  wr_buf.Data[1] = rd_buf.Data[0] & ~(1<<VCC12);                // убираем подтяжку с линии PC3
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," set PORTC3 = 0");     // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- читаем направление линий порта C
  wr_buf.Size=1;
  wr_buf.Data[0]=0x10;                                          // DDRCRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read DDRC");          // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий DDRC
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (DDRC)");                 // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  //--- настраиваем порт C
  wr_buf.Size=2;
  wr_buf.Data[0] = 0x0F;                                        // DDRCSetup
  wr_buf.Data[1] = rd_buf.Data[0] & ~(1<<VCC12);                // переводим линию PC3 - на вход
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," set DDRC3 = 0");      // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  SendMsgToLog(0,"+12V Power OFF");
  Sleep(10);
  return result;
}
//---------------------------------------------------------------------------
//--- ЧТЕНИЕ СОСТОЯНИЙ ВСЕХ ПОРТОВ ------------------------------------------
//---------------------------------------------------------------------------
bool universal_read_all()
{ WRITE_BUFFER wr_buf;                          // буфер для отправки данных
  READ_BUFFER rd_buf;                           // буфер для приёма данных
  unsigned int  UnDDRB, UnDDRC, UnDDRD,
                UnPORTB, UnPORTC, UnPORTD,
                UnPINB, UnPINC, UnPIND;         // переменные для хранения прочитанных состояний
  bool result;                                  // результат выполнения команды

  result = true;
  //************************************
  //--- читаем направление линий порта B
  wr_buf.Size=1;
  wr_buf.Data[0]=0x0C;                                          // DDRBRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read DDRB");          // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий направление линий порта B
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (read DDRB)");            // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  UnDDRB=rd_buf.Data[0];                                        // сохраняем прочитанное значение
  Sleep(5);
  //--- читаем состояние защёлок порта B
  wr_buf.Size=1;
  wr_buf.Data[0]=0x0E;                                          // PORTBRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read PORTB");         // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий направление линий порта B
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (read PORTB)");           // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  UnPORTB=rd_buf.Data[0];                                       // сохраняем прочитанное значение
  Sleep(5);
  //--- читаем состояние входов порта B
  wr_buf.Size=1;
  wr_buf.Data[0]=0x17;                                          // PINBRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read PINB");          // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий направление линий порта B
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (read PINB)");            // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  UnPINB=rd_buf.Data[0];                                        // сохраняем прочитанное значение
  Sleep(5);
  //************************************
  //--- читаем направление линий порта C
  wr_buf.Size=1;
  wr_buf.Data[0]=0x10;                                          // DDRCRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read DDRC");          // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий направление линий порта C
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (read DDRC)");            // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  UnDDRC=rd_buf.Data[0];                                        // сохраняем прочитанное значение
  Sleep(5);
  //--- читаем состояние защёлок порта C
  wr_buf.Size=1;
  wr_buf.Data[0]=0x12;                                          // PORTCRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read PORTC");         // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий направление линий порта C
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (read PORTC)");           // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  UnPORTC=rd_buf.Data[0];                                       // сохраняем прочитанное значение
  Sleep(5);
  //--- читаем состояние входов порта C
  wr_buf.Size=1;
  wr_buf.Data[0]=0x18;                                          // PINCRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read PINC");          // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий направление линий порта C
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (read PINC)");            // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  UnPINC=rd_buf.Data[0];                                        // сохраняем прочитанное значение
  Sleep(5);
  //************************************
  //--- читаем направление линий порта D
  wr_buf.Size=1;
  wr_buf.Data[0]=0x14;                                          // DDRDRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read DDRD");          // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий направление линий порта D
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (read DDRD)");            // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  UnDDRD=rd_buf.Data[0];                                        // сохраняем прочитанное значение
  Sleep(5);
  //--- читаем состояние защёлок порта D
  wr_buf.Size=1;
  wr_buf.Data[0]=0x16;                                          // PORTDRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read PORTD");         // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий направление линий порта D
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (read PORTD)");           // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  UnPORTD=rd_buf.Data[0];                                       // сохраняем прочитанное значение
  Sleep(5);
  //--- читаем состояние входов порта D
  wr_buf.Size=1;
  wr_buf.Data[0]=0x19;                                          // PINDRead
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," read PINB");          // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий направление линий порта D
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7," (read PIND)");            // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  UnPIND=rd_buf.Data[0];                                        // сохраняем прочитанное значение
  Sleep(5);
  //************************************
  //--- распихиваем прочитанные состояния на форму
  //--- сначала направления (и в зависимости от них активируем/деактивируем комбобоксы подтяжек)
  //******************************
  //Form1->TabSheet2->Visible = false;
  //--- РАЗБИРАЕМСЯ С ПИТАНИЕМ ---
  //--- +5 ---
  if(   (UnDDRC & (1<<VCC5))!=0   )             // если PC2 - выход
  {     Form1->CheckBox18->Checked = true;
  }
  else
  {     Form1->CheckBox18->Checked = false;
  }
  //--- +12 ---
  if(   (UnPORTC & (1<<VCC12))!=0   )           // если PC3 = 1
  {     Form1->CheckBox36->Checked = true;
  }
  else
  {     Form1->CheckBox36->Checked = false;
  }
  //--- РАЗБИРАЕМСЯ С ПОРТОМ B ---
  //--- 0
  if(Form1->CheckBox19->Checked == true)                        // если вывод используется
  {     Form1->ComboBox3->Enabled = true;                       // включаем поле DIR
        if(   (UnDDRB & (1<<0))!=0 )                            // если 0-й вывод - выход
        {       Form1->ComboBox3->ItemIndex = 1;                // пишем, что это выход
                Form1->ComboBox36->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox36->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox1->Enabled = true;               // включаем поле state
                if(     (UnPORTB & (1<<0))!=0   )               // если 0-й выход = 1
                {       Form1->CheckBox1->Checked = true;       // пишем, что выход = 1
                }
                else                                            // если 0-й выход = 0
                {       Form1->CheckBox1->Checked = false;      // пишем, что выход = 0
                }
        }
        else                                                    // если 0-й вывод - вход
        {       Form1->ComboBox3->ItemIndex = 0;                // пишем, что это вход
                Form1->ComboBox36->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox1->Enabled = false;              // выключаем поле state
                if(     (UnPORTB & (1<<0))!=0   )               // если 0-я защёлка = 1
                {       Form1->ComboBox36->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 0-я защёлка = 0
                {       Form1->ComboBox36->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPINB & (1<<0))!=0   )                // если 0-й вход = 1
                {       Form1->CheckBox1->Checked = true;       // пишем, что вход = 1
                }
                else                                            // если 0-й вход = 0
                {       Form1->CheckBox1->Checked = false;      // пишем, что вход = 0
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox3->Enabled = false;                      // выключаем поле DIR
        Form1->ComboBox3->ItemIndex = 0;                        // пишем, что это вход
        Form1->ComboBox36->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox36->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox1->Enabled = false;                      // выключаем поле State
        Form1->CheckBox1->Checked = false;                      // сбрасываем значение этого поля
  }
  //--- 1
  if(Form1->CheckBox20->Checked == true)                        // если вывод используется
  {     Form1->ComboBox5->Enabled = true;                       // включаем поле DIR
        if(   (UnDDRB & (1<<1))!=0 )                            // если 1-й вывод - выход
        {       Form1->ComboBox5->ItemIndex = 1;                // пишем, что это выход
                Form1->ComboBox37->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox37->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox2->Enabled = true;               // включаем поле state
                if(     (UnPORTB & (1<<1))!=0   )               // если 1-й выход = 1
                {       Form1->CheckBox2->Checked = true;       // пишем, что выход = 1
                }
                else                                            // если 1-й выход = 0
                {       Form1->CheckBox2->Checked = false;      // пишем, что выход = 0
                }
        }
        else                                                    // если 1-й вывод - вход
        {       Form1->ComboBox5->ItemIndex = 0;                // пишем, что это вход
                Form1->ComboBox37->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox2->Enabled = false;              // выключаем поле state
                if(     (UnPORTB & (1<<1))!=0   )               // если 1-я защёлка = 1
                {       Form1->ComboBox37->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 1-я защёлка = 0
                {       Form1->ComboBox37->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPINB & (1<<1))!=0   )                // если 1-й вход = 1
                {       Form1->CheckBox2->Checked = true;       // пишем, что вход = 1
                }
                else                                            // если 1-й вход = 0
                {       Form1->CheckBox2->Checked = false;      // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox5->Enabled = false;                      // выключаем поле DIR
        Form1->ComboBox5->ItemIndex = 0;                        // пишем, что это вход
        Form1->ComboBox37->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox37->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox2->Enabled = false;                      // выключаем поле State
        Form1->CheckBox2->Checked = false;                      // сбрасываем значение этого поля
  }
  //--- 2
  if(Form1->CheckBox21->Checked == true)                        // если вывод используется
  {     Form1->ComboBox7->Enabled = true;                       // включаем поле DIR
        if(   (UnDDRB & (1<<2))!=0 )                            // если 2-й вывод - выход
        {       Form1->ComboBox7->ItemIndex = 1;                // пишем, что это выход
                Form1->ComboBox38->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox38->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox3->Enabled = true;               // включаем поле state
                if(     (UnPORTB & (1<<2))!=0   )               // если 2-й выход = 1
                {       Form1->CheckBox3->Checked = true;       // пишем, что выход = 1
                }
                else                                            // если 2-й выход = 0
                {       Form1->CheckBox3->Checked = false;      // пишем, что выход = 0
                }
        }
        else                                                    // если 2-й вывод - вход
        {       Form1->ComboBox7->ItemIndex = 0;                // пишем, что это вход
                Form1->ComboBox38->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox3->Enabled = false;              // выключаем поле state
                if(     (UnPORTB & (1<<2))!=0   )               // если 2-я защёлка = 1
                {       Form1->ComboBox38->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 2-я защёлка = 0
                {       Form1->ComboBox38->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPINB & (1<<2))!=0   )                // если 2-й вход = 1
                {       Form1->CheckBox3->Checked = true;       // пишем, что вход = 1
                }
                else                                            // если 2-й вход = 0
                {       Form1->CheckBox3->Checked = false;      // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox7->Enabled = false;                      // выключаем поле DIR
        Form1->ComboBox7->ItemIndex = 0;                        // пишем, что это вход
        Form1->ComboBox38->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox38->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox3->Enabled = false;                      // выключаем поле State
        Form1->CheckBox3->Checked = false;                      // сбрасываем значение этого поля
  }
  //--- 3
  if(Form1->CheckBox22->Checked == true)                        // если вывод используется
  {     Form1->ComboBox9->Enabled = true;                       // включаем поле DIR
        if(   (UnDDRB & (1<<3))!=0 )                            // если 3-й вывод - выход
        {       Form1->ComboBox9->ItemIndex = 1;                // пишем, что это выход
                Form1->ComboBox39->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox39->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox4->Enabled = true;               // включаем поле state
                if(     (UnPORTB & (1<<3))!=0   )               // если 3-й выход = 1
                {       Form1->CheckBox4->Checked = true;       // пишем, что выход = 1
                }
                else                                            // если 3-й выход = 0
                {       Form1->CheckBox4->Checked = false;      // пишем, что выход = 0
                }
        }
        else                                                    // если 3-й вывод - вход
        {       Form1->ComboBox9->ItemIndex = 0;                // пишем, что это вход
                Form1->ComboBox39->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox4->Enabled = false;              // выключаем поле state
                if(     (UnPORTB & (1<<3))!=0   )               // если 3-я защёлка = 1
                {       Form1->ComboBox39->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 3-я защёлка = 0
                {       Form1->ComboBox39->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPINB & (1<<3))!=0   )                // если 3-й вход = 1
                {       Form1->CheckBox4->Checked = true;       // пишем, что вход = 1
                }
                else                                            // если 3-й вход = 0
                {       Form1->CheckBox4->Checked = false;      // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox9->Enabled = false;                      // выключаем поле DIR
        Form1->ComboBox9->ItemIndex = 0;                        // пишем, что это вход
        Form1->ComboBox39->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox39->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox4->Enabled = false;                      // выключаем поле State
        Form1->CheckBox4->Checked = false;                      // сбрасываем значение этого поля
  }
  //--- 4
  if(Form1->CheckBox23->Checked == true)                        // если вывод используется
  {     Form1->ComboBox11->Enabled = true;                      // включаем поле DIR
        if(   (UnDDRB & (1<<4))!=0 )                            // если 4-й вывод - выход
        {       Form1->ComboBox11->ItemIndex = 1;               // пишем, что это выход
                Form1->ComboBox40->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox40->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox5->Enabled = true;               // включаем поле state
                if(     (UnPORTB & (1<<4))!=0   )               // если 4-й выход = 1
                {       Form1->CheckBox5->Checked = true;       // пишем, что выход = 1
                }
                else                                            // если 4-й выход = 0
                {       Form1->CheckBox5->Checked = false;      // пишем, что выход = 0
                }
        }
        else                                                    // если 4-й вывод - вход
        {       Form1->ComboBox11->ItemIndex = 0;               // пишем, что это вход
                Form1->ComboBox40->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox5->Enabled = false;              // выключаем поле state
                if(     (UnPORTB & (1<<4))!=0   )               // если 4-я защёлка = 1
                {       Form1->ComboBox40->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 4-я защёлка = 0
                {       Form1->ComboBox40->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPINB & (1<<4))!=0   )                // если 4-й вход = 1
                {       Form1->CheckBox5->Checked = true;       // пишем, что вход = 1
                }
                else                                            // если 4-й вход = 0
                {       Form1->CheckBox5->Checked = false;      // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox11->Enabled = false;                     // выключаем поле DIR
        Form1->ComboBox11->ItemIndex = 0;                       // пишем, что это вход
        Form1->ComboBox40->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox40->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox5->Enabled = false;                      // выключаем поле State
        Form1->CheckBox5->Checked = false;                      // сбрасываем значение этого поля
  }
  //--- 5
  if(Form1->CheckBox24->Checked == true)                        // если вывод используется
  {     Form1->ComboBox13->Enabled = true;                      // включаем поле DIR
        if(   (UnDDRB & (1<<5))!=0 )                            // если 5-й вывод - выход
        {       Form1->ComboBox13->ItemIndex = 1;               // пишем, что это выход
                Form1->ComboBox41->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox41->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox6->Enabled = true;               // включаем поле state
                if(     (UnPORTB & (1<<5))!=0   )               // если 5-й выход = 1
                {       Form1->CheckBox6->Checked = true;       // пишем, что выход = 1
                }
                else                                            // если 5-й выход = 0
                {       Form1->CheckBox6->Checked = false;      // пишем, что выход = 0
                }
        }
        else                                                    // если 5-й вывод - вход
        {       Form1->ComboBox13->ItemIndex = 0;               // пишем, что это вход
                Form1->ComboBox41->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox6->Enabled = false;              // включаем поле state
                if(     (UnPORTB & (1<<5))!=0   )               // если 5-я защёлка = 1
                {       Form1->ComboBox41->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 5-я защёлка = 0
                {       Form1->ComboBox41->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPINB & (1<<5))!=0   )                // если 5-й вход = 1
                {       Form1->CheckBox6->Checked = true;       // пишем, что вход = 1
                }
                else                                            // если 5-й вход = 0
                {       Form1->CheckBox6->Checked = false;      // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox13->Enabled = false;                     // выключаем поле DIR
        Form1->ComboBox13->ItemIndex = 0;                       // пишем, что это вход
        Form1->ComboBox41->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox41->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox6->Enabled = false;                      // выключаем поле State
        Form1->CheckBox6->Checked = false;                      // сбрасываем значение этого поля
  }
  //--- 6
  if(Form1->CheckBox25->Checked == true)                        // если вывод используется
  {     Form1->ComboBox15->Enabled = true;                      // включаем поле DIR
        if(   (UnDDRB & (1<<6))!=0 )                            // если 6-й вывод - выход
        {       Form1->ComboBox15->ItemIndex = 1;               // пишем, что это выход
                Form1->ComboBox42->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox42->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox7->Enabled = true;               // включаем поле state
                if(     (UnPORTB & (1<<6))!=0   )               // если 6-й выход = 1
                {       Form1->CheckBox7->Checked = true;       // пишем, что выход = 1
                }
                else                                            // если 6-й выход = 0
                {       Form1->CheckBox7->Checked = false;      // пишем, что выход = 0
                }
        }
        else                                                    // если 6-й вывод - вход
        {       Form1->ComboBox15->ItemIndex = 0;               // пишем, что это вход
                Form1->ComboBox42->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox7->Enabled = false;              // выключаем поле state
                if(     (UnPORTB & (1<<6))!=0   )               // если 6-я защёлка = 1
                {       Form1->ComboBox42->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 6-я защёлка = 0
                {       Form1->ComboBox42->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPINB & (1<<6))!=0   )                // если 6-й вход = 1
                {       Form1->CheckBox7->Checked = true;       // пишем, что вход = 1
                }
                else                                            // если 6-й вход = 0
                {       Form1->CheckBox7->Checked = false;      // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox15->Enabled = false;                     // выключаем поле DIR
        Form1->ComboBox15->ItemIndex = 0;                       // пишем, что это вход
        Form1->ComboBox42->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox42->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox7->Enabled = false;                      // выключаем поле State
        Form1->CheckBox7->Checked = false;                      // сбрасываем значение этого поля
  }
  //--- 7
  if(Form1->CheckBox26->Checked == true)                        // если вывод используется
  {     Form1->ComboBox17->Enabled = true;                      // включаем поле DIR
        if(   (UnDDRB & (1<<7))!=0 )                            // если 7-й вывод - выход
        {       Form1->ComboBox17->ItemIndex = 1;               // пишем, что это выход
                Form1->ComboBox43->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox43->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox8->Enabled = true;               // включаем поле state
                if(     (UnPORTB & (1<<7))!=0   )               // если 7-й выход = 1
                {       Form1->CheckBox8->Checked = true;       // пишем, что выход = 1
                }
                else                                            // если 7-й выход = 0
                {       Form1->CheckBox8->Checked = false;      // пишем, что выход = 0
                }
        }
        else                                                    // если 7-й вывод - вход
        {       Form1->ComboBox17->ItemIndex = 0;               // пишем, что это вход
                Form1->ComboBox43->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox8->Enabled = false;              // выключаем поле state
                if(     (UnPORTB & (1<<7))!=0   )               // если 7-я защёлка = 1
                {       Form1->ComboBox43->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 7-я защёлка = 0
                {       Form1->ComboBox43->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPINB & (1<<7))!=0   )                // если 7-й вход = 1
                {       Form1->CheckBox8->Checked = true;       // пишем, что вход = 1
                }
                else                                            // если 7-й вход = 0
                {       Form1->CheckBox8->Checked = false;      // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox17->Enabled = false;                     // выключаем поле DIR
        Form1->ComboBox17->ItemIndex = 0;                       // пишем, что это вход
        Form1->ComboBox43->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox43->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox8->Enabled = false;                      // выключаем поле State
        Form1->CheckBox8->Checked = false;                      // сбрасываем значение этого поля
  }
  //--- РАЗБИРАЕМСЯ С ПОРТОМ C ---
  //--- 0
  if(Form1->CheckBox27->Checked == true)                        // если вывод используется
  {     Form1->ComboBox19->Enabled = true;                      // включаем поле DIR
        if(   (UnDDRC & (1<<0))!=0 )                            // если 0-й вывод - выход
        {       Form1->ComboBox19->ItemIndex = 1;               // пишем, что это выход
                Form1->ComboBox44->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox44->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox9->Enabled = true;               // включаем поле state
                if(     (UnPORTC & (1<<0))!=0   )               // если 0-й выход = 1
                {       Form1->CheckBox9->Checked = true;       // пишем, что выход = 1
                }
                else                                            // если 0-й выход = 0
                {       Form1->CheckBox9->Checked = false;      // пишем, что выход = 0
                }
        }
        else                                                    // если 0-й вывод - вход
        {       Form1->ComboBox19->ItemIndex = 0;               // пишем, что это вход
                Form1->ComboBox44->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox9->Enabled = false;              // выключаем поле state
                if(     (UnPORTC & (1<<0))!=0   )               // если 0-я защёлка = 1
                {       Form1->ComboBox44->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 0-я защёлка = 0
                {       Form1->ComboBox44->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPINC & (1<<0))!=0   )                // если 0-й вход = 1
                {       Form1->CheckBox9->Checked = true;       // пишем, что вход = 1
                }
                else                                            // если 0-й вход = 0
                {       Form1->CheckBox9->Checked = false;      // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox19->Enabled = false;                     // выключаем поле DIR
        Form1->ComboBox19->ItemIndex = 0;                       // пишем, что это вход
        Form1->ComboBox44->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox44->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox9->Enabled = false;                      // выключаем поле State
        Form1->CheckBox9->Checked = false;                      // сбрасываем значение этого поля
  }
  //--- 1
  if(Form1->CheckBox28->Checked == true)                        // если вывод используется
  {     Form1->ComboBox21->Enabled = true;                      // включаем поле DIR
        if(   (UnDDRC & (1<<1))!=0 )                            // если 1-й вывод - выход
        {       Form1->ComboBox21->ItemIndex = 1;               // пишем, что это выход
                Form1->ComboBox45->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox45->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox10->Enabled = true;              // включаем поле state
                if(     (UnPORTC & (1<<1))!=0   )               // если 1-й выход = 1
                {       Form1->CheckBox10->Checked = true;      // пишем, что выход = 1
                }
                else                                            // если 1-й выход = 0
                {       Form1->CheckBox10->Checked = false;     // пишем, что выход = 0
                }
        }
        else                                                    // если 1-й вывод - вход
        {       Form1->ComboBox21->ItemIndex = 0;               // пишем, что это вход
                Form1->ComboBox45->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox10->Enabled = false;             // выключаем поле state
                if(     (UnPORTC & (1<<1))!=0   )               // если 1-я защёлка = 1
                {       Form1->ComboBox45->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 1-я защёлка = 0
                {       Form1->ComboBox45->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPINC & (1<<1))!=0   )                // если 1-й вход = 1
                {       Form1->CheckBox10->Checked = true;      // пишем, что вход = 1
                }
                else                                            // если 1-й вход = 0
                {       Form1->CheckBox10->Checked = false;     // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox21->Enabled = false;                     // выключаем поле DIR
        Form1->ComboBox21->ItemIndex = 0;                       // пишем, что это вход
        Form1->ComboBox45->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox45->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox10->Enabled = false;                     // выключаем поле State
        Form1->CheckBox10->Checked = false;                     // сбрасываем значение этого поля
  }
  //--- 4
  if(Form1->CheckBox29->Checked == true)                        // если вывод используется
  {     Form1->ComboBox23->Enabled = true;                      // включаем поле DIR
        if(   (UnDDRC & (1<<4))!=0 )                            // если 4-й вывод - выход
        {       Form1->ComboBox23->ItemIndex = 1;               // пишем, что это выход
                Form1->ComboBox46->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox46->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox11->Enabled = true;              // включаем поле state
                if(     (UnPORTC & (1<<4))!=0   )               // если 4-й выход = 1
                {       Form1->CheckBox11->Checked = true;      // пишем, что выход = 1
                }
                else                                            // если 4-й выход = 0
                {       Form1->CheckBox11->Checked = false;      // пишем, что выход = 0
                }
        }
        else                                                    // если 4-й вывод - вход
        {       Form1->ComboBox23->ItemIndex = 0;               // пишем, что это вход
                Form1->ComboBox46->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox11->Enabled = false;             // выключаем поле state
                if(     (UnPORTC & (1<<4))!=0   )               // если 4-я защёлка = 1
                {       Form1->ComboBox46->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 4-я защёлка = 0
                {       Form1->ComboBox46->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPINC & (1<<4))!=0   )                // если 4-й вход = 1
                {       Form1->CheckBox11->Checked = true;      // пишем, что вход = 1
                }
                else                                            // если 4-й вход = 0
                {       Form1->CheckBox11->Checked = false;     // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox23->Enabled = false;                     // выключаем поле DIR
        Form1->ComboBox23->ItemIndex = 0;                       // пишем, что это вход
        Form1->ComboBox46->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox46->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox11->Enabled = false;                     // выключаем поле State
        Form1->CheckBox11->Checked = false;                     // сбрасываем значение этого поля
  }
  //--- 5
  if(Form1->CheckBox30->Checked == true)                        // если вывод используется
  {     Form1->ComboBox25->Enabled = true;                      // включаем поле DIR
        if(   (UnDDRC & (1<<5))!=0 )                            // если 5-й вывод - выход
        {       Form1->ComboBox25->ItemIndex = 1;               // пишем, что это выход
                Form1->ComboBox47->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox47->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox12->Enabled = true;              // включаем поле state
                if(     (UnPORTC & (1<<5))!=0   )               // если 5-й выход = 1
                {       Form1->CheckBox12->Checked = true;      // пишем, что выход = 1
                }
                else                                            // если 5-й выход = 0
                {       Form1->CheckBox12->Checked = false;     // пишем, что выход = 0
                }
        }
        else                                                    // если 5-й вывод - вход
        {       Form1->ComboBox25->ItemIndex = 0;               // пишем, что это вход
                Form1->ComboBox47->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox12->Enabled = false;             // выключаем поле state
                if(     (UnPORTC & (1<<5))!=0   )               // если 5-я защёлка = 1
                {       Form1->ComboBox47->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 5-я защёлка = 0
                {       Form1->ComboBox47->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPINC & (1<<5))!=0   )                // если 5-й вход = 1
                {       Form1->CheckBox12->Checked = true;      // пишем, что вход = 1
                }
                else                                            // если 5-й вход = 0
                {       Form1->CheckBox12->Checked = false;     // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox25->Enabled = false;                     // выключаем поле DIR
        Form1->ComboBox25->ItemIndex = 0;                       // пишем, что это вход
        Form1->ComboBox47->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox47->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox12->Enabled = false;                     // выключаем поле State
        Form1->CheckBox12->Checked = false;                     // сбрасываем значение этого поля
  }
  //--- РАЗБИРАЕМСЯ С ПОРТОМ D ---
  //--- 2
  if(Form1->CheckBox31->Checked == true)                        // если вывод используется
  {     Form1->ComboBox27->Enabled = true;                      // включаем поле DIR
        if(   (UnDDRD & (1<<2))!=0 )                            // если 2-й вывод - выход
        {       Form1->ComboBox27->ItemIndex = 1;               // пишем, что это выход
                Form1->ComboBox48->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox48->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox13->Enabled = true;              // включаем поле state
                if(     (UnPORTD & (1<<2))!=0   )               // если 2-й выход = 1
                {       Form1->CheckBox13->Checked = true;      // пишем, что выход = 1
                }
                else                                            // если 2-й выход = 0
                {       Form1->CheckBox13->Checked = false;     // пишем, что выход = 0
                }
        }
        else                                                    // если 2-й вывод - вход
        {       Form1->ComboBox27->ItemIndex = 0;               // пишем, что это вход
                Form1->ComboBox48->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox13->Enabled = false;             // выключаем поле state
                if(     (UnPORTD & (1<<2))!=0   )               // если 2-я защёлка = 1
                {       Form1->ComboBox48->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 2-я защёлка = 0
                {       Form1->ComboBox48->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPIND & (1<<2))!=0   )                // если 2-й вход = 1
                {       Form1->CheckBox13->Checked = true;      // пишем, что вход = 1
                }
                else                                            // если 2-й вход = 0
                {       Form1->CheckBox13->Checked = false;     // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox27->Enabled = false;                     // выключаем поле DIR
        Form1->ComboBox27->ItemIndex = 0;                       // пишем, что это вход
        Form1->ComboBox48->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox48->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox13->Enabled = false;                     // выключаем поле State
        Form1->CheckBox13->Checked = false;                     // сбрасываем значение этого поля
  }
  //--- 3
  if(Form1->CheckBox32->Checked == true)                        // если вывод используется
  {     Form1->ComboBox29->Enabled = true;                      // включаем поле DIR
        if(   (UnDDRD & (1<<3))!=0 )                            // если 3-й вывод - выход
        {       Form1->ComboBox29->ItemIndex = 1;               // пишем, что это выход
                Form1->ComboBox49->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox49->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox14->Enabled = true;              // включаем поле state
                if(     (UnPORTD & (1<<3))!=0   )               // если 3-й выход = 1
                {       Form1->CheckBox14->Checked = true;      // пишем, что выход = 1
                }
                else                                            // если 3-й выход = 0
                {       Form1->CheckBox14->Checked = false;     // пишем, что выход = 0
                }
        }
        else                                                    // если 3-й вывод - вход
        {       Form1->ComboBox29->ItemIndex = 0;               // пишем, что это вход
                Form1->ComboBox49->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox14->Enabled = false;             // выключаем поле state
                if(     (UnPORTD & (1<<3))!=0   )               // если 3-я защёлка = 1
                {       Form1->ComboBox49->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 3-я защёлка = 0
                {       Form1->ComboBox49->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPIND & (1<<3))!=0   )                // если 3-й вход = 1
                {       Form1->CheckBox14->Checked = true;      // пишем, что вход = 1
                }
                else                                            // если 3-й вход = 0
                {       Form1->CheckBox14->Checked = false;     // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox29->Enabled = false;                     // выключаем поле DIR
        Form1->ComboBox29->ItemIndex = 0;                       // пишем, что это вход
        Form1->ComboBox49->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox49->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox14->Enabled = false;                     // выключаем поле State
        Form1->CheckBox14->Checked = false;                     // сбрасываем значение этого поля
  }
  //--- 4
  if(Form1->CheckBox33->Checked == true)                        // если вывод используется
  {     Form1->ComboBox31->Enabled = true;                      // включаем поле DIR
        if(   (UnDDRD & (1<<4))!=0 )                            // если 4-й вывод - выход
        {       Form1->ComboBox31->ItemIndex = 1;               // пишем, что это выход
                Form1->ComboBox50->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox50->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox15->Enabled = true;              // включаем поле state
                if(     (UnPORTD & (1<<4))!=0   )               // если 4-й выход = 1
                {       Form1->CheckBox15->Checked = true;      // пишем, что выход = 1
                }
                else                                            // если 4-й выход = 0
                {       Form1->CheckBox15->Checked = false;     // пишем, что выход = 0
                }
        }
        else                                                    // если 4-й вывод - вход
        {       Form1->ComboBox31->ItemIndex = 0;               // пишем, что это вход
                Form1->ComboBox50->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox15->Enabled = false;             // выключаем поле state
                if(     (UnPORTD & (1<<4))!=0   )               // если 4-я защёлка = 1
                {       Form1->ComboBox50->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 4-я защёлка = 0
                {       Form1->ComboBox50->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPIND & (1<<4))!=0   )                // если 4-й вход = 1
                {       Form1->CheckBox15->Checked = true;      // пишем, что вход = 1
                }
                else                                            // если 4-й вход = 0
                {       Form1->CheckBox15->Checked = false;     // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox31->Enabled = false;                     // выключаем поле DIR
        Form1->ComboBox31->ItemIndex = 0;                       // пишем, что это вход
        Form1->ComboBox50->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox50->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox15->Enabled = false;                     // выключаем поле State
        Form1->CheckBox15->Checked = false;                     // сбрасываем значение этого поля
  }
  //--- 6
  if(Form1->CheckBox34->Checked == true)                        // если вывод используется
  {     Form1->ComboBox33->Enabled = true;                      // включаем поле DIR
        if(   (UnDDRD & (1<<6))!=0 )                            // если 6-й вывод - выход
        {       Form1->ComboBox33->ItemIndex = 1;               // пишем, что это выход
                Form1->ComboBox51->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox51->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox16->Enabled = true;              // включаем поле state
                if(     (UnPORTD & (1<<6))!=0   )               // если 6-й выход = 1
                {       Form1->CheckBox16->Checked = true;      // пишем, что выход = 1
                }
                else                                            // если 6-й выход = 0
                {       Form1->CheckBox16->Checked = false;     // пишем, что выход = 0
                }
        }
        else                                                    // если 6-й вывод - вход
        {       Form1->ComboBox33->ItemIndex = 0;               // пишем, что это вход
                Form1->ComboBox51->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox16->Enabled = false;             // выключаем поле state
                if(     (UnPORTD & (1<<6))!=0   )               // если 6-я защёлка = 1
                {       Form1->ComboBox51->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 6-я защёлка = 0
                {       Form1->ComboBox51->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPIND & (1<<6))!=0   )                // если 6-й вход = 1
                {       Form1->CheckBox16->Checked = true;      // пишем, что вход = 1
                }
                else                                            // если 6-й вход = 0
                {       Form1->CheckBox16->Checked = false;     // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox33->Enabled = false;                     // выключаем поле DIR
        Form1->ComboBox33->ItemIndex = 0;                       // пишем, что это вход
        Form1->ComboBox51->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox51->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox16->Enabled = false;                     // выключаем поле State
        Form1->CheckBox16->Checked = false;                     // сбрасываем значение этого поля
  }
  //--- 7
  if(Form1->CheckBox35->Checked == true)                        // если вывод используется
  {     Form1->ComboBox35->Enabled = true;                      // включаем поле DIR
        if(   (UnDDRD & (1<<7))!=0 )                            // если 7-й вывод - выход
        {       Form1->ComboBox35->ItemIndex = 1;               // пишем, что это выход
                Form1->ComboBox52->Enabled = false;             // выключаем поле pull-up
                Form1->ComboBox52->ItemIndex = 0;               // пишем, что подтяжка выключена
                Form1->CheckBox17->Enabled = true;              // включаем поле state
                if(     (UnPORTD & (1<<7))!=0   )               // если 7-й выход = 1
                {       Form1->CheckBox17->Checked = true;      // пишем, что выход = 1
                }
                else                                            // если 7-й выход = 0
                {       Form1->CheckBox17->Checked = false;     // пишем, что выход = 0
                }
        }
        else                                                    // если 7-й вывод - вход
        {       Form1->ComboBox35->ItemIndex = 0;               // пишем, что это вход
                Form1->ComboBox52->Enabled = true;              // включаем поле pull-up
                Form1->CheckBox17->Enabled = false;             // выключаем поле state
                if(     (UnPORTD & (1<<7))!=0   )               // если 7-я защёлка = 1
                {       Form1->ComboBox52->ItemIndex = 1;       // пишем, что подтяжка включена
                }
                else                                            // если 7-я защёлка = 0
                {       Form1->ComboBox52->ItemIndex = 0;       // пишем, что подтяжка выключена
                }
                if(     (UnPIND & (1<<7))!=0   )                // если 7-й вход = 1
                {       Form1->CheckBox17->Checked = true;      // пишем, что вход = 1
                }
                else                                            // если 7-й вход = 0
                {       Form1->CheckBox17->Checked = false;     // пишем, что вход = 1
                }
        }
  }
  else                                                          // если вывод не испольуется
  {     Form1->ComboBox35->Enabled = false;                     // выключаем поле DIR
        Form1->ComboBox35->ItemIndex = 0;                       // пишем, что это вход
        Form1->ComboBox52->Enabled = false;                     // выключаем поле PULL-UP
        Form1->ComboBox52->ItemIndex = 0;                       // пишем, что подтяжка отключена
        Form1->CheckBox17->Enabled = false;                     // выключаем поле State
        Form1->CheckBox17->Checked = false;                     // сбрасываем значение этого поля
  }
  //-------------------------------
  //Form1->TabSheet2->Visible = true;
  return result;
}
//---------------------------------------------------------------------------
//--- УСТАНОВИТЬ ЗНАЧЕНИЕ ЗАЩЁЛКИ НУЖНОГО ПОРТА -----------------------------
//---------------------------------------------------------------------------
bool uniset_port(unsigned int pNumber, unsigned int ioNumber, unsigned int ioValue)
{ WRITE_BUFFER wr_buf;          // буфер для отправки данных
  READ_BUFFER rd_buf;           // буфер для приёма данных
  bool result;                  // результат выполнения команды
  AnsiString ASTemp;            // строка для разных нужд

  result = true;

  //--- читаем значение защёлок нужного порта
  wr_buf.Size=1;
  switch(pNumber)
  {     case 1:  wr_buf.Data[0]=0x0E;                           // PORTBRead
                 ASTemp=" read PortB";
                 break;
        case 2:  wr_buf.Data[0]=0x12;                           // PORTCRead
                 ASTemp=" read PortC";
                 break;
        case 3:  wr_buf.Data[0]=0x16;                           // PORTDRead
                 ASTemp=" read PortD";
                 break;
        default: return false;                                  // этого не должно случиться, но вдруг
  }
  if(!WriteTo(wr_buf)) { SendMsgToLog(6,ASTemp);                // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий данные порта
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7,ASTemp);                    // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  //--- меняем значение на нужное
  if(ioValue)
  {     rd_buf.Data[0] |= (1<<ioNumber);
  }
  else
  {     rd_buf.Data[0] &= ~(1<<ioNumber);
  }
  //--- настраиваем порт
  wr_buf.Size=2;
  switch(pNumber)
  {     case 1:  wr_buf.Data[0]=0x0D;                   // PORTBSetup
                 ASTemp=" setup PortB";
                 break;
        case 2:  wr_buf.Data[0]=0x11;                   // PORTCSetup
                 ASTemp=" setup PortC";
                 break;
        case 3:  wr_buf.Data[0]=0x15;                   // PORTDSetup
                 ASTemp=" setup PortD";
                 break;
        default: return false;                          // этого не должно случиться, но вдруг
  }
  wr_buf.Data[1] = rd_buf.Data[0];
  if(!WriteTo(wr_buf)) { SendMsgToLog(6,ASTemp);        // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  SendMsgToLog(0," PORT setup complete!");
  Sleep(10);

  return result;
}
//---------------------------------------------------------------------------
//--- УСТАНОВИТЬ НАПРАВЛЕНИЕ ПИНА НУЖНОГО ПОРТА -----------------------------
//---------------------------------------------------------------------------
bool uniset_dir(unsigned int pNumber, unsigned int ioNumber, unsigned int ioValue)
{ WRITE_BUFFER wr_buf;          // буфер для отправки данных
  READ_BUFFER rd_buf;           // буфер для приёма данных
  bool result;                  // результат выполнения команды
  AnsiString ASTemp;            // строка для разных нужд

  result = true;

  //--- читаем значение DDR нужного порта
  wr_buf.Size=1;
  switch(pNumber)
  {     case 1:  wr_buf.Data[0]=0x0C;                           // DDRBRead
                 ASTemp=" read DDRB";
                 break;
        case 2:  wr_buf.Data[0]=0x10;                           // DDRCRead
                 ASTemp=" read DDRC";
                 break;
        case 3:  wr_buf.Data[0]=0x14;                           // DDRDRead
                 ASTemp=" read DDRD";
                 break;
        default: return false;                                  // этого не должно случиться, но вдруг
  }
  if(!WriteTo(wr_buf)) { SendMsgToLog(6,ASTemp);                // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  //--- принимаем байт, содержащий данные порта
  rd_buf=ReadFrom(1);                                           // читаем
  if(rd_buf.Size<1){ SendMsgToLog(7,ASTemp);                    // ошибка приёма пакетов
                     ClosePort();
                     return false;
                   }
  //--- меняем значение на нужное
  if(ioValue)
  {     rd_buf.Data[0] |= (1<<ioNumber);
  }
  else
  {     rd_buf.Data[0] &= ~(1<<ioNumber);
  }
  //--- настраиваем порт
  wr_buf.Size=2;
  switch(pNumber)
  {     case 1:  wr_buf.Data[0]=0x0B;                   // DDRBSetup
                 ASTemp=" setup DDRB";
                 break;
        case 2:  wr_buf.Data[0]=0x0F;                   // DDRCSetup
                 ASTemp=" setup DDRC";
                 break;
        case 3:  wr_buf.Data[0]=0x13;                   // DDRDSetup
                 ASTemp=" setup DDRD";
                 break;
        default: return false;                          // этого не должно случиться, но вдруг
  }
  wr_buf.Data[1] = rd_buf.Data[0];
  if(!WriteTo(wr_buf)) { SendMsgToLog(6,ASTemp);        // ошибка отправки команды
                         ClosePort();
                         return false;
                       }
  SendMsgToLog(0," DDR setup complete!");
  Sleep(10);

  return result;
}
//---------------------------------------------------------------------------

