⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diotst02.c

📁 功能强大
💻 C
字号:
/*-
 *  ----------------------------------------------------------------------
 *  File        :   DIOTST02.C
 *  Creator     :   Blake Miller
 *  Version     :   01.01.00        February 1991
 *  Language    :   Microsoft C     Version 5.1
 *  Purpose     :   Intel 8255 Compatible Digital IO Functions
 *              :   Test Program #2
 *  ----------------------------------------------------------------------
 *  Link : DIOLIB?.LIB
 *  ----------------------------------------------------------------------
 *  Revision History:
 *  022891 BVM  :   Creation
 *  ----------------------------------------------------------------------
 */

#define P_NAME  "DIOTST02"
#define P_TITL  "DIOLIB Multi Digital IO"
#define P_AUTH  "Blake Miller"
#define P_VERS  "01.01.00"
#define P_DATE  "February 28, 1991"
#define P_PURP  "Toggle bits on the 8255 ports"

/*  Include Files ----------------------------*/

#define     DIOTST02_C_DEFINED  1
#include    <conio.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    "DIOLIB.H"
#undef      DIOTST02_C_DEFINED

/*  Function Prototype -----------------------*/

void pg_exit (short);
void kb_dump (void);    /* keyboard flush function  */
void kb_wait (void);    /* keypress wait / message  */

/*-
 *  ----------------------------------------------------------------------
 *  Function Definition
 *  ----------------------------------------------------------------------
 */

void main (void)
	{
	short           i, j;       /* counter      */
	short           bitnum;     /* bit number   */
	short           bstate;     /* bit state    */
	char            s[32];      /* gets buffer  */
	DIODAT          dioprt;     /* port data    */

	short           chpcnt = 0; /* number 8255 on board */
	short           bitcnt = 0; /* total number bits    */

	/*  Print Program Header
	 */
	printf ("\n" );
	printf ("Program    : %s - %s.\n", P_NAME, P_TITL );
	printf ("Author     : %s\n", P_AUTH );
	printf ("Version    : %s  %s\n", P_VERS, P_DATE );
	printf ("Purpose    : %s.\n", P_PURP );
	printf ("\n" );
	printf ("This program will fiddle with the bits of the 8255.\n");
	printf ("This program was designed to work with digital I/O\n");
	printf ("boards containing multiple 8255s.\n");
	printf ("This program assumes that the 8255s can do input and output!\n");
	printf ("\n");
	printf ("Do you wish to continue [Y]:N : ");
	gets (s); if ( *s == 'N' ) exit (0);

	/*  Prompt user for number of 8255 on board.
	 *  Exit if an empty string is entered.
	 */
	printf ("Enter the number of 8255s on the board : ");
	gets (s); if ( *s == 0 ) exit (0);
	chpcnt = atoi(s);
	bitcnt = 24 * chpcnt;   /* 24 bits on each 8255 */

	/*  Set up 8255 DIODAT array size data
	 *  based on number of ports specified.
	 */
	if ( dio_pa_aloc (chpcnt) ){
		printf ("Error allocating memory for DIODAT buffers.\n");
		exit (1);
		}

	/*  Prompt user for base address of each 8255.
	 *  Exit if any empty string is entered.
	 */
	printf ("NOTE: 300 Hex is 768 in decimal.\n");
	printf ("NOTE: On most boards, the 8255s are spaced 4 bytes apart.\n");
	for ( j = 0; j < chpcnt; j++ ){
		printf ("Enter base address (decimal) of 8255 #%2d : ", j);
		gets (s); if ( *s == 0 ) pg_exit (0);
		i = atoi(s);            /* get address of 8255  */
		dio_pa_setadr (j, i);   /* set address of 8255  */
		}

	/*  --------------------------------------------------------
	 *  Digital Output Demonstration
	 *  --------------------------------------------------------
	 */

	printf ("\n" );
	printf ("----------------------------------------------\n");
	printf ("Digital Output Demonstration.\n");
	printf ("Set up output detection circuitry on ANY of the 8255\n");
	printf ("output lines.  They will be toggled, flashed, etc.\n");
	printf ("ALL lines will be set for output so remove any driving\n");
	printf ("(INPUT) circuitry at this time, please.\n");
	kb_wait();

	for ( j = 0; j < chpcnt; j ++ ){
		dio_pa_config (j, 0, 0, 0, 0);   /* all ports output     */
		}

	printf ("Clear all bits in digital IO...\n");
	for ( bitnum = 0; bitnum < bitcnt; bitnum++ ){
		dio_pa_bitput (bitnum, 0);
		}

	printf ("Toggle bits in digital IO.\n");
	printf ("Press key to make it stop.\n");

	bitnum = 0; /* start at bit 0   */

	while ( 1 ){

		if ( kbhit() ) break;

		dio_pa_bitput (bitnum, 0);      /* clear bit (OFF)      */
		bitnum++;                       /* next bit number      */
		bitnum = (bitnum % bitcnt);     /* Range: [0:bitnum-1]  */
		dio_pa_bitput (bitnum, 1);      /* set   bit (ON )      */

		for ( i = 0; i < 1000; i++ ){   /* simple delay loop    */
			printf ("...\r");
			}
		}

	/*  --------------------------------------------------------
	 *  Digital Input Demonstration
	 *  --------------------------------------------------------
	 */

	printf ("\n" );
	printf ("----------------------------------------------\n");
	printf ("Digital Input Demonstration.\n");
	printf ("Set up some input circuitry on ANY of the 8255\n");
	printf ("digital I/O lines.  They will be sensed.\n");
	printf ("ALL lines will be set for input so remove any detection\n");
	printf ("(OUTPUT) circuitry at this time, please.\n");
	kb_wait();

	for ( j = 0; j < chpcnt; j ++ ){
		dio_pa_config (j, 1, 1, 1, 1);      /* all ports input */
		}
	for ( bitnum = 0; bitnum < bitcnt; bitnum++ ){
		dio_pa_bitget (bitnum, &bstate);    /* all bits read    */
		}

	printf ("Read ALL bits in digital IO...\n");
	for ( bitnum = 0; bitnum < bitcnt; bitnum++ ){
		dio_pa_bitget (bitnum, &bstate);    /* bit is read      */
		printf ("Bit %2d is ", bitnum);
		if ( bstate )   printf ("SET  \n");
		else            printf ("CLEAR\n");
		if ( (bitnum+1) % 15 == 0 )         /* so lots o bits doesn't   */
			kb_wait();                      /* scroll off the screen!   */
		}
	kb_wait();

	printf ("Set any new input configuration before all bits\n");
	printf ("will be sensed and the settings printed out.\n");
	kb_wait();

	for ( bitnum = 0; bitnum < bitcnt; bitnum++ ){
		dio_pa_bitget (bitnum, &bstate);    /* bit is read      */
		printf ("Bit %2d is ", bitnum);
		if ( bstate )   printf ("SET  \n");
		else            printf ("CLEAR\n");
		if ( (bitnum+1) % 15 == 0 )
			kb_wait();
		}
	kb_wait();

	printf ("----------------------------------------------\n");
	printf ("That is the end of this demonstration program.\n");
	kb_wait();

	exit ( 0 );
	}


/*- Special Program Exit
 *  Called from anywhere in program.
 *  Allows program to free DIODAT memory
 *  that may have been allocated.
 */
void pg_exit ( short ecode )
	{
	dio_pa_free ();     /* free memory in case allocated    */
	printf ("%s Program Exiting : %d\n", P_NAME, ecode );
	exit (ecode);
	}


/*-
 *  ----------------------------------------------------------------------
 *  Support Function Definitions
 *  ----------------------------------------------------------------------
 */

/*- Flush Keyboard ----------------------------**
 *  Check for keypress, and read them out of
 *  the buffer until there are no more.
 */
void kb_dump (void)
	{
	while ( kbhit() ){              /* key was pressed          */
		if ( (getch() == 0x00) ||   /* read out keypress        */
			 (getch() == 0xE0) )
			getch();                /* no 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.
 */
void kb_wait (void)
	{
	kb_dump ();
	printf ("\r\n");
	printf ("[ PRESS <SPACE-BAR> TO CONTINUE ]\r");
	if ( getch() == 0 ) getch();
	printf ("                                 \r");
	}

/*-
 *  ----------------------------------------------------------------------
 *  END DIOTST02.C Source File
 *  ----------------------------------------------------------------------
 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -