/*------------------------------------------------------------------- ** ** Soluciones del examen de Programación de Sistemas y Dispositivos ** Curso 2017-18, Segunda Convocatoria, 6 de julio de 2018 ** **-----------------------------------------------------------------*/ /*------------------------------------------------------------------- ** Ejercicio 1 **-----------------------------------------------------------------*/ #include #include #include #include #include #include void timer0_isr( void ) __attribute__ ((interrupt ("IRQ"))); volatile boolean flag; volatile char ch; void main( void ) { sys_init(); uart0_init(); timers_init(); keypad_init(); flag = FALSE; timer0_open_ms( timer0_isr, 20, TIMER_INTERVAL ); while( 1 ) { ch = keypad_getchar(); ch += ( ch < 10 ? '0' : 'a'-10 ); flag = TRUE; } } void timer0_isr( void ) { if( flag && !(UFSTAT0 & (1 << 9)) ) { UTXH0 = ch; flag = FALSE; } I_ISPC = BIT_TIMER0; } /*------------------------------------------------------------------- ** Ejercicio 2 **-----------------------------------------------------------------*/ #include #include fix16 fix_add( fix16 a, uint8 an, fix16 b, uint8 bn ) { uint8 rm; fix32 a32, b32, r32; if( an >= bn ) { rm = an; a32 = a; b32 = b << (an-bn); } else { rm = bn; a32 = a << (bn-an); b32 = b; } r32 = a32 + b32; if( r32 > MAX_INT16 ) return MAX_INT16; else if ( r32 < MIN_INT16 ) return MIN_INT16; else return r32; } /*------------------------------------------------------------------- ** Ejercicio 3 **-----------------------------------------------------------------*/ #include #include #include inline void iis_putSampleMono( int16 sample ) { while( ((IISFCON & 0xF0) >> 4) > 6 ); IISFIF = sample; IISFIF = sample; } inline int16 iis_getSampleMono( void ) { int16 trash; while( (IISFCON & 0x0F) < 2 ); trash = IISFIF; return IISFIF; } /* inline void iis_putSampleMono( int16 sample ) { iis_putSample( sample, sample ); } inline int16 iis_getSampleMono( void ) { int16 trash, sample; iis_getSample( &trash, &sample ); return sample; } */ /*------------------------------------------------------------------- ** Ejercicio 4 **-----------------------------------------------------------------*/ #include #include extern uint8 font[]; void lcd_putchar_transparent( uint16 x, uint16 y, uint8 color, char ch ) { uint8 row, col; uint8 *bitmap; bitmap = font + ch*16; for( row=0; row<16; row++ ) for( col=0; col<8; col++ ) if( bitmap[row] & (0x80 >> col) ) lcd_putpixel( x+col, y+row, color ); }