если я Вас верно понял, то вот так должно быть:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено crox 28 декабря 2004 г. 07:29
В ответ на: Как я понял в прерывании Вы пытветесь вывести сразу две цифры отправлено Andrew_Q 28 декабря 2004 г. 06:34


SIGNAL(SIG_OUTPUT_COMPARE0)
{
// unit=0 SEG_D2
// unit=1 SEG_D4
if (unit == 0) {
/* shut off digit */
PORTB = _BV(SEG_D4);
DISPLAY_PORT = DigitTable[17];

/* display next unit */
PORTB = _BV(SEG_D2);
DISPLAY_PORT = DigitTable[0];
}
else if (unit == 1) {
/* shut off digit */
PORTB = _BV(SEG_D2);
DISPLAY_PORT = DigitTable[17];

/* display next unit */
PORTB = _BV(SEG_D4);
DISPLAY_PORT = DigitTable[1];
}

unit++;
if (unit > 1) unit = 0;
//PORTB = _BV(SEG_D4);
//DISPLAY_PORT = DigitTable[cnt++];
//if (cnt == 10) cnt = 0;
}

Но у этого кода странный глючок: отображаются оба индикатора, которые мне надо, но на втором вместо '1' только половинка, то есть сегмент 'B' не зажигается...

У меня общий анод, потому как я понимаю должно быть инвертирование. Цифры определены так:


/* Segments definition */
#define SEG_A 0x01
#define SEG_B 0x02
#define SEG_C 0x04
#define SEG_D 0x08
#define SEG_E 0x10
#define SEG_F 0x20
#define SEG_G 0x40
#define SEG_CD 0x80

uint8_t DigitTable[] = {
~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F), // 0
~(SEG_B | SEG_C), // 1

.....
};


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru