Programar el puerto paralelo en Windows
Descargar lpthandler.tar
Solo necesitamos conectar un LED entre el pin 9 y el 22 del paralelo.
O como muestra el esquema, entre cualquiera de los pines anaranjados (los pines de datos) y cualquiera de los pines grises (pines de polo a Tierra, GND). Tenemos un total de 16 de esos pines, 2 pines por bit de datos para poder conectar las 2 patas de un LED u otro dispositivo.
Asegurarse de poner el LED en la polaridad correcta, o darle vuelta, o simplemente no va a dejar pasar la electricidad y no va a encender.
Uso de este programa para encender todos los 8 LEDS:
Código:
lpthandler.exe 3bc 11111111
o sino el puerto 378
lpthandler.exe 378 11111111
o sino el puerto 278
lpthandler.exe 278 11111111
Uso de este programa para apagar todos los 8 LEDS:
Código:
lpthandler.exe 3bc 00000000
o sino el puerto 378
lpthandler.exe 378 00000000
o sino el puerto 278
lpthandler.exe 278 00000000
Cada uno de los 8 bits a escribir debe ser un 1 o 0.
Un 0 apaga y un 1 enciende.
Código
/* En resumen solo necesitamos: Out32(Direccion_Base_Puerto_Paralelo+2, 0); //Resetear Puerto de Control Out32(Direccion_Base_Puerto_Paralelo, 0xFF-0x00); //Escribir el Puerto de Datos */ //Aquí, la Direccion_Base_Puerto_Paralelo //puede ser: // 0x3BC -- LPT1 // 0x378 -- LPT1 // 0x278 -- LPT2 /// //Necesitamos resetear el Puerto de Control escribiéndole un 0 //para configurar sus opciones, controladas por cada uno de //sus bits: /// Out32(Direccion_Base_Puerto_Paralelo+2, 0); //Enviamos un valor entre 0 y 255 al puerto de Datos: /// Out32(Direccion_Base_Puerto_Paralelo, 0xFF-0x00);
Por si no se entiende el código, se puede ver cómo se escribió en tiempo real, carácter por carácter como en la programación original:
>> Ver Tutorial Animado de Código de lpthandler.c <<
Lo primero son los binarios y el código fuente del driver de acceso general a bajo nivel:
inpout32_source_and_bins.zip [Mirror 1]
inpout32_source_and_bins.zip [Mirror 2]
inpout32_source_and_bins.zip [Mirror 1]
inpout32_source_and_bins.zip [Mirror 2]
Después necesitamos saber qué direcciones de I/O tiene el puerto paralelo. Los puertos de I/O son como direcciones de memoria que van desde 0 hasta 65535. Cada una de esas posiciones podemos enviar 1, 2 o 4 bytes, o nosotros podemos recibir 1, 2 o 4 bytes. Por ahora solo vamos a enviar 1 byte a la vez.
El LPT1 está en el puerto (0x378, 378h)(888 decimal) o (0x3BC, 3BCh)(956 decimal).
El LPT2 está en el puerto (0x278, 278h)(632 decimal).
El LPT3 está en el puerto (0x3BC, 3BCh)(956 decimal).
El puerto paralelo es un periférico de 8 bits, así que usa 8 pines de datos para representar los 8 bits de cada byte (ya que usa datos y señales en paralelo, simultáneos), y esos son los pines que manipulamos con encendido o apagado cada vez que escribimos, por ejemplo, al puerto 0x378 (Los Pines Anaranjados, del 2 al 9):
Conector Hembra, en la Tarjeta Madre:
Ahora necesitamos usar void _stdcall Out32(short PortAddress, short data), que viene del driver inpout32.dll y hwinterface.sys.
Algo como esto:
Código:
Out32(378h, 255-0);
El código completo es el siguiente:
Código
//NOTE: Compile with GCC under MinGW. // // gcc lpthandler.c -o lpthandler.exe // //Usage: // lpthandler.exe LPT_Port Byte_Bit_Data // // LPT_Port: // - can be 3bc, 378 or 278 // // Byte_Bit_Data: // - can range from 00000000 to 11111111 (written like that, in binary). // Every bit controls one of 8 LEDs. // // LEDs are connected between DATA and GROUND lines. // DATA to GROUND lines are connected like this, for pins: // // DATA is + and GROUND is - // // 2-18 // 3-19 // 4-20 // 5-21 // 6-22 // 7-23 // 8-24 // 9-25 // // Remember to set the parallel ports as Standard/Normal in the BIOS // to ensure proper working of the basics with this program. /// #include <stdio.h> #include <windows.h> typedef short _stdcall (*_Out32)(short portaddr, short value); typedef short _stdcall (*_Inp32)(short portaddr); int main(int argc, char *argv[]) { HINSTANCE INPOUT32_DLL_Handle; _Inp32 Inp32; _Out32 Out32; //Load the inpout32.dll library. It's also associated //with hwinterface.sys, but it should open it by itself: /// INPOUT32_DLL_Handle=LoadLibrary("inpout32.dll"); if(INPOUT32_DLL_Handle == NULL) { return -1; } //Get access to the Out32/Inp32 functions from inpout32.dll: /// Out32 = (_Out32)GetProcAddress(INPOUT32_DLL_Handle, "Out32"); Inp32 = (_Inp32)GetProcAddress(INPOUT32_DLL_Handle, "Inp32"); //NOTE: The following two lines are the actual logic of the program // and are at the top of importance and the program's key logic. // Everything else could be considered API noise: //Configure the CONTROL Port with a 0 to sanitize the port state: /// //Bit 1: Auto Line Feed //Bit 2: Initialize Printer //Bit 3: Select Printer //Bit 4: Enable IRQ Via Ack Line //Bit 5: Enable Bi-Directional Port //Bit 6: Unused //Bit 7: Unused //Write the Data port with the desired 8-bit value: /// //Unload our inpout32.dll library: /// FreeLibrary(INPOUT32_DLL_Handle); return 0; }