pic Jul. 2016 | Page 62

BSF leds,pulsada pausa END DECFSZ cont1 GOTO pausa DECFSZ cont2 GOTO pausa DECFSZ cont3 GOTO pausa GOTO borrar ; y activa el indicador de tecla pulsada ; Bucle anidado de 3 niveles ; que retarda aprox. 0.5 segundos 5.3.4 Tablas y subrutinas El uso de rutinas, siendo sencillo y no requiriendo un apartado específico, es esencial, puesto que simplifica los programas, haciéndolos, además, más modulares. Llamaremos a una subrutina con la orden CALL, seguida de la etiqueta que la encabeza o su dirección en memoria. Para regresar a la siguiente instrucción tras el CALL bastará con situar, en la última línea de la subrutina, el comando RETURN; también será posible emplear RETLW k, el cuál se diferencia del anterior por situar en el registro W el valor k. En los procesadores de gama media y alta existe una manera específica de regresar en caso de interrupción: RETFIE. Las interrupciones generan un salto a la dirección 0x04 que es tratado como una subrutina para permitir la continuación normal del programa a partir del punto en que se llevó a cabo la interrupción. Este regreso se lleva a cabo mediante RETFIE, que, además de restaurar el contador de programa (PC) habilita de nuevo las interrupciones (ya que estas son deshabilitadas mientras se está atendiendo una). La pila de la gama media permite guardar hasta 8 saltos, es decir, admite un máximo de 8 saltos a subrutina anidados. Recuerde este dato para no excederse en las llamadas a las mismas ni en los niveles de un método tipo “Divide y Vencerás”. Recuerde también siempre un posible salto por interrupción, para no pasar de 7 si ésta está habilitada. En la gama baja sólo contará con dos niveles en la pila. Una tabla, en cambio, es una lista ROM de constantes en la memoria de programa, y que pueden ser d esde notas musicales a caracteres ASCII. Son especialmente útiles para la conversión de unos códigos a otros, como, por ejemplo, para pasar un hexagesimal a un display. Para generarlas se aprovecha la cualidad de RETLW para situar un dato en el registro W. 60