altos: Allow LCD segments to not be multiplexed across digits
authorKeith Packard <keithp@keithp.com>
Mon, 29 Apr 2013 06:08:03 +0000 (23:08 -0700)
committerKeith Packard <keithp@keithp.com>
Wed, 8 May 2013 03:07:52 +0000 (20:07 -0700)
This allows each LCD segment to be individually configured as to which
COM and which SEG drives it, permitting maximum flexibility in wiring.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/drivers/ao_seven_segment.c
src/stm/ao_lcd_stm.c

index b3b5f87827ad4370062b6ad3dc0429e2c6e3cf2d..961fbb8400e95dab27624b2295075f6a5c6b481e 100644 (file)
  *
  */
 
+#ifndef SEVEN_SEGMENT_DEBUG
+#define SEVEN_SEGMENT_DEBUG 0
+#endif
+
 static const uint8_t ao_segments[] = {
-       (1 << AO_SEGMENT_0) |
-       (1 << AO_SEGMENT_1) |
-       (1 << AO_SEGMENT_2) |
-       (0 << AO_SEGMENT_3) |
-       (1 << AO_SEGMENT_4) |
-       (1 << AO_SEGMENT_5) |
-       (1 << AO_SEGMENT_6),            /* 0 */
-
-       (0 << AO_SEGMENT_0) |
-       (0 << AO_SEGMENT_1) |
-       (1 << AO_SEGMENT_2) |
-       (0 << AO_SEGMENT_3) |
-       (0 << AO_SEGMENT_4) |
-       (1 << AO_SEGMENT_5) |
-       (0 << AO_SEGMENT_6),            /* 1 */
-
-       (1 << AO_SEGMENT_0) |
-       (0 << AO_SEGMENT_1) |
-       (1 << AO_SEGMENT_2) |
-       (1 << AO_SEGMENT_3) |
-       (1 << AO_SEGMENT_4) |
-       (0 << AO_SEGMENT_5) |
-       (1 << AO_SEGMENT_6),            /* 2 */
-
-       (1 << AO_SEGMENT_0) |
-       (0 << AO_SEGMENT_1) |
-       (1 << AO_SEGMENT_2) |
-       (1 << AO_SEGMENT_3) |
-       (0 << AO_SEGMENT_4) |
-       (1 << AO_SEGMENT_5) |
-       (1 << AO_SEGMENT_6),            /* 3 */
-
-       (0 << AO_SEGMENT_0) |
-       (1 << AO_SEGMENT_1) |
-       (1 << AO_SEGMENT_2) |
-       (1 << AO_SEGMENT_3) |
-       (0 << AO_SEGMENT_4) |
-       (1 << AO_SEGMENT_5) |
-       (0 << AO_SEGMENT_6),            /* 4 */
-
-       (1 << AO_SEGMENT_0) |
-       (1 << AO_SEGMENT_1) |
-       (0 << AO_SEGMENT_2) |
-       (1 << AO_SEGMENT_3) |
-       (0 << AO_SEGMENT_4) |
-       (1 << AO_SEGMENT_5) |
-       (1 << AO_SEGMENT_6),            /* 5 */
-
-       (1 << AO_SEGMENT_0) |
-       (1 << AO_SEGMENT_1) |
-       (0 << AO_SEGMENT_2) |
-       (1 << AO_SEGMENT_3) |
-       (1 << AO_SEGMENT_4) |
-       (1 << AO_SEGMENT_5) |
-       (1 << AO_SEGMENT_6),            /* 6 */
-
-       (1 << AO_SEGMENT_0) |
-       (0 << AO_SEGMENT_1) |
-       (1 << AO_SEGMENT_2) |
-       (0 << AO_SEGMENT_3) |
-       (0 << AO_SEGMENT_4) |
-       (1 << AO_SEGMENT_5) |
-       (0 << AO_SEGMENT_6),            /* 7 */
-
-       (1 << AO_SEGMENT_0) |
-       (1 << AO_SEGMENT_1) |
-       (1 << AO_SEGMENT_2) |
-       (1 << AO_SEGMENT_3) |
-       (1 << AO_SEGMENT_4) |
-       (1 << AO_SEGMENT_5) |
-       (1 << AO_SEGMENT_6),            /* 8 */
-
-       (1 << AO_SEGMENT_0) |
-       (1 << AO_SEGMENT_1) |
-       (1 << AO_SEGMENT_2) |
-       (1 << AO_SEGMENT_3) |
-       (0 << AO_SEGMENT_4) |
-       (1 << AO_SEGMENT_5) |
-       (1 << AO_SEGMENT_6),            /* 9 */
-
-       (1 << AO_SEGMENT_0) |
-       (1 << AO_SEGMENT_1) |
-       (1 << AO_SEGMENT_2) |
-       (1 << AO_SEGMENT_3) |
-       (1 << AO_SEGMENT_4) |
-       (1 << AO_SEGMENT_5) |
-       (0 << AO_SEGMENT_6),            /* A */
-
-       (0 << AO_SEGMENT_0) |
-       (1 << AO_SEGMENT_1) |
-       (0 << AO_SEGMENT_2) |
-       (1 << AO_SEGMENT_3) |
-       (1 << AO_SEGMENT_4) |
-       (1 << AO_SEGMENT_5) |
-       (1 << AO_SEGMENT_6),            /* b */
-
-       (1 << AO_SEGMENT_0) |
-       (1 << AO_SEGMENT_1) |
-       (0 << AO_SEGMENT_2) |
-       (0 << AO_SEGMENT_3) |
-       (1 << AO_SEGMENT_4) |
-       (0 << AO_SEGMENT_5) |
-       (1 << AO_SEGMENT_6),            /* c */
-
-       (0 << AO_SEGMENT_0) |
-       (0 << AO_SEGMENT_1) |
-       (1 << AO_SEGMENT_2) |
-       (1 << AO_SEGMENT_3) |
-       (1 << AO_SEGMENT_4) |
-       (1 << AO_SEGMENT_5) |
-       (1 << AO_SEGMENT_6),            /* d */
-
-       (1 << AO_SEGMENT_0) |
-       (1 << AO_SEGMENT_1) |
-       (0 << AO_SEGMENT_2) |
-       (1 << AO_SEGMENT_3) |
-       (1 << AO_SEGMENT_4) |
-       (0 << AO_SEGMENT_5) |
-       (1 << AO_SEGMENT_6),            /* E */
-
-       (1 << AO_SEGMENT_0) |
-       (1 << AO_SEGMENT_1) |
-       (0 << AO_SEGMENT_2) |
-       (1 << AO_SEGMENT_3) |
-       (1 << AO_SEGMENT_4) |
-       (0 << AO_SEGMENT_5) |
-       (0 << AO_SEGMENT_6),            /* F */
+       (1 << 0) |
+       (1 << 1) |
+       (1 << 2) |
+       (0 << 3) |
+       (1 << 4) |
+       (1 << 5) |
+       (1 << 6),               /* 0 */
+
+       (0 << 0) |
+       (0 << 1) |
+       (1 << 2) |
+       (0 << 3) |
+       (0 << 4) |
+       (1 << 5) |
+       (0 << 6),               /* 1 */
+
+       (1 << 0) |
+       (0 << 1) |
+       (1 << 2) |
+       (1 << 3) |
+       (1 << 4) |
+       (0 << 5) |
+       (1 << 6),               /* 2 */
+
+       (1 << 0) |
+       (0 << 1) |
+       (1 << 2) |
+       (1 << 3) |
+       (0 << 4) |
+       (1 << 5) |
+       (1 << 6),               /* 3 */
+
+       (0 << 0) |
+       (1 << 1) |
+       (1 << 2) |
+       (1 << 3) |
+       (0 << 4) |
+       (1 << 5) |
+       (0 << 6),               /* 4 */
+
+       (1 << 0) |
+       (1 << 1) |
+       (0 << 2) |
+       (1 << 3) |
+       (0 << 4) |
+       (1 << 5) |
+       (1 << 6),               /* 5 */
+
+       (1 << 0) |
+       (1 << 1) |
+       (0 << 2) |
+       (1 << 3) |
+       (1 << 4) |
+       (1 << 5) |
+       (1 << 6),               /* 6 */
+
+       (1 << 0) |
+       (0 << 1) |
+       (1 << 2) |
+       (0 << 3) |
+       (0 << 4) |
+       (1 << 5) |
+       (0 << 6),               /* 7 */
+
+       (1 << 0) |
+       (1 << 1) |
+       (1 << 2) |
+       (1 << 3) |
+       (1 << 4) |
+       (1 << 5) |
+       (1 << 6),               /* 8 */
+
+       (1 << 0) |
+       (1 << 1) |
+       (1 << 2) |
+       (1 << 3) |
+       (0 << 4) |
+       (1 << 5) |
+       (1 << 6),               /* 9 */
+
+       (1 << 0) |
+       (1 << 1) |
+       (1 << 2) |
+       (1 << 3) |
+       (1 << 4) |
+       (1 << 5) |
+       (0 << 6),               /* A */
+
+       (0 << 0) |
+       (1 << 1) |
+       (0 << 2) |
+       (1 << 3) |
+       (1 << 4) |
+       (1 << 5) |
+       (1 << 6),               /* b */
+
+       (1 << 0) |
+       (1 << 1) |
+       (0 << 2) |
+       (0 << 3) |
+       (1 << 4) |
+       (0 << 5) |
+       (1 << 6),               /* c */
+
+       (0 << 0) |
+       (0 << 1) |
+       (1 << 2) |
+       (1 << 3) |
+       (1 << 4) |
+       (1 << 5) |
+       (1 << 6),               /* d */
+
+       (1 << 0) |
+       (1 << 1) |
+       (0 << 2) |
+       (1 << 3) |
+       (1 << 4) |
+       (0 << 5) |
+       (1 << 6),               /* E */
+
+       (1 << 0) |
+       (1 << 1) |
+       (0 << 2) |
+       (1 << 3) |
+       (1 << 4) |
+       (0 << 5) |
+       (0 << 6),               /* F */
 };
 
 void
@@ -177,7 +181,7 @@ ao_seven_segment_set(uint8_t digit, uint8_t value)
 
                /* Check for decimal point */
                if (value & 0x10)
-                       segments |= (1 << AO_SEGMENT_7);
+                       segments |= (1 << 7);
        }
 
        for (s = 0; s <= 7; s++)
@@ -192,7 +196,7 @@ ao_seven_segment_clear(void)
 }
 
 
-#if 0
+#if SEVEN_SEGMENT_DEBUG
 static void
 ao_seven_segment_show(void)
 {
@@ -214,7 +218,7 @@ static const struct ao_cmds ao_seven_segment_cmds[] = {
 void
 ao_seven_segment_init(void)
 {
-#if 0
+#if SEVEN_SEGMENT_DEBUG
        ao_cmd_register(ao_seven_segment_cmds);
 #endif
 }
index 4f2a2242aeded5e0ef55e7d4b00dfa751b1b30a7..47ea374ed6070303b5b306db6cb1719e825ea891 100644 (file)
 #include <ao.h>
 #include <ao_lcd_stm.h>
 
+#ifndef LCD_DEBUG
+#define LCD_DEBUG      0
+#endif
+
 struct ao_lcd_segment {
        uint8_t reg;
        uint8_t bit;
@@ -271,24 +275,51 @@ ao_lcd_clear(void)
        ao_lcd_flush();
 }
 
+#ifdef AO_SEGMENT_MAP
+#if AO_LCD_PER_DIGIT
+static const struct ao_lcd_map {
+       uint8_t com, seg;
+} ao_lcd_map[AO_LCD_DIGITS * AO_LCD_SEGMENTS] = AO_SEGMENT_MAP;
+#else
+static const uint8_t ao_lcd_map[] = AO_SEGMENT_MAP;
+#endif
+#endif
+
 void
 ao_lcd_set(uint8_t digit, uint8_t segment, uint8_t value)
 {
        uint8_t n;
+       uint8_t com, seg;
 
-       if (digit >= NCOM)
-               digit = NCOM-1;
-       if (segment >= NSEG)
-               segment = NSEG-1;
+#ifdef AO_SEGMENT_MAP
+#if AO_LCD_PER_DIGIT
+       n = digit * AO_LCD_SEGMENTS + segment;
+       com = ao_lcd_map[n].com;
+       seg = ao_lcd_map[n].seg;
+#else
+       com = digit;
+       seg = ao_lcd_map[segment];
+#endif
+#else
+       com = digit;
+       seg = segment;
+#endif
+       if (com >= NCOM)
+               com = NCOM-1;
+       if (seg >= NSEG)
+               seg = NSEG-1;
 
-       n = (segment >> 5) & 1;
+#if LCD_DEBUG
+       printf ("digit %d segment %d -> com %d seg %d\n", digit, segment, com, seg);
+#endif
+       n = (seg >> 5) & 1;
        if (value)
-               stm_lcd.ram[digit * 2 + n] |= (1 << (segment & 0x1f));
+               stm_lcd.ram[com * 2 + n] |= (1 << (seg & 0x1f));
        else
-               stm_lcd.ram[digit * 2 + n] &= ~(1 << (segment & 0x1f));
+               stm_lcd.ram[com * 2 + n] &= ~(1 << (seg & 0x1f));
 }
 
-#if 0
+#if LCD_DEBUG
 static void
 ao_lcd_stm_seg_set(void)
 {
@@ -307,7 +338,7 @@ ao_lcd_stm_seg_set(void)
 
 static const struct ao_cmds ao_lcd_stm_cmds[] = {
        { ao_lcd_stm_seg_set,   "s <com> <seg> <value>\0Set LCD segment" },
-       { ao_lcd_clear,         "C\0Clear LCD" },
+       { ao_lcd_clear,         "x\0Clear LCD" },
        { 0, NULL },
 };
 #endif
@@ -411,7 +442,7 @@ ao_lcd_stm_init(void)
        stm_nvic_set_priority(STM_ISR_LCD_POS, AO_STM_NVIC_LOW_PRIORITY);
 
        /* All done */
-#if 0
+#if LCD_DEBUG
        ao_cmd_register(ao_lcd_stm_cmds);
 #endif
 }