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 [Seleccionar]
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 [Seleccionar]
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 (C) [Seleccionar]
/*
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:
[youtube=640,480]http://www.youtube.com/watch?v=sJRbGohmA3M[/youtube]
>> Ver Tutorial Animado de Código de lpthandler.c <<
Cita de: ~ en 7 Abril 2016, 17:35 PMLo 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]
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 [Seleccionar]
Out32(378h, 255-0);
El código completo es el siguiente:
Código (C) [Seleccionar]
//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)
{
printf("LoadLibrary failed for inpout32.dll...\n\n");
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:
///
Out32(strtol(argv[1],NULL,16)+2, 0); //Bit 0: Strobe
//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:
///
Out32(strtol(argv[1],NULL,16), strtol(argv[2],NULL,2));
//Unload our inpout32.dll library:
///
FreeLibrary(INPOUT32_DLL_Handle);
return 0;
}