Esta es una vista previa del archivo. Inicie sesión para ver el archivo original
// Ejercicio 10 de puertos CON MACROS y PUNTEROS #include <stdio.h> #include<stdlib.h> #include "sim10.c" //#include<sys/io.h> #define N 8 #define PUERTO 0x400 #define LeePort(Y) Y=inb(PUERTO); // macro para leer del puerto /*#define LISTAR(VP,TAM) \ { int i; \ printf("Molinete\t Personas\n"); \ for(i=0;i<TAM;i++) \ printf("%d\t\t%d\n",i, *(VP + i)); \ }*/ #define LISTAR(VP,TAM) \ { int i; \ int *P;\ printf("Molinete\t Personas\n"); \ for(P=VP,i=0; i<TAM ; P++,i++) \ printf("%d\t\t%d\n",i,*P); \ } //void Listar(int[], int); //Función para mostrar la información de los molinetes. struct CB { unsigned int S:1; unsigned int M:3; unsigned int :3; unsigned int F:1; }; //Esta estructura es la del byte que se recibe en el PUERTO. union Un { struct CB dato; unsigned char byte; //Se genera este byte para guardar lo leído en el puerto y luego se analizan la información por separado. }; int main() { union Un U; int personas[8]={0}; int fin=0; ioperm(PUERTO,1,1); while(!fin) { do { //U.byte=inb(PUERTO); LeePort(U.byte) }while( U.dato.S==0); if(U.dato.F==1) fin=1; else { personas[U.dato.M]++; do { //U.byte=inb(PUERTO); LeePort(U.byte) }while(U.dato.S==1); /*Se espera a que el bit de sincronismo pase a cero (0) nuevamente. Sino, se analiza el mismo dato más de una vez, como si una persona pasara muchas veces , en vez de una vez: S=0 No hay datos. S=1 Nuevo dato. S=0 Cambio de bit de sincronismo. S=1 Nuevo dato. */ } } LISTAR(personas,N) // invocacion de la MACRO //Listar(personas,N); // llamada a funcion ioperm(PUERTO,1,0); //Fin del programa. printf("\n\n\n\t\t FIN DEL PROGRAMA.\n\n"); system("pause"); // Esto no va en Linux. return 0; } //////////////////////////////////////////////////////////////////////////// /*void Listar(int VP[], int TAM) { int i; printf("Molinete\t Personas\n"); for(i=0;i<TAM;i++) { printf("%d\t\t%d\n",i,VP[i]); } }*/