summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-04-28 23:08:03 -0700
committerKeith Packard <keithp@keithp.com>2013-05-07 20:07:52 -0700
commit38d4110e59a44687d8a4743b8cd04cbf2761c9d8 (patch)
tree7fcfd5a4f7f0fa2d2ce6f8df909cfba466e87cd7 /src
parentf09b2fc7fcfb1b3dcb1a46a8b9856092dd59866b (diff)
altos: Allow LCD segments to not be multiplexed across digits
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>
Diffstat (limited to 'src')
-rw-r--r--src/drivers/ao_seven_segment.c264
-rw-r--r--src/stm/ao_lcd_stm.c51
2 files changed, 175 insertions, 140 deletions
diff --git a/src/drivers/ao_seven_segment.c b/src/drivers/ao_seven_segment.c
index b3b5f878..961fbb84 100644
--- a/src/drivers/ao_seven_segment.c
+++ b/src/drivers/ao_seven_segment.c
@@ -34,134 +34,138 @@
*
*/
+#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
}
diff --git a/src/stm/ao_lcd_stm.c b/src/stm/ao_lcd_stm.c
index 4f2a2242..47ea374e 100644
--- a/src/stm/ao_lcd_stm.c
+++ b/src/stm/ao_lcd_stm.c
@@ -18,6 +18,10 @@
#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
}