Académique Documents
Professionnel Documents
Culture Documents
CODIGO
APELLIDOS Y NOMBRES
NOTA
0620761 0811011
HORARIO
PC
FECHA
OBSERVACIONES
Mayo 2013
TEMPORIZADOR (TIMER)
Revisin de conceptos tericos
/********************************************************************** PROGRAMA QUE PRESENTA UN RELOJ DE TIEMPO REAL QUE SE VISUALIZA EN LA ESQUINA SUPERIOR IZQUIERDA DE LA PANTALLA. SE UTILIZA EL TIMER 8254 COMO BASE DE TIEMPO. **********************************************************************/ #include <windows.h> #include <stdio.h> #include <conio.h> #include "winio.h" int main( void ) { unsigned char nibble; int h, m, s, pin_out; int cuenta, veinteava=0; bool bResult; // Call InitializeWinIo to initialize the WinIo library. bResult = InitializeWinIo(); if( ! bResult) { printf("Error during initialization of WinIo.\n"); return 1; } printf( "Hora, minutos y segundos actuales?" ); scanf( "%d%d%d", &h, &m, &s); /* Programacion del timer */ cuenta = 59659; _outp( 0x43, 0XB6 ); nibble = cuenta; _outp( 0x42, nibble ); nibble = cuenta >> 8; _outp( 0x42, nibble ); nibble = _inp( 0x61 ) | 0x01; _outp( 0x61, nibble ); /* Fin programacin del timer */ do { do { _outp( 0x43, 0xE8 ); pin_out = _inp( 0x42 ) >> 7; } while( pin_out == 0 ); do { _outp( 0x43,0xE8); pin_out = _inp( 0x42 ) >> 7; } while( pin_out == 1 ); veinteava++; /*Cuenta para 20 Hz*/ /*Envo de la palabra de control*/ /*Envo de la parte baja de la cuenta*/ /*Envo de la parte alta de la cuenta*/ /*Se habilita slo el gate del contador 2*/
veinteava s == 60 ) m == 60 ) h == 24 )
== 20 { s = { m = { h =
printf( "\r%02d:%02d:%02d", h, m, s ); } while( !kbhit() ); nibble = _inp( 0x61 ) & 0xFE; _outp( 0x61, nibble ); /*Se deshabilita el gate del contador 2*/
PRACTICA Escribir un programa que implemente un pequeo piano con las teclas A, S, D, F, G, H, J, K para emitir una escala completa (de DO a DO). Cada nota se emitir por un intervalo de 0.5 segundo luego de lo cual se dejar de emitir dicha nota. Si se presiona una segunda tecla antes que termine de emitirse el sonido de la anterior, se emitir inmediatamente la nueva nota durante el tiempo que le corresponde (cancelando la anterior).
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX #include <windows.h> #include <stdio.h> #include <conio.h> #include "winio.h" //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void ConfigT0( int Frec ); void ConfigT2( int Frec ); void PasoUnPeriodo( void ); void ActivaT2( void ); void DesactivaT2( void ); void ActivaOndaT2aParlante( void ); void DesactivaOndaT2aParlante( void ); //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX int main( void ) { /* DO, RE, MI, FA, SOL, LA, SI, DO */ char Tecla[] = {'A','S','D','F','G','H','J','K'}; int Frec[] = {262,294,330,349,392,440,494,523}; int i; char c; int Cont = 0; bool bResult; // Call InitializeWinIo to initialize the WinIo library. bResult = InitializeWinIo(); if( ! bResult) { printf("Error during initialization of WinIo.\n"); return 1; } ConfigT0( 41 ); /*41 Hz*/
DesactivaOndaT2aParlante(); /*Parlante no emite ningn tono*/ ActivaT2(); /*T2 listo para trabajar*/ while(1) { if( kbhit() ) { c = getch(); if( c == 27 ) { break; */ } for( i = 0; i < 8; i++ ) tecla de { if( c == Tecla[i] ) break; } if( i != 8 ) { ConfigT2( Frec[i] ); /* Configurar tono segn tecla presionada..*/ ActivaOndaT2aParlante();/*... activar parlante... */ Cont = 41; /*... 41 pulsos = 1 segundo */ } } if( Cont != 0 ) { PasoUnPeriodo(); Cont--; if( Cont == 0 ) /*... y si se ha completado la cuenta... */ DesactivaOndaT2aParlante(); /*... apagar el parlante */ } } DesactivaOndaT2aParlante(); DesactivaT2(); // When you're done using WinIo, call ShutdownWinIo ShutdownWinIo(); return 0; } //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void ConfigT0( int Frec ) { unsigned char byte; int frec; _outp(0X43, 0X36); frec = (1193182/Frec); byte = frec; /* Comprobar si se presion alguna piano */
/* Establecer si el usuario us el teclado... */ /*... slo en ese caso, se captura tecla. */ /* Verificar si se presion [ESC]... */ /*... en cuyo caso se sale del lazo prinicpal.
_outp(0X40, byte); byte = frec>>8; _outp(0X40, byte); } //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void ConfigT2( int Frec ) { unsigned char byte; int frec; _outp(0X43, 0XB6); frec = (1193182/Frec); byte = frec; _outp(0X42, byte); byte = frec>>8; _outp(0X42, byte); byte = _inp(0X61)|0X01; _outp(0X61, byte);
} //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void PasoUnPeriodo( void ) { int pin_out; do { _outp(0x43,0xE2); pin_out= _inp(0x40) >> 7; } while(pin_out == 0); do { _outp(0x43,0xE2); pin_out= _inp(0x40) >> 7; } while(pin_out == 1); } //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void ActivaT2 ( void ) { unsigned char byte; byte = _inp(0X61)|0X01; _outp(0X61, byte);
} //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void DesactivaT2 ( void ) { unsigned char byte; byte = _inp(0X61)&0XFE; _outp(0X61, byte);
} //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void ActivaOndaT2aParlante( void ) { unsigned char byte; byte = _inp(0X61)|0X02; _outp(0X61, byte);
} //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void DesactivaOndaT2aParlante( void ) { unsigned char byte; byte = _inp(0X61)&0XFD; _outp(0X61, byte); } //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX