diff options
-rw-r--r-- | src/drivers/ao_seven_segment.c | 264 | ||||
-rw-r--r-- | src/stm/ao_lcd_stm.c | 51 |
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 } |