Библиотека внешних устройств (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();
}
}
}