-// 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á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 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();
+
+/** Atiende interrupción del timer2 para 'dibujar' la matriz */
+void leds_timer2_isr() interrupt 5;
+
+#endif /* _LEDS_H_ */