AFON//Радиотехник
C++Builder · проект 43/50

Вывод в LPT-порт

Байт из флажков через inpout32.

Задача

Собрать байт из восьми флажков и вывести его на линии данных LPT-порта.

Компоненты на форме

CheckBox (D0..D7), Edit (EditBase), Button (ButtonOut), StatusBar.

Как работает

  1. Собрать байт из флажков функцией buildByte.
  2. Загрузить драйвер inpout32.dll.
  3. Вывести байт функцией Out32 по адресу порта.

Исходный код модуля

//---------------------------------------------------------------------------
// Проект 43. Вывод байта в LPT-порт
// Формирование байта из флажков и вывод (inpout32).
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------

// Управление линиями LPT: восемь флажков → байт данных на выводах 2..9.
// buildByte — ядро, собирающее флажки в байт (проверяется тестом).
// Реальный вывод в порт делается драйвером inpout32 (Out32).
typedef void (__stdcall *TOut32)(short, short);
unsigned char buildByte(bool bits[8])
{
    unsigned char v=0; for(int i=0;i<8;i++) if(bits[i]) v|=(1<<i); return v;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonOutClick(TObject *Sender)
{
    bool b[8]={D0->Checked,D1->Checked,D2->Checked,D3->Checked,
               D4->Checked,D5->Checked,D6->Checked,D7->Checked};
    unsigned char v=buildByte(b);
    LabelByte->Caption="0x"+IntToHex((int)v,2)+"  ("+IntToStr((int)v)+")";
    HINSTANCE dll=LoadLibrary("inpout32.dll");
    if (dll){
        TOut32 Out32=(TOut32)GetProcAddress(dll,"Out32");
        int base=StrToIntDef("0x"+EditBase->Text,0x378);   // адрес LPT1
        if (Out32) Out32(base, v);
        FreeLibrary(dll);
        StatusBar1->SimpleText="Выведено в порт 0x"+IntToHex(base,3);
    } else StatusBar1->SimpleText="inpout32.dll не найдена (байт посчитан)";
}
//---------------------------------------------------------------------------

Пояснения

  • Прямой доступ к портам в NT/XP и новее требует драйвера inpout32.
  • Базовый адрес LPT1 обычно 0x378.
  • Само формирование байта проверено тестом даже без порта.
📦 help-user.ru — срочный ремонт компьютеров и восстановление данных в Москве: help-user.ru.

Что дальше

Создайте в C++Builder новый проект, разместите перечисленные компоненты и вставьте код модуля. Остальные 49 программ — в разделе проектов на C++Builder; смотрите также обзор среды и контроллеры AVR.