X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/blobdiff_plain/8f48e4df85125bfd22f8c93b5952deccc9f6af72..db76f3270c5bee0eb1b5ee71fa1946e8d5132d43:/src/leds.h?ds=sidebyside diff --git a/src/leds.h b/src/leds.h index ea8c083..c69a956 100644 --- a/src/leds.h +++ b/src/leds.h @@ -1,33 +1,56 @@ -// vim: set et sw=4 sts=4 : +/* vim: set et sw=4 sts=4 : */ #ifndef _LEDS_H_ #define _LEDS_H_ -#include "types.h" - -#ifdef SDCC -static xdata at 0x0080 byte leds0; -static xdata at 0x00c0 byte leds1; -#else -static byte xdata leds0 _at_ 0x0080; -static byte xdata leds1 _at_ 0x00c0; -#endif - -#define leds(word) \ - do \ - { \ - uint16 w = word; \ - leds0 = ~LOW(w); \ - leds1 = ~HIGH(w); \ - } \ - while (0) - -#define ledsb(bh, bl) \ - do \ - { \ - leds0 = ~(bl); \ - leds1 = ~(bh); \ - } \ - while (0) - -#endif // _LEDS_H_ +/** Cantidad mínima de columnas (es más un límite estético que físico) */ +#define LEDS_MIN_COLS 8 + +/** Cantidad máxima de columnas */ +#define LEDS_MAX_COLS 32 + +/** Tamaño de la matriz de leds, en cantidad de columnas */ +extern unsigned char leds_matrix_len; + +/** Matriz de leds, cada elemento del array es una columna */ +extern idata unsigned int leds_matrix[LEDS_MAX_COLS]; + +/** Retardo de refresco de la matriz (en múltiplos de 0.1ms) */ +extern unsigned char leds_delay; + +/** Inicializa leds + * + * El 'dibujado' de la matriz se puede controlar fácilmente parando y/o + * iniciando el timer2. Para comenzar a 'dibujar' la matriz sólo es necesario + * setear el bit TR2 del registro T2CON (y habilitar las interrupciones + * globalmente si aún no se hizo, bit EA del registro IE). + */ +void leds_init(); + +/** Realiza un testeo simple de los leds */ +void leds_test(); + +/** Escribe un word (16 bits) en la columna de leds */ +void leds_write(unsigned int); + +/** Escribe un byte en la parte baja de la columna de leds */ +void leds_write_low(unsigned char); + +/** Escribe un byte en la parte alta de la columna de leds */ +void leds_write_high(unsigned char); + +/** Actualiza el delay al recomendado según el tamaño de la matriz */ +void leds_delay_update(); + +/** Bloquea timer de leds cuando se accede a una zona crítica (P0 y/o P2). */ +void leds_lock(); + +/** Desbloquea el timer de los leds. + * @precond Se llamó a leds_lock(); + */ +void leds_unlock(); + +/** Atiende interrupción del timer2 para 'dibujar' la matriz */ +void leds_timer2_isr() interrupt 5; + +#endif /* _LEDS_H_ */