Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programas en C Graficacion y Puertos
Programas en C Graficacion y Puertos
UNIDAD 7 y 8
Unidad 7 Grficos
Grficos BGI
Los grficos BGI, son grficos para el modo DOS, que se pueden ejecutar gracias a la librera BGI (Borland Graphics Interface). Utilizar esta librera nativa del Borland C++, nos evita tener que estar utilizando interrupciones al DOS escritas en ASM. Adems, basta con que incluyamos las libreras en la misma carpeta que nuestra aplicacin y quien lo reciba, podr ver los grficos sin ningn problema.
Para poder utilizar los grficos BGI en nuestras aplicaciones, debemos incluir la librera graphics.h.
Programacin bsica
pgina 2
Colores disponibles:
BLACK --> Negro RED --> Rojo BLUE --> Azul MAGENTA --> Prpura GREEN --> Verde BROWN --> Marrn CYAN --> Matiz entre azul y verde YELLOW --> Amarillo LIGHTGRAY --> Gris Claro DARKGRAY --> Gris Oscuro LIGHTBLUE --> Azul Claro LIGHTGREEN --> Verde Claro LIGHTCYAN --> Matiz entre azul y verde, claro.... LIGHTRED --> Rojo Claro WHITE --> Blanco LIGHTMAGENTA --> Prpura Claro
Ahora, mostraremos las alineaciones, es decir, si el texto se va a mostrar de manera horizontal (Izquierda a Derecha) o vertical (Arriba a Abajo):
HORIZ_DIR VERT_DIR
Programacin bsica
pgina 3
int main(void) {int gdriver = DETECT, gmode; int x,y; initgraph(&gdriver, &gmode, "c:\\bc31\\bgi"); x=getmaxx()/2; y=getmaxy()/2; circle(x,y,100); outtextxy(x-80,y,"Ingenieria Mecanica"); getch(); closegraph(); return 0; }
La librera winbgim.h a sido creada originalmente por Konstantin Knizhnik's winbgi shareware y posteriormente modificada por Mark Richardson y Michael Main, esta librera tiene como objetivo emular la librera graphics.h de Borland C++ y facilitar algunas funciones del Mouse. La ventaja de esta librera es que nos permite crear aplicaciones grficas con compiladores GNU tales como el ambiente de desarrollo Dev C++ de la misma manera como se crean en el compilador comercial Borland C++.
Programacin bsica
pgina 4
Esta librera no solo soporta los 16 colores de la librera graphics.h de Borland mediante las constantes BLACK BLUE GREEN CYAN RED MAGENTA BROWN LIGHTGRAY DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED LIGHTMAGENTA YELLOW WHITE, sino que es posible usar colores rgb, lo cual nos da al rededor de 16 millones de colores incrustando el macro COLOR(r,g,b) en donde originalmente estara el indicado el color. El resto de las funciones grficas funcionan igual que en la librera original graphics.h y pueden encontrarse en la ayuda del Turbo C++ de Borland o e cualquier manual de este mismo.
Programacin bsica
pgina 5
Ejemplos en DEV-C++
1. Dibuja una lnea desde 0,0 hasta 400,400.
Programacin bsica
pgina 6
Programacin bsica
pgina 7
Programacin bsica
pgina 8
Programacin bsica
pgina 9
Unidad 8 Puertos
El puerto paralelo de la PC
Los puertos de comunicacin de la PC son de particular inters para el estudio de la electrnica ya que le permiten utilizar una computadora personal para controlar todo tipo circuitos electrnicos utilizados, principalmente, en actividades de automatizacin de procesos, adquisicin de datos, tareas repetitivas y otras actividades que demandan precisin. ste artculo es el primero de una serie que analizar diversos usos para el puerto paralelo de la PC.
Conceptos bsicos
Existen dos mtodos bsicos para transmisin de datos en las computadoras modernas. En un esquema de transmisin de datos en serie un dispositivo enva datos a otro a razn de un bit a la vez a travs de un cable. Por otro lado, en un esquema de transmisin de datos en paralelo un dispositivo enva datos a otro a una tasa de n nmero de bits a travs de n nmero de cables a un tiempo. Sera fcil pensar que un sistema en paralelo es n veces ms rpido que un sistema en serie, sin embargo esto no se cumple, bsicamente el impedimento principal es el tipo de cable que se utiliza para interconectar los equipos. Si bien un sistema de comunicacin en paralelo puede utilizar cualquier nmero de cables para transmitir datos, la mayora de los sistemas paralelos utilizan ocho lneas de datos para transmitir un byte a la vez, como en todo, existen excepciones, por ejemplo el estndar SCSI permite transferencia de datos en esquemas que van desde los ocho bits y hasta los treinta y dos bits en paralelo. En ste artculo nos concentraremos en transferencias de ocho bits ya que sta es la configuracin del puerto paralelo.
Un tpico sistema de comunicacin en paralelo puede ser de una direccin ( unidireccional) o de dos direcciones (bidireccional). El ms simple mecanismo utilizado en un puerto paralelo de una PC es de tipo unidireccional y es el que analizaremos en primer lugar. Distinguimos dos elementos: la parte transmisora y la parte receptora. La parte transmisora coloca la informacin en las lneas de datos e informa a la parte receptora que la informacin (los datos) estn disponibles; entonces la parte receptora lee la informacin en las lneas de datos e informa a la parte transmisora que ha tomado la informacin (los datos). Observe que ambas partes sincronizan su respectivo acceso a las lneas de datos, la parte receptora no leer las lneas de datos hasta que la parte transmisora se lo indique en tanto que la parte transmisora no colocar nueva informacin en las lneas de datos hasta que la parte receptora remueva la informacin y le indique a la parte transmisora que ya ha
Programacin bsica pgina 10
tomado los datos, a sta coordinacin de operaciones se le llama acuerdo entendimiento. En estos mbitos tecnolgicos es recomendable utilizar ciertas palabras en ingls que nos permiten irnicamente un mejor entendimiento de los conceptos tratados. Repito: a la coordinacin de operaciones entre la parte transmisora y la parte receptora se le llama handshaking, que en espaol es el acto con el cual dos partes manifiestan estar de acuerdo, es decir, se dan un apretn de manos.
El handshaking
Para implementar el handshaking se requieren dos lneas adicionales. La lnea de estroboscopio (en ingls strobe) es la que utiliza la parte transmisora para indicarle a la parte receptora la disponibilidad de informacin. La lnea de admisin (acknowledge) es la que utiliza la parte receptora para indicarle a la parte transmisora que ha tomado la informacin (los datos) y que est lista para recibir ms datos. El puerto paralelo provee de una tercera lnea de handshaking llamada en ingls busy (ocupado), sta la puede utilizar la parte receptora para indicarle a la parte transmisora que est ocupada y por lo tanto la parte transmisora no debe intentar colocar nueva informacin en las lneas de datos. Una tpica sesin de transmisin de datos se parece a lo siguiente:
Parte transmisora:
La parte transmisora checa la lnea busy para ver si la parte receptora est ocupada. Si la lnea busy est activa, la parte transmisora espera en un bucle hasta que la lnea busy est inactiva. La parte transmisora coloca la informacin en las lneas de datos. La parte transmisora activa la lnea de strobe. La parte transmisora espera en un bucle hasta que la lnea acknowledge est activa. La parte transmisora inactiva la lnea de strobe. La parte transmisora espera en un bucle hasta que la lnea acknowledge est inactiva. La parte transmisora repite los pasos anteriores por cada byte a ser transmitido.
Programacin bsica
pgina 11
Parte receptora:
La parte receptora inactiva la lnea busy (asumiendo que est lista para recibir informacin). La parte receptora espera en un bucle hasta que la lnea strobe est activa. La parte receptora lee la informacin de las lneas de datos (y si es necesario, procesa los datos). La parte receptora activa la lnea acknowledge. La parte receptora espera en un bucle hasta que est inactiva la lnea de strobe. La parte receptora inactiva la lnea acknowledge. La parte receptora repite los pasos anteriores por cada byte que debe recibir.
Se debe ser muy cuidadoso al seguir stos pasos, tanto la parte transmisora como la receptora coordinan sus acciones de tal manera que la parte transmisora no intentar colocar varios bytes en las lneas de datos, en tanto que la parte receptora no debe leer ms datos que los que le enve la parte transmisora, un byte a la vez.
El segundo conector se llama 1284 tipo B que es un conector de 36 patitas de tipo centronics y lo encontramos en la mayora de las impresoras; el tercero se denomina 1284 tipo C, se trata de un conector similar al 1284 tipo B pero ms pequeo, adems se dice que tiene mejores propiedades elctricas y mecnicas, ste conector es el recomendado para nuevos diseos. La siguiente tabla describe la funcin de cada patita del conector 1284 tipo A:
Programacin bsica
pgina 12
Patita 1 2~9 10
Polaridad activa 0 0
Descripcin Strobe Lneas de datos (bit 0/patita 2, bit 7/patita 9) Lnea acknowledge (activa cuando el sistema remoto toma datos) Lnea busy (si est activa, el sistema remoto no acepta datos) Lnea Falta de papel (si est activa, falta papel en la impresora) Lnea Select (si est activa, la impresora se ha seleccionado) Lnea Autofeed (si est activa, la impresora inserta una nueva lnea por cada retorno de carro) Lnea Error (si est activa, hay un error en la impresora) Lnea Init (Si se mantiene activa por al menos 50 micro-segundos, sta seal autoinicializa la impresora)
pgina 13
11
Entrada
12
Entrada
13
Entrada
14
Salida
15
Entrada
16
Salida
Programacin bsica
17 18 ~ 25
Salida -
0 -
Lnea Select input (Cuando est inactiva, obliga a la impresora a salir de lnea) Tierra elctrica
Funcin Direccin base para LPT1 Direccin base para LPT2 Direccin base para LPT3 Direccin base para LPT4
Programacin bsica
pgina 14
Programacin bsica
pgina 15
Por cada lnea de entrada que tomamos directamente del puerto paralelo existe una etapa amplificadora-separadora dentro del circuito integrado 74LS244 que nos permite trabajar con una tasa de entrega de corriente suficiente para desplegar en los diodos emisores de luz la informacin escrita en las lneas de datos del puerto. Adems es posible habilitar deshabilitar el despliegue del nibble de orden inferior superior del byte escrito en el puerto. Colocando en un nivel lgico alto la patita 1 del CI 74LS244 inhabilitamos el despliegue del nibble de orden bajo, un nivel lgico alto en la patita 19 evita el despliegue del nibble de orden alto. Para comodidad, conecto las patitas 1 y 19 permanentemente a tierra de tal manera que sea posible visualizar la actividad en los diodos emisores de luz (LED). En el diagrama se especifican con nmeros las correspondientes patitas del conector DB-25. Obviamente se requiere de una fuente regulada de 5 Voltios para operar ste circuito, adems los siguientes materiales:
1. Circuito Integrado TTL 74LS244. 8. Diodos Emisores de Luz. 8. Resistencias de 220 Ohms, 1/2 Watt. 1. Cable y conector para el puerto paralelo.
Naturalmente lo ms recomendable es probar el correcto funcionamiento del circuito antes de conectarlo al puerto paralelo de la PC. Ensamble el circuito, preferentemente en un circuito impreso, y conctelo a una fuente regulada de 5 Voltios, conecte temporalmente un extremo de una resistencia de 10,000 Ohms a una lnea de entrada, el resto de las lneas de entrada conctelas a tierra. El otro extremo de la resistencia conctelo directamente al borne positivo de la fuente de alimentacin para inducir una seal TTL alta, el respectivo LED debe encender. Con un trozo de alambre conectado a Tierra, toque temporalmente el extremo de la resistencia que est conectado a la lnea de entrada para inducir una seal TTL de lgica baja, el LED se debe apagar. Repita sta operacin para cada una de las ocho lneas de entrada. Una vez que ha verificado el correcto funcionamiento del circuito est listo para conectarlo al puerto paralelo de la PC. En primer lugar apague la computadora y el circuito. Conecte el cable al puerto paralelo asegurndose que el conector est firme en su sitio. Encienda el circuito y por ltimo encienda la computadora, por regla general, el circuito de restablecimiento de la computadora coloca inicialmente en las lneas de datos del puerto paralelo un valor igual a 0x0h, por lo tanto todos los diodos deben estar apagados una vez que la computadora ha terminado su proceso de arranque, sin embargo, si algn diodo permanece encendido esto no indica una condicin de falla, es responsabilidad del software que Usted escriba para controlar el puerto inicializarlo con un valor adecuado antes de realizar cualquier otra operacin.
Programacin bsica
pgina 16
printf ("Introduce el byte que se enviara al puerto: "); scanf("%u", &byte); getchar(); outportb (0x378, byte); /* enva un byte a las lneas de datos */ printf ("Polariza las lineas de estado y pulsa una tecla\n"); getchar(); byte = inportb (0x378+1); /* lee un byte de las lneas de estado */ printf ("El valor leido es %i", byte); return 0; }
Programacin bsica
pgina 17
2.
Ejemplo Disear una aplicacin: Desde el punto de vista del hardware existen un grupo de leds que se cuelgan del puerto 0x378 (Dato 0-7). El programa debe realizar 4 efectos: Recorrer los leds desde el menos significativo hasta el ms significativo Recorrer los leds desde el ms significativo al menos significativo Recorrer los leds desde los extremos hacia el centro Recorrer los leds desde el centro hacia los extremos
int main() { char cCar; int i; clrscr(); outp(PORT,0); printf("\n Seleccione una accion:"); printf("\n --------------------------------"); printf("\n 1. Secuencia a la derecha:"); printf("\n 2. Secuencia a la izquierda:"); printf("\n 3. Secuencia hacia el centro:"); printf("\n 4. Secuencia hacia afuera:"); printf("\n---------------------------------"); printf("\n Presione ESC para terminar");
Programacin bsica
pgina 18
for(i=0;i<5;i++) switch(cCar) { case '1'://Derecha outp(PORT,0x01);delay(250); //0000 0001 outp(PORT,0x02);delay(250); //0000 0010 outp(PORT,0x04);delay(250); //0000 0100 outp(PORT,0x08);delay(250); //0000 1000 outp(PORT,0x10);delay(250); //0001 0000 outp(PORT,0x20);delay(250); //0010 0000 outp(PORT,0x40);delay(250); //0100 0000 outp(PORT,0x80);delay(250); //1000 0000 break;
case '2'://Izquierda outp(PORT,0x80);delay(250); //1000 0000 outp(PORT,0x40);delay(250); //0100 0000 outp(PORT,0x20);delay(250); //0010 0000 outp(PORT,0x10);delay(250); //0001 0000 outp(PORT,0x08);delay(250); //0000 1000 outp(PORT,0x04);delay(250); //0000 0100 outp(PORT,0x02);delay(250); //0000 0010 outp(PORT,0x01);delay(250); //0000 0001 break; case '3'://Al centro outp(PORT,0x81);delay(250); //1000 0001
Programacin bsica
pgina 19
outp(PORT,0x42);delay(250); //0100 0010 outp(PORT,0x24);delay(250); //0010 0100 outp(PORT,0x18);delay(250); //0001 1000 break;
case '4'://Afuera outp(PORT,0x18);delay(250); //0001 1000 outp(PORT,0x24);delay(250); //0010 0100 outp(PORT,0x42);delay(250); //0100 0010 outp(PORT,0x81);delay(250); //1000 0001 break; } outp(PORT,0);delay(250); } return 0; }
Programacin bsica
pgina 20
3. Hacer un programa que desplegu su nombre en un display de 7 segmentos. //JUAN_GARCIA_PEDRO_OCTAVIO //PRORAMACION DEL NOMBRE DESPLEGADO EN UN DISPLAY
#include #include #include #include #include <stdio.h> <conio.h> <dos.h> <iostream.h> <time.h>
int main() { textcolor(12); textbackground(0); clrscr(); outportb (0x378,0); cout << "J"; outportb (0x378,14); sleep(2);// Retraso de 1 segundos cout << "U"; outportb (0x378,62); sleep(2); cout << "A"; outportb (0x378,119); sleep(2); cout << "N"; outportb (0x378,55); sleep(2); cout << "_"; outportb (0x378,8); sleep(2); cout << "G"; outportb (0x378,125); sleep(2); cout << "A"; outportb (0x378,119); sleep(2); cout << "R"; outportb (0x378,80); sleep(2); cout << "C"; outportb (0x378,57); sleep(2); Programacin bsica pgina 21
cout << "I"; outportb (0x378,48); sleep(2); cout << "A"; outportb (0x378,119); sleep(2); cout << "_"; outportb (0x378,8); sleep(2); cout << "P"; outportb (0x378,115); sleep(2); cout << "E"; outportb (0x378,121); sleep(2); cout << "D"; outportb (0x378,63); sleep(2); cout << "R"; outportb (0x378,80); sleep(2); cout << "O"; outportb (0x378,92); sleep(2); cout << "_"; outportb (0x378,8); sleep(2); cout << "O"; outportb (0x378,92); sleep(2); cout << "C"; outportb (0x378,57); sleep(2); cout << "T"; outportb (0x378,49); sleep(2); cout << "A"; outportb (0x378,119); sleep(2); cout << "V"; outportb (0x378,28); sleep(2); cout << "I"; outportb (0x378,48); sleep(2); cout << "O"; outportb (0x378,92); Programacin bsica pgina 22
Programacin bsica
pgina 23
cout << "\t"; cout << "Amarillo"; outportb (0x378,10); cout << "\n\n"; cout << "\t"; cout << "Rojo"; sleep (2); clrscr (); a; b; c; textcolor(4); cout << "\n\n"; cout << "\t"; cout << ""; outportb (0x378,8); cout << "\n\n"; cout << "\t"; cout << "Rojo"; sleep (2); clrscr (); a; b; c; textcolor(14); cout << "\n\n"; cout << "\t"; cout << "Amarillo"; outportb (0x378,10); cout << "\n\n"; cout << "\t"; cout << "Rojo"; sleep (2); clrscr (); a; b; c; textcolor(2); cout << "\n\n"; cout << "\t"; cout << ""; outportb (0x378,8); cout << "\n\n"; cout << "\t"; cout << "Rojo"; sleep (2); clrscr (); a; b; c; textcolor(4); Programacin bsica pgina 25
cout << "\n\n"; cout << "\t"; cout << "Amarillo"; outportb (0x378,10); cout << "\n\n"; cout << "\t"; cout << "Rojo"; sleep (2); clrscr (); a; b; c; textcolor(14); cout << "\n\n"; cout << "\t"; cout << "Rojo"; outportb (0x378,33); cout << "\n\n"; cout << "\t"; cout << "Verde"; sleep (10); clrscr (); a; b; c; textcolor(2); cout << "\n\n"; cout << "\t"; cout << "Rojo"; outportb (0x378,17); cout << "\n\n"; cout << "\t"; cout << "Amarillo"; sleep (2); clrscr (); a; b; c; textcolor(4); cout << "\n\n"; cout << "\t"; cout << "Rojo"; outportb (0x378,1); cout << "\n\n"; cout << "\t"; cout <<""; sleep (2); clrscr(); a; b; c; Programacin bsica pgina 26
textcolor(14); cout << "\n\n"; cout << "\t"; cout << "Rojo"; outportb (0x378,17); cout << "\n\n"; cout << "\t"; cout << "Amarillo"; sleep (2); clrscr (); a; b; c; textcolor(2); cout << "\n\n"; cout << "\t"; cout << "Rojo"; outportb (0x378,1); cout << "\n\n"; cout << "\t"; cout << ""; sleep (2); clrscr (); a; b; c; textcolor(4); cout << "\n\n"; cout << "\t"; cout << "Rojo"; outportb (0x378,17); cout << "\n\n"; cout << "\t"; cout << "Amarillo"; sleep (2); outportb (0x378,0); clrscr(); cout << " getch (); return 0; } Precione cualquier teclapara salir...";
Programacin bsica
pgina 27
Programacin bsica
pgina 28
5. Hacer un programa que controle un motor de corriente directa por puerto paralelo.
//JUAN GARCIA PEDRO OCTAVIO //Control de motor CD. #include <conio.h> #include <stdio.h> #include <dos.h> void main() { int seleccion,repetir=1; while (repetir==1) { textcolor(4); clrscr(); printf(" 1. printf(" 2. printf(" 3. printf(" 4. Sentido de giro a la derecha\n\n"); Sentido de giro la izquierda\n\n"); Paro\n\n"); Salir\n\n");
printf("\n\n"); seleccion=getche (); switch (seleccion) { case '1': printf(". Girando outport(0x378,2);getch();break; case '2': printf(". Girando outport(0x378,4);getch();break; hacia la derecha\n\n");
hacia
la
izquierda\n\n");
Programacin bsica
Programacin bsica
pgina 30
Programacin bsica
pgina 31
Referencias bibliogrficas: Digital: 1. http://www.latindevelopers.com/forum/introduccion-agraphics-h-t303.html 2. http://www.latindevelopers.com/forum/introduccion-agraphics-h-t303.html 3. http://usuarios.multimania.es/charlytospage/dev.htm 4. http://www.modelo.edu.mx/univ/virtech/circuito/paralelo.htm 5. http://cfievalladolid2.net/tecno/cyr_01/control/practicas/p_0.ht m 6. http://alos.5u.com/c/modulo10.html 7. http://www.mcbtec.com/puerto_paralelo_pc.htm 8. http://www.youtube.com/watch?v=OUKDLlpBb5o&feature=r elated 9. http://www.youtube.com/watch?v=Su2u4S6HW2c 10. http://www.youtube.com/watch?v=dmST4Tq1sKs&featu re=related
Programacin bsica
pgina 32