60
61
62
63
};
template<class ClockPin, class DataPin, class LatchPin, unsigned ID, class T>
T ThreePinLatch<ClockPin, DataPin, LatchPin, ID, T>::_currentValue = 0;
Мы не можем прочитать состояние выходных линий регистра – он всегда
работает на выход, поэтому функцию чтения состояния не реализуем и не
объявляем. Попытка прочитать состояние такого пора вызовет ошибку
компиляции. Зато на запись нет никаких ограничения. И мы свободно можем
использовать этот «порт» со списками линий.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef ThreePinLatch<Pa0, Pa1, Pa3, 'R1'> ShiftReg1;
typedef TPin<ShiftReg1, 0> Rg0;
typedef TPin<ShiftReg1, 1> Rg1;
typedef TPin<ShiftReg1, 2> Rg2;
typedef TPin<ShiftReg1, 3> Rg3;
typedef TPin<ShiftReg1, 4> Rg4;
typedef TPin<ShiftReg1, 5> Rg5;
typedef TPin<ShiftReg1, 6> Rg6;
typedef TPin<ShiftReg1, 7> Rg7;
typedef PinList<Rg4, Rg5, Rg6, Rg7, Pb0, Pb1, Pb2, Pb3> MyPins;
...
MyPins::Write(PORTC);
Причем нет никаких ограничений на состав списка линий – можно
смешивать в одном списке линии сдвигового регистра и линии обычных
портов.
В наших целях значится не только работа с многобитными значениями, но и
манипуляции отдельными битами, поэтому добавим в интерфейс списков
линий функциональность для этого. Во первых, это доступ к отдельным
линиям из списка. Для этого в класс PinSet допишем следующий код:
1
2
3
template<uint8_t PIN>
class Pin :public TypeAt<PINS, PIN>::Result::Pin
{};