]> git.llucax.com Git - z.facultad/66.09/etherled.git/blobdiff - src/leds.h
Emprolija un poco el retarno, no necesita más usar el multiplicador.
[z.facultad/66.09/etherled.git] / src / leds.h
index ea8c0837135f176e7bb955cff7046876be007e8e..45c640ed9f4d9fe120d1deed42ad06c25ffe432d 100644 (file)
@@ -1,33 +1,67 @@
-// vim: set et sw=4 sts=4 :    
+/* vim: set et sw=4 sts=4 : */
 
 #ifndef _LEDS_H_
 #define _LEDS_H_
 
 
 #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_ */