/***************************************************************************** * This sample program will sequentially turn on all bits of port 0 of the * * IOD64 and then sequentially turn them off. Each time it sets a new bit, * * both port 0 and port 1 are read and the data displayed. This * * demonstrates how to read and write to a port, and to use the read back * * function of the board. * *****************************************************************************/ #include #include #include #include #include #include /* these are the port address offsets for reading and writing to the IOD64 */ unsigned int Port0; unsigned int Port1; unsigned int Control; /* this typedef allow use to duplicate the boolean type as used in pascal */ typedef enum {FALSE,TRUE} boolean; /***************************************************************************** * FUNCTION: signon -- local routine * * PURPOSE: To display an initial sign on message on the screen. * *****************************************************************************/ void signon(void) { #define L1 " A C C E S I O D 6 4 C A R D S A M P L E P R O G R A M " #define L4 " PORT 0 OUTPUT PORT 0 INPUT PORT 1 INPUT" #define L5 " ------------- ------------ ------------" #define L6 " PRESS ANY KEY TO EXIT PROGRAM " int index; /* print the string display */ clrscr(); gotoxy(13,1); printf("%s",L1); gotoxy(17,6); printf("%s",L4); gotoxy(17,7); printf("%s",L5); gotoxy(27,10); printf("%s",L6); } /* end signon */ /***************************************************************************** * FUNCTION: write_port_data -- local routine * * PURPOSE: Displays the current port values on the screen. * *****************************************************************************/ void write_port_data(unsigned char current[3]) { unsigned x,y,index1,index; unsigned char value; x = 20; /* x coordinate to write value to screen */ y = 8; for (index = 0;index <= 2;index++) /* for each array member */ { value = current[index]; for (index1 = 0;index1 <= 7;index1++) /* for each bit in array member */ { gotoxy(x,y); if (value % 2) putchar('1'); else putchar('0'); value = value >> 1; /* roll next diaplay bit */ x++; } x+= 10; } } /* end write_port_data */ /****************************************************************************** Function AskForBaseAddress Purpose: This function allows the user to input the address of the card. *****************************************************************************/ unsigned AskForBaseAddress(unsigned int OldOne) { char msg[7]; int NewOne = 0, Success = 0, Dummy; int AddrInputPosX, AddrInputPosY; puts("\nPlease enter the Base Address for your card (in hex)"); printf("or press ENTER for %X.\n>", OldOne); AddrInputPosX = wherex(); AddrInputPosY = wherey(); do { gotoxy(AddrInputPosX, AddrInputPosY); clreol(); msg[0] = 5; msg[1] = 0; cgets(msg); sscanf(msg + 2, "%x", &NewOne); Success = 1; Dummy = NewOne; if (msg[1] == 0) { gotoxy(AddrInputPosX, AddrInputPosY); printf("%X", OldOne); Success = 1; Dummy = OldOne; } } while(!Success); return (Dummy); } /* end of AskForBaseAddress */ /***************************************************************************** * FUNCTION: main -- external routine * *****************************************************************************/ void main() { unsigned char current[3]; boolean shift_left; clrscr(); puts(" MODULE : SAMPLE1.C"); puts(""); puts("This sample program will sequentially turn on all bits of port 0 of the"); puts("IOD64 and then sequentially turn them off. Each time it sets a new bit,"); puts("both port 0 and port 1 are read and the data displayed. This"); puts("demonstrates how to read and write to a port, and to use the read back"); puts("function of the board."); gotoxy(1,9); puts("COM ADDRESS"); Port0 = AskForBaseAddress(0x300); Port1 = Port0 + 1; Control = Port0 + 8; clrscr(); printf("\n\n\nBoard Configuration:\n\n"); printf(" -- Base Address is %X hex\n", Port0); printf(" -- All remaining jumper settings are irrelevant.\n\n\n"); printf("Press a key to continue"); getch(); signon(); /* print the start up message */ current[0] = 0; shift_left = TRUE; outportb(Control,0x01); while(!kbhit()) /* loop until key pressed */ { outportb(Port0,current[0]); /* write value to relay output */ delay(10); current[1] = inportb(Port0); /* read back what we wrote to relays */ current[2] = inportb(Port1); /* read the data on OPTO INPUTS */ write_port_data(current); /* write new data to screen */ delay(700); /* compute value to turn on/off nesxt bit in line */ if (current[0] == 0) shift_left = TRUE; if (current[0] == 255) shift_left = FALSE; if (shift_left) current[0] = (current[0] << 1) + 1; else current[0] = (current[0] - 1) >> 1; }; clrscr(); } /* end main program */