/*------------------------------------------------------------------- ** ** Soluciones del examen de Programación de Sistemas y Dispositivos ** Curso 2019-20, Primera Convocatoria, 15 de enero de 2020 ** **-----------------------------------------------------------------*/ /*------------------------------------------------------------------- ** Ejercicio 1 **-----------------------------------------------------------------*/ #include #include #include #include #include void uart0_isrRX( void ) __attribute__ ((interrupt ("IRQ"))); volatile boolean flag; volatile char ch; void main( void ) { sys_init(); uart0_init(); UFCON0 &= ~1; // Desactiva las FIFOs flag = FALSE; pISR_URXD0 = (uint32) uart0_isrRX; I_ISPC = BIT_URXD0; INTMSK &= ~( BIT_GLOBAL | BIT_URXD0 ); while( 1 ) if( flag ) { while( !(UTRSTAT0 & (1 << 1)) ); UTXH0 = ch; flag = FALSE; } } void uart0_isrRX( void ) { ch = URXH0; flag = TRUE; I_ISPC = BIT_URXD0; } /*------------------------------------------------------------------- ** Ejercicio 2 **-----------------------------------------------------------------*/ #include #include #include #include void isr_timer0( void ) __attribute__ ((interrupt ("IRQ"))); void left_led_blink( uint8 Hz ) { if( Hz ) timer0_open_tick( isr_timer0, 2*Hz ); else timer0_close(); } void isr_timer0( void ) { led_toggle( LEFT_LED ); I_ISPC = BIT_TIMER0; } /*------------------------------------------------------------------- ** Ejercicio 3 **-----------------------------------------------------------------*/ #include #include #include #include uint8 keypad_keycount( void ) { uint8 aux; uint8 count = 0; /* lee fila 1 */ aux = *( KEYPAD_ADDR + 0x1c ); // mascara de scan: 0b00011100 if( (aux & 0x0f) != 0x0f ) // ¿hay pulsación en fila 1? { if( (aux & 0x8) == 0 ) // ¿hay pulsación en columna 1? count++; if( (aux & 0x4) == 0 ) // ¿hay pulsación en columna 2? count++; if( (aux & 0x2) == 0 ) // ¿hay pulsación en columna 3? count++; if( (aux & 0x1) == 0 ) // ¿hay pulsación en columna 4? count++; } /* lee fila 2 */ aux = *( KEYPAD_ADDR + 0x1a ); // mascara de scan: 0b00011010 if( (aux & 0x0f) != 0x0f ) // ¿hay pulsación en fila 2? { if( (aux & 0x8) == 0 ) // ¿hay pulsación en columna 1? count++; if( (aux & 0x4) == 0 ) // ¿hay pulsación en columna 2? count++; if( (aux & 0x2) == 0 ) // ¿hay pulsación en columna 3? count++; if( (aux & 0x1) == 0 ) // ¿hay pulsación en columna 4? count++; } /* lee fila 3 */ aux = *( KEYPAD_ADDR + 0x16 ); // mascara de scan: 0b00010110 if( (aux & 0x0f) != 0x0f ) // ¿hay pulsación en fila 3? { if( (aux & 0x8) == 0 ) // ¿hay pulsación en columna 1? count++; if( (aux & 0x4) == 0 ) // ¿hay pulsación en columna 2? count++; if( (aux & 0x2) == 0 ) // ¿hay pulsación en columna 3? count++; if( (aux & 0x1) == 0 ) // ¿hay pulsación en columna 4? count++; } /* lee fila 4 */ aux = *( KEYPAD_ADDR + 0xe ); // mascara de scan: 0b00001110 if( (aux & 0x0f) != 0x0f ) // ¿hay pulsación en fila 4? { if( (aux & 0x8) == 0 ) // ¿hay pulsación en columna 1? count++; if( (aux & 0x4) == 0 ) // ¿hay pulsación en columna 2? count++; if( (aux & 0x2) == 0 ) // ¿hay pulsación en columna 3? count++; if( (aux & 0x1) == 0 ) // ¿hay pulsación en columna 4? count++; } return count; } /*------------------------------------------------------------------- ** Ejercicio 4 **-----------------------------------------------------------------*/ #include #include void lcd_fill_box( uint16 xleft, uint16 yup, uint16 xright, uint16 ydown, uint8 color ) { uint16 yAux; for( yAux=yup; yAux<=ydown; yAux++ ) lcd_draw_hline( xleft, xright, yAux, color, 1 ); }