Styre LPT1 porten fra Win XP

Tags:    c++

Hvordan kan jeg styre lpt1 porten fra winxp, med Bolrdan C++ 5.02 ikke Builder hvis nogle skulle forveksle.

Jeg skal blot kun sende en byte ud, altså dato ud åp pin 2-9 altså 1 byte.

-Thomas



3 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Hmm, jeg ved ikke, om du kan finde komponenter/Win32 API kode til det, men du kan i hvert fald ikke udføre den slags direkte, da direkte adgang til hardwaren via interrupts er "forbudt" for andet end drivere og den slags programmer med speciel tilladelse i WinXP.

1101110100010110000101000001

Killers don't end up in jail - they end up on a high-score!



De har info om og kode til parallel porten her:
http://www.beyondlogic.org/

(scroll ned til "Parallel Port Interfacing")



Jeg har fundet en kode som virker med bc 5.02 sat til dos projekt.
men har lidt problemmer med at forstå den, den er grafisk(semi-grafisk) men vil bare have selve kommandoen.


kode:

<pre>
#include <dos.h>
#include <conio.h>
#include <process.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/* If compiling with DJGPP, include also... */
#ifdef DJGPP
#include <sys/farptr.h>
#include <go32.h>
#endif

/* Global variables */

int port; /* Currently scanned port */
int port_positions[4]; /* List of all ports */
int port_number; /* Number of present ports */

/* Some useful defines... */

#define setpos(x,y) gotoxy((y)+1,(x)+1)
#define BACKGROUNDCOLOR BLUE
#define FOREGROUNDCOLOR WHITE
#define DISABLEDCOLOR LIGHTGRAY

/* Something dependent on the compiler... */

#ifdef DJGPP

#define outport outportw
#define MY_SHORT short

void getports (void)
{
unsigned int address; /* Address of Port */
int j;
unsigned long ptraddr = 0x0408; /* Base Address: segment is zero*/

port_number = 0;
for (j = 0; j < 3; j++)
{
port_positions[j] = _farpeekw(_dos_ds,ptraddr);
ptraddr += 2;
if (port_positions[j])
port_number++;
}
}

#else /* my else clauses always refer to BORLAND C */

#define MY_SHORT

void getports (void)
{
unsigned int address; /* Address of Port */
int j;
unsigned MY_SHORT int far *ptraddr;

ptraddr= (unsigned MY_SHORT int far *)0x00000408;
port_number = 0;

for (j = 0; j < 3; j++)
{
port_positions[j] = *(ptraddr++);
if (port_positions[j])
port_number++;
}
}

#endif

/* Start of common section */

/* Mouse routines */

/* Mouse initialization */
void mouse(void)
{
union REGS inregs;
union REGS outregs;

/* Mouse reset, initialization */
inregs.x.ax = 0;
int86(0x33, &inregs, & outregs);

/* Show mouse */
inregs.x.ax = 1;
int86(0x33, &inregs, & outregs);

/* Set mouse initial position */
inregs.x.ax = 4;
inregs.x.cx = 0;
inregs.x.dx = 8;
int86(0x33, &inregs, & outregs);
}

void mouseon(void)
{
union REGS inregs;
union REGS outregs;
inregs.x.ax = 1;
int86(0x33,&inregs,&outregs);
}

void mouseoff(void)
{
union REGS inregs;
union REGS outregs;
inregs.x.ax = 2;
int86(0x33,&inregs,&outregs);
}

void updatemouse(void)
{
union REGS inregs;
union REGS outregs;

/* Hide mouse... */
inregs.x.ax = 2;
int86(0x33,&inregs,&outregs);

/* ... and show it again! */
inregs.x.ax = 1;
int86(0x33,&inregs,&outregs);
}

void mousestatus
(MY_SHORT int *row,
MY_SHORT int *column,
MY_SHORT int *buttonstatus)
{
union REGS inregs;
union REGS outregs;
inregs.x.ax = 3;
int86(0x33, &inregs, &outregs);
*column = ((outregs.x.cx)/8)*8;
*row = ((outregs.x.dx)/8)*8;
*buttonstatus = outregs.x.bx;
}

/* Other stuff... */

void data(int bit, int port, int base)
{
if (base & bit)
base &= ~bit;
else
base |= bit;
outport(port,base);
}

/* Show inactive ports as disabled */

void disable_port(int j)
{
setpos(6,35+11*j);
textbackground(BACKGROUNDCOLOR);
textcolor(DISABLEDCOLOR);
cprintf("LPT %d [ ]",j+1);
textcolor(FOREGROUNDCOLOR);
}

/* Actions performed on exit */
void exit_jobs(void)
{
/* Turn off the mouse */
mouseoff();

/* Clear text screen */
textbackground(0);
textcolor(7);
clrscr();

/* Restore cursor */
_setcursortype(_NORMALCURSOR);

/* Send message */
printf("Parallel Port Debug Tool V2.0 - August 1998\\n");
printf("Source Code Available from http://www.senet.com.au/~cpeacock/pdebug.htm\\n\\n");
}

/* Initialization */
int init(void)
{
int j;

/* See whether there are ports to debug! */
getports();
if (!port_number)
{
printf("Parallel Port Debug Tool V2.0 - August 1998\\n");
printf("Source Code Available from http://www.senet.com.au/~cpeacock/pdebug.htm\\n");
printf("Sorry, No detectable Parallel Port found on your PC\\n\\n");
return(0);
}

/* Set default port to LPT1 */
port = port_positions[0];

/* Screen initialization */
textbackground(0);
textcolor(FOREGROUNDCOLOR);
clrscr();

textbackground(BACKGROUNDCOLOR);
cprintf("ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»");
cprintf("º º");
cprintf("º PARALLEL PORT DEBUG TOOL V2.0 º");
cprintf("º http://www.senet.com.au/~cpeacock º");
cprintf("º º");
cprintf("ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĶ");
cprintf("º Base Address 0x LPT 1 [ ] LPT 2 [ ] LPT 3 [ ] LPT 4 [ ] º");
cprintf("ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĶ");
cprintf("º Printer Port Pin 2 Pin 3 Pin 4 Pin 5 Pin 6 Pin 7 Pin 8 Pin 9 º");
cprintf("º Bit Number 0 1 2 3 4 5 6 7 º");
cprintf("º Status [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] º");
cprintf("ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĶ");
cprintf("º Base + 1 Status Port (Input) ³ Base + 2 Control Port (Open Collector) º");
cprintf("º ³ º");
cprintf("º Bit 7 [ ] Busy (Pin 11) ³ Bit 7 [ ] Reserved º");
cprintf("º Bit 6 [ ] ACK (NOT) (Pin 10) ³ Bit 6 [ ] Reserved º");
cprintf("º Bit 5 [ ] Paper Out (Pin 12) ³ Bit 5 [ ] Enable Bidirectional Port º");
cprintf("º Bit 4 [ ] Select In (Pin 13) ³ Bit 4 [ ] Enable IRQ via ACK (Pin 10) º");
cprintf("º Bit 3 [ ] Error (NOT) (Pin 15) ³ Bit 3 [ ] Select Printer (Pin 17) º");
cprintf("º Bit 2 [ ] IRQ (NOT) ³ Bit 2 [ ] Initialize Printer (Pin 16) º");
cprintf("º Bit 1 [ ] Reserved ³ Bit 1 [ ] Auto Linefeed (Pin 14) º");
cprintf("º Bit 0 [ ] Reserved ³ Bit 0 [ ] Strobe (Pin 1) º");
cprintf("ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ");

/* Show non-existent ports as disabled */
for (j = port_number; j < 4; j++)
disable_port(j);

/* Turn on the mouse */
mouseon();

/* Hide the cursor */
_setcursortype(_NOCURSOR);

/* Clear output ports */
outport(port,0);
outport(port + 2,0);

/* Ok. */
return 1;
}

/* Main program */

main()
{
/* VARIABLES */
int
base0, /* buffer for port + 0 */
oldbase0, /* previous value */
base1, /* buffer for port + 1 */
oldbase1, /* previous value */
base2, /* buffer for port + 2 */
oldbase2, /* previous value */
oldport, /* previous port */
c, /* char buffer */
a, /* temp variable */
j, /* temp & cycle var. */
mask;

MY_SHORT int /* MY_SHORT assures those variables are 2 bytes */
row,
column,
buttonstatus;




/* INITIALIZATION */
/* init sends 0 if ports could not be found */
if (!init())
return (1);

/* MAIN LOOP */
do
{
/* Get ports status */
base0 = inportb(port);
base1 = inportb(port+1);
base2 = inportb(port+2);

/* Freshen port section */
if (oldport != port)
{
mouseoff();
setpos(6,17);
textbackground(BACKGROUNDCOLOR);
cprintf("%04X (%d)",port,port);
for (j = 0; j < port_number; j++)
{
setpos(6,42+11*j);
if (port == port_positions[j])
cprintf("X");
else
cprintf(" ");
}
oldport=port;
mouseon();
}

/* Freshen base + 0 section */
if (oldbase0 != base0)
{
for (j = 0, mask = 0x01; j < 8; j++, mask <<= 1)
{
setpos(10,21+7*j);
if (base0 & mask)
cprintf("X");
else
cprintf(" ");
}
oldbase0 = base0;
}

/* Freshen base + 1 section */
if (oldbase1 != base1)
{
for (j = 0, mask = 0x80; j < 8; j++, mask >>= 1)
{
setpos(14+j,9);
if (base1 & mask)
cprintf("X");
else
cprintf(" ");
}
oldbase1 = base1;
}

/* Freshen base + 2 section */
if (oldbase2 != base2)
{
for (j = 0, mask = 0x80; j < 8; j++, mask >>= 1)
{
setpos(14+j,45);
if (base2 & mask)
cprintf("X");
else
cprintf(" ");
}
oldbase2 = base2;
}

/* Function keys input section */
a = kbhit();
if (a != 0)
{
c = getch();
setpos(1,0);
if (!c) /* Function keys F1...F8 */
{
c = getch() - 59;
if ((c >= 0) && (c <= 7))
{
/* Find the right mask */
mask = 0x01 << c;
/* Toggle bit */
if (base0 & mask)
base0 &= ~mask;
else
base0 |= mask;
/* Give it in output */
outportb(port,base0);
}
}
}

/* Mouse input section */
mousestatus(&row,&column,&buttonstatus);
if (buttonstatus != 0)
{
/* First of all, inspect row controls... */
if (row == 48) /* Change port? */
{
j = column - 336;
if ((!(j % 88)) && (j / 88 < 4) && (j >= 0))
if (port_number > j/88)
port = port_positions[j/88];
}
else if (row == 80) /* change data port status? */
{
j = column - 168;
if ((!(j % 56)) && (j / 56 < 8) && (j >= 0))
data(0x01<<(j/56),port,base0); /* mask = 0x01 << j */
}

/* ... then, inspect column controls... */
if (column == 360) /* Change control port status? */
{
j = (row - 112)/8;
if ((j >= 0) && (j < 8))
data(0x80>>j,port+2,base2);
}

/* Wait for the user to release mouse buttons */
while (buttonstatus)
mousestatus(&row,&column,&buttonstatus);
}
} while (c != 27);

/* EXIT FUNCTION */
exit_jobs();

return 0;
}
</pre>

-Thomas



t