/***************************************************************************** * MODULE: SAMPLE8.C * * * * This sample program will sequentially turn on all bits in port a and then* * seqentially turn them off. Each time it sets a new bit, both port a and * * port b are read and the data displayed. This demonstartaes how to read * * and write to a port, and to use the read back function of the 8255 chip. * * If the port a pins are jumpered to the port b pins, then a board test * * program results, with port b being used to verify what has been written * * to port a. The program will use port 0 of cards with mulitple 8255's. * * * *****************************************************************************/ #include #include #include #include unsigned int Address; /* assign Base Address to variable */ /* this typedef allow use to duplicate the boolean type as used in pascal */ typedef enum {FALSE,TRUE} boolean; void IOPermission(unsigned abase) { if(ioperm(abase,32,1)<0) { fprintf(stderr, "NO IO PERMISSION\n"); } } unsigned AskForBaseAddress(unsigned int OldOne) { char msg[3]; unsigned int newone; unsigned int temp = 0; int index = 0; int letter; puts("Please enter the Base Address for your card (in hex)"); printf("or press ENTER for %X.\n>", OldOne); while(temp==0) { newone=0; index=0; while((letter = getchar())!='\n') msg[index++] = letter; sscanf(msg, "%X", &newone); if(newone==0){ temp=OldOne; } else if((newone>=0x100)&&(newone<=0x3f0)){ temp=newone; } else { printf("\nEnter the Base Address or press ENTER for %x > ", OldOne); for(index=0; index<=3; index++) msg[index]=0; } } return(temp); } /* end of AskForBaseAddress */ /***************************************************************************** * FUNCTION: signon -- local routine * * * * PURPOSE: To display an initial sign on message on the screen. * * * * INPUT: None. * * * * OUTPUT: None. * * * *****************************************************************************/ void signon() { int clear; system("clear"); printf( " 8255 Digital I/O Sample Program \n" "This sample program will sequentially turn on all bits in port a and then \n" "seqencially turn them off. Each time it sets a new bit, both port a and \n" "port b are read and the data displayed. This demonstrates how to read \n" "and write to a port, and to use the read back function of the 8255 chip. \n" "If the port a pins are jumpered to the port b pins, then a board test \n" "program results, with port b being used to verify what has been written \n" "to port a. The program will use port 0 of cards with mulitple 8255's. \n"); /* print the string display and ask for the base address */ Address=AskForBaseAddress(0x340); IOPermission(Address); system("clear"); puts("Board Configuration:\n"); printf(" -- Base Address is %X hex\n",Address); printf(" -- Connect a loopback cable from PORT A to PORT B of PPI0. (required)\n"); printf("PRESS ENTER TO CONTINUE"); while((clear=getchar())!='\n'); system("clear"); printf(" PORT A OUTPUT PORT A INPUT PORT B INPUT \n"); printf(" ------------- ------------ ------------ \n"); system("tput cup 27 10"); puts(" PRESS ANY KEY TO EXIT PROGRAM "); } /* end signon */ /***************************************************************************** * FUNCTION: write_port_data -- local routine * * * * PURPOSE: Displays the current port values on the screen. * * * * INPUT: current: array with the port reading to display. * * * *****************************************************************************/ void write_port_data(unsigned char current[3]) { unsigned index1,index; unsigned char value; int i; i=1; system("tput cup 0 0 "); /* x coordinate to write value to screen */ for (index = 0;index <= 2;index++) /* for each array member */ { value = current[index]; if (i==1) { system("tput cup 1 3"); i++; } else if (i==2) { system("tput cup 1 21"); i++; } else if (i==3) { system("tput cup 1 39"); } for (index1 = 0;index1 <= 7;index1++) /* for each bit in array member */ { if (value % 2) putchar('1'); else putchar('0'); value = value >> 1; /* roll next diaplay bit */ } puts("\n"); } } /* end write_port_data */ int main() { unsigned char current[3]; boolean shift_left; // int clear; int x=0; signon(); outb(0x8b,Address+19); /* send the control byte */ current[0] = 0; shift_left = TRUE; do { outb(current[0],Address+16); /* write value to port a */ current[1] = inb(Address+16); /* read back what we wrote to port A */ current[2] = inb(Address+17); /* read the data on port B */ write_port_data(current); /* write new data to screen */ x++; system("sleep 1"); /* 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; }while(x!=5); return 0; } /* end main program */