diff options
Diffstat (limited to 'src')
| -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  }  | 
