Desarrollo del software

Procedimiento: Código fuente

/***************************************************************************/
/*Declaracion de las librerias a usar*/

#include <stdlib.h>
#include <graphics.h>
#include <ctype.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>

/***************************************************************************/
/*Declaracion de funciones*/

void recipiente();
void reseteo();
void cubicos();
void bomba();
void apaga();

/***************************************************************************/
/*Principal del programa*/

void main()
{
int cont,nivel,n,sw,niv,niv2,cant=1;
int controlador=DETECT, modo,cero=0;
char cadena[15],can[10]="1",v;
_setcursortype(_NOCURSOR); //Elimina el cursor de la pantalla
reseteo(); //Llamada a la funcion que resetea el contador
apaga(v); //Llamada a la funcion que apaga los pines del puerto
reseteo();
cont=0;
nivel=0;
niv=0;
while ((cant%100)!=0||cant==0||cant>1000)
{
clrscr(); //Borrado de la pantalla
gotoxy(25,12); //Posiciona el cursor en las coordenadas x,y
printf("¨Cuantos cc desea llenar?\n\t\tEl valor debe estar entre 100 y 1000 cc:\n");
gotoxy(58,13);
scanf("%s",&can);
cant=atoi(can);
}
cant=cant/100;
cant=cant+1;
initgraph(&controlador,&modo,""); //Inicialización del modo grafico
recipiente(nivel); //Llamada al procedimiento que dibuja el estanque
bomba(); //Llamada a funcion que activa la bomba de agua
while(cont<cant) //Cont chequea que muestre el llenado hasta el valor ingresado
{
sw=0;
nivel=paralelo(); //Llamada a la funcion que recibe valor desde el paralelo
if(cero==0&&nivel==8) //El contador llega hasta 9...
cero=1;
else
{
if(cero==1&&nivel==8) //...por lo cual la segunda vez que llega un 0 a la variable 'nivel' se le asigna el valor 2, que luego del ajuste quedará en 10
nivel=2;
}
if(nivel!=niv) //Si el numero recibido no es igual al anterior realiza las conversiones
{
niv=nivel;
/*Como los valores recibidos por el paralelo estan ordenados pero no
corresponden a los valores reales se debe realizar una conversion. La
secuencia es como sigue: 0=8 - 1=9 - 2=10 - 3=11 - 4=12 - 5=13 - 6=14
7=15 - 8=0 - 9=1*/

if((nivel>=8)&&(nivel<16))
{
sw=1;
nivel=nivel-8;
}
if((nivel>=0)&&(nivel<8)&&(sw!=1))
nivel=nivel+8;
niv2=nivel;
niv2=niv2*15; //Multiplicamos por 15 para enviarllo a la funcion grafica que muestra el llenado
cubicos(cont,niv2); //Llamada a la funcion que va mostrando los cc al lado del recipiente
cont++;
recipiente(niv2); //Llamada a funcion que dibuja el recipiente
delay(100); //retraso
}
}
apaga(); //Llamada a funcion que apaga los pines del puerto
setcolor(GREEN); //Fijar el color de la letra
settextstyle(4,0,5); //Fijar el estilo de la letra
outtextxy(250,350,"Finalizado"); //Escritura en modo grafico, al finalizar el llenado
getch();
closegraph(); //Cerrar el modo grafico
reseteo(); //Lamada a funcion que resetea el contador
}


/***************************************************************************/
/*Funcion que dibuja el recipiente*/

void recipiente(nivel)
int nivel;
{
setcolor(4); //Fijando el color
line(220,350,420,350); //Dibijando las 3 lineas, que forman el recipiente
line(220,350,220,150);
line(420,350,420,150);
setcolor(BLUE); //Fijando el color
setfillstyle(1,BLUE); //Fijando estilo de llenado en modo grafico y color azul
bar(221,350-nivel,419,349); //Dibujando el progreso de llenado
}


/***************************************************************************/
/*Funcion que recive los datos enviados por el puerto*/
int paralelo()
{
asm mov ax,0x00 //Se inicializa el registro AX a 0
asm mov dx,0x379 /*379 es la direcci¢n de memoria por la cual el puerto
paralelo recibe datos. Se deja en DX*/

asm in ax,dx /*Como los datos recibidos quedan en el nibble alto del AL debemos
primero dejar el nibble bajo en 0 y luego hacer un corrimiento de
4 bits a la derecha*/

asm and al,0xf0
asm shr al,4 //Corrimiento de 4 bits a la derecha
return(_AL); //Ahora retornamos AL
}

/***************************************************************************/
/*Funcion que escribe "X cc", en el dibujo del recipiente*/
void cubicos(cont,nivel)
int cont;
int nivel;
{
char cadena[10];
int i=100,y;
i=i*cont;
setcolor(WHITE); //Fija color en blanco
sprintf(cadena,"-%d cc.",i); //Escribe el numero de cc
settextstyle(0,0,1); //Fija el estilo de texto
y=346-nivel;
outtextxy(420,y,cadena); //Escribe en las coordenadas x,y
}

/***************************************************************************/
/*Funcion que resetea el contador*/

void reseteo()
{
asm mov ax,0x00 //Fija AX en 0
asm mov dx,0x378 //Asigna el número del puerto a DX
asm out dx,ax //Envía el valor de AX por el puerto
asm mov ax,0x4 //Fija AX en 4
asm out dx,ax
asm mov ax,0x0
asm out dx,ax
}

/***************************************************************************/
/*Funcion que "apaga" los pines del puerto paralelo*/
void apaga(v)
char v;
{
v=0;
asm mov al,v //Asigna 'v' a AL
asm mov dx,0x378 //Asigna la direccion del puerto a DX
asm out dx,ax //Envia el valor de 'v' por el puerto
}


/***************************************************************************/
/*Funcion que activa la bomba de agua*/

void bomba()
{
asm mov ax,0x01 //Asigna 1 a AL
asm mov dx,0x378 //Asigna la direccion del puerto a DX
asm out dx,ax //Envia el valor de AX por el puerto
}

/***************************************************************************/
/*Fin del programa*/
/***************************************************************************/

 

 

  Atrás
 
  Siguiente
Indice