-// 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_
+#include "reg51.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];
+
+/** Setea retardo de refresco de la matriz */
+#define leds_delay_set(delay) (RCAP2H = ((unsigned char) -delay))
+/* usamos directamente el rcap2h negado (complementado) */
+
+/** Obtiene retardo de refresco de la matriz */
+#define leds_delay_get() ((unsigned char) -RCAP2H)
+/* usamos directamente el rcap2h negado (complementado) */
+
+/** Tamaño del retardo de refresco de la matriz */
+#define LEDS_DELAY_SIZE sizeof(RCAP2H)
+/* usamos directamente el rcap2h */
+
+/** 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_ */