Аlex писал(а):Тогда уж так:
Код: Выделить всё
void ind_update (void)
{
static unsigned char count = 0;
PORTB=0x00; // гасим сегменты
if (count == 0) PORTB = (1<<0); // определяем какой разряд должен гореть (ИМХО, тут копать нужно)
if (count == 1) PORTB = (1<<1);
if (count == 2) PORTB = (1<<2);
if (count == 3) PORTB = (1<<3);
PORTD = adc_data[count]; // выводим в порт код цифры (сегменты)
count++; // включаем следующий разряд
if (count == 4) count = 0;
не соглашусь. рассмотрим работу функции:
1. вход в функцию: индикатор отображает 0-й разряд, count = 1.
2. PORTB = 0; - гасим индикатор
3. цепочкой if-ов ВКЛЮЧАЕМ СЛЕДУЮЩИЙ разряд, т.е. зажигаем в 1-ом разряде то, что выводилось ранее в PORTD, т.е. инфу для 0-го разряда!!! это и есть подсветка соседнего знакоместа
4. PORTD = adc_data[count]; - обновляем сегменты, т.е. теперь в 1-ом знакоместе светится то, что и должно
5. вычисляем count для следующего знакоместа.
таким образом в предлагаемом алгоритме ГАРАНТИРУЕТСЯ подсветка сегментов!!!
безусловно правильный алгоритм:
1. гасим ВСЕ РАЗРЯДЫ
2. обновляем СЕГМЕНТЫ
3. включаем СЛЕДУЮБЩИЙ разряд