И еще кусочек кода, чтобы не плодить ошибки с case и константами:
Код
//seven_seg.h
//LED segments
#define LA 0x01 // 1
#define LB 0x02 // 2
#define LC 0x04 // 4
#define LD 0x08 // 8
#define LE 0x10 // 16
#define LF 0x20 // 32
#define LG 0x40 // 64
#define LH 0x80 //128
//Seven Segment Signs
#define SS_0 LA | LB | LC | LD | LE | LF
#define SS_1 LB | LC
#define SS_2 LA | LB | LD | LE | LG
#define SS_3 LA | LB | LC | LD | LG
#define SS_4 LB | LC | LF | LG
....
//seven_seg.c
typedef struct _decode_table
{
BYTE ss;
BYTE ch;
} decode_table;
const decode_table ss_table[] =
{
{SS_0,'0'},
{SS_1,'1'},
{SS_2,'2'},
{SS_3,'3'},
....
void OutLED(char* str)
{
for(BYTE i=0; i<DISPLAY_X; i++ )
{
led_buf[i] = char2SS(str[i]);
}
}
...
BYTE char2SS(BYTE b)
{
for(BYTE i = 0; i < sizeof(ss_table)/sizeof(decode_table); i++)
{
if(b == ss_table[i].ch)
{
return ss_table[i].ss;
}
}
return SS_USC;
}
...
//это запускается по таймеру
void UpdateDisplay(void)
{
kbd_timer++;
OffSegment();
OffCommon();
OutSegment(led_buf[pos]);
OutPoint();
OutCommon(pos);
if(kbd_timer > 70)
{
CheckKBD();
kbd_timer = 0;
}
pos++;
if(pos == DISPLAY_X)
{
pos = 0;
}
}
...
//а это ARMовский код, но идея должна быть понятна
void OffSegment(void)
{
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,(0xff << SEG_A));
}
//--------------------------------------------------------------------------
void OffCommon(void)
{
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,(0x0f << COM0));
}
//--------------------------------------------------------------------------
void OutSegment(BYTE s)
{
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,(s << SEG_A));
}
//--------------------------------------------------------------------------
void OutCommon(BYTE p)
{
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,(1 << (COM0 + p)));
}
//--------------------------------------------------------------------------
void OutPoint(void)
{
if(dec_point > DISPLAY_X)
{
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,(1 << SEG_H));
}
if(dec_point == pos)
{
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,(1 << SEG_H));
}
}
SEG_A младший из восьми сегментных битов( для восьмибитки 0)
COM0 младший из 4-х общих.