Учебник 8
Многоразрядный светодиодный индикатор

Динамическая индикация

Библиотека внешних устройств (External device library) работает с 7-сегментными (и запятая) сведодиодными индикаторами на несколько разрядов. Индикаторы подключены по схеме динамической индикации. На индикаторе может быть любое количество разрядов с общим анодом или катодом. Используются все 8 сегментов (с запятой). Выводы сегментов индикатора можно подключить к одному порту МК (сегмент a - к биту 0, b - к биту 1, ..., h - к биту 7) или к любым свободным линиям порта микроконтроллера. В этом учебнике используется индикатор на 4 разряда с общим катодом. Вот схема:


Схема платы со светодиодным индикатором

Скачать схему платы со светодиодным индикатором в формате TinyCad (.dsn)

Тестовая программа

Программа определяет количество разрядов индикатора по количеству общих (common) выводов (анодов или катодов). Первый общий вывод должен быть от самого младшего разряда, последний - от самого старшего. Динамическую индикацию осуществляет метод processMultiplexing() То есть, его нужно вызывать с частотой от 120 Гц * (количество разрядов) до 500 Гц * (количество разрядов). Для 4 разрядов получается от 480 до 2000 Гц. В этой тестовой программе 8-битный таймер переполняется с частотой 1 МГц/8/256 ≈ 488 Гц. Каждый раз, когда таймер переполняется, вызывается метод processMultiplexing()

В начале программы высвечивается число 0000. Увеличивается первый разряд, после паузы увеличивается второй, потом третий, четвёртый. Затем первый разряд опять увеличивается, и так повторяется до бесконечности.

import mcujavasource.mcu.*;
import mcujavasource.mcu.external.led.MultiDigitLedDisplay;

/** Tutorial 8: multi digit LED display.
 * At the beginning, number 0000 is displayed.
 * First digit increments, then second after delay, third, fourth. First digit
 * increments again. Program is repeated discontiniously.
 */
public class Main extends Microcontroller
{
  private MultiDigitLedDisplay ledDisplay;
  private Port segmentPort = getHardware().getPort("D");
  private Port commonPort = getHardware().getPort("C");
  private Pin common0 = commonPort.getPin(1);
  private Pin common1 = commonPort.getPin(2);
  private Pin common2 = commonPort.getPin(3);
  private Pin common3 = commonPort.getPin(4);
  
  private Timer ledDisplayTimer;
  
  public void init()
  { getHardware().setAllPortsDirection(Pin.IN);
    getHardware().setAllPortsPullUp(true);
    ledDisplay = new MultiDigitLedDisplay(true, //common anode
        segmentPort, common0, common1, common2, common3);
    ledDisplayTimer = getHardware().getDefaultTimer(8);
    ledDisplayTimer.setMode(TimerMode.NORMAL);
    ledDisplayTimer.setPrescaling(8);
    ledDisplayTimer.setEnabled(true);
    LedDisplayDigitMultiplexer multiplexer = new LedDisplayDigitMultiplexer();
    ledDisplayTimer.addTimerListener(multiplexer);
    ledDisplayTimer.setTimerOverflowedFired(true);
  }
  
  public void start()
  { ledDisplay.setDigitValue(0, 0);
    ledDisplay.setDigitValue(1, 0);
    ledDisplay.setDigitValue(2, 0);
    ledDisplay.setDigitValue(3, 0);
    getHardware().setInterruptsEnabled(true);
    for(;;)
    { for(int digit = 0; digit < 4; digit++)
      { int value = ledDisplay.getDigitValue(digit);
        if(++value > 10) value = 0;
        ledDisplay.setDigitValue(digit, value);
        getHardware().getDelay().sleep(250);
      }
    }
  }
  
  private class LedDisplayDigitMultiplexer implements TimerListener
  {
    public void timerOverflowed()
    { ledDisplay.processMultiplexing();
    }
   
  }
  
  
}

Скачать файл исходного кода программы