www.pudn.com > 8255_code_lib.rar > I8255TO1.C


/*- 
 *  ---------------------------------------------------------------------- 
 *  File        :   I8255TO1.C 
 *  Creator     :   Blake Miller 
 *  Version     :   01.00.00            February 1991 
 *  Language    :   Microsoft Quick C   Version 2.0 
 *  Purpose     :   I8255 Digital IO 
 *              :   Demonstration Program #1 
 *  ---------------------------------------------------------------------- 
 */ 
 
#include     
#include     
#include     
#include    "I8255FN.H" 
 
#define     PPI_BASE    0x300   /* I8255 Base Address   */ 
 
void    main ( void ); 
void kb_dump ( void );  /* flush keyboard buffer    */ 
int  kb_wait ( void );  /* wait for keypress        */ 
 
/*  convert unsigned data value to a binary string 
 */ 
extern void scv_uvtobs ( void *, char *, int, int, int, int ); 
 
void main (void) 
	{ 
	unsigned char   inbyte;         /* input byte   */ 
	I8255DAT        diodat;         /* 8255 data    */ 
	char            strdat[16];     /* binary text  */ 
 
	/*  Initialize 8255 data, assuming base address is at PPI_BASE 
	 */ 
	I8255_init (&diodat, PPI_BASE); 
 
	/*  Initialize 8255 hardware, and set all ports to output 
	 */ 
	I8255_config (&diodat, 0, 0, 0, 0); 
 
	/*  Set data for all ports to zero 
	 */ 
	I8255_put_byte (&diodat, 1, 0); 
	I8255_put_byte (&diodat, 2, 0); 
	I8255_put_byte (&diodat, 3, 0); 
 
	printf ("Set port A to all 1\n"); 
	I8255_put_byte (&diodat, 1, 0xFF); 
	kb_wait(); 
	printf ("Set port A to all 0\n"); 
	printf ("Set port B to all 1\n"); 
	I8255_put_byte (&diodat, 1, 0x00); 
	I8255_put_byte (&diodat, 2, 0xFF); 
	kb_wait(); 
	printf ("Set port B to all 0\n"); 
	printf ("Set port C to all 1\n"); 
	I8255_put_byte (&diodat, 2, 0x00); 
	I8255_put_byte (&diodat, 3, 0xFF); 
	kb_wait(); 
	I8255_put_byte (&diodat, 3, 0x00); 
 
	printf ("Set all ports to input.\n"); 
	I8255_config (&diodat, 1, 1, 1, 1); 
 
	kb_dump (); 
	printf ("\nPrint out input value of Port A till keypress...\n"); 
	while ( !kbhit() ){ 
		I8255_get_byte (&diodat, 1, &inbyte); 
		scv_uvtobs ( (void *)&inbyte, strdat, 7, 0, '1', '0' ); 
		printf ("Port A Data : %02X = %s\r", (unsigned int)inbyte, strdat); 
		} 
 
	kb_dump (); 
	printf ("\nPrint out input value of Port B till keypress...\n"); 
	while ( !kbhit() ){ 
		I8255_get_byte (&diodat, 2, &inbyte); 
		scv_uvtobs ( (void *)&inbyte, strdat, 7, 0, '1', '0' ); 
		printf ("Port B Data : %02X = %s\r", (unsigned int)inbyte, strdat); 
		} 
 
	kb_dump (); 
	printf ("\nPrint out input value of Port C till keypress...\n"); 
	while ( !kbhit() ){ 
		I8255_get_byte (&diodat, 3, &inbyte); 
		scv_uvtobs ( (void *)&inbyte, strdat, 7, 0, '1', '0' ); 
		printf ("Port C Data : %02X = %s\r", (unsigned int)inbyte, strdat); 
		} 
 
	exit (0); 
	} 
 
/*- Flush Keyboard ----------------------------** 
 *  Check for keypress, and read them out of 
 *  the buffer until there are no more. 
 */ 
void kb_dump (void) 
	{ 
	short   ch; 
	while ( kbhit() ){          /* key was pressed          */ 
		ch = getch();           /* read out keypress        */ 
		if ( (ch == 0x00) || (ch == 0xE0) ) 
			getch();            /* eat function key codes   */ 
		} 
	} 
 
/*- Keyboard Wait ----------------------------** 
 *  Flush keyboard. 
 *  Print blank line, then print a message to press 
 *  spacebar to continue, then wait for keypress, then 
 *  erase message and return. 
 */ 
int kb_wait ( void ) 
	{ 
	short   ch; 
 
	kb_dump (); 
	printf ("\r\n"); 
	printf ("[ PRESS  TO CONTINUE ]\r"); 
	ch = getch(); 
	if ( (ch == 0x00) || (ch == 0xE0) ) 
		ch = getch() | 0x0100; 
	printf ("                                 \r"); 
	return (ch ); 
	} 
 
/*- 
 *  ---------------------------------------------------------------------- 
 *  END I8255T01.C Source File 
 *  ---------------------------------------------------------------------- 
 */