ATtinyでshiftOutなどをレジスタ操作でどうにかする備忘録です。7セグメントLEDなどの制御にどうぞ。
コード
ラッチ・クロック・データピンは全部同一のPORTのピンに配置し、S_OUT_PORT
にはそのPORTを記述してください。同一のPORTにできないなら、コードをいくらか書き足す必要があります。
Arduino
#define S_OUT_PORT PORTA
#define latchPin PA0
#define clockPin PA1
#define dataPin PA2
// 略
void hc595_shiftout(uint8_t data) {
// latchPinをLOWにする
S_OUT_PORT &= ~(1 << latchPin);
for (int i = 7; i >= 0; i--) {
if (data & (1 << i)) {
// dataPinをHIGHにする
S_OUT_PORT |= (1 << dataPin);
} else {
// dataPinをLOWにする
S_OUT_PORT &= ~(1 << dataPin);
}
// clockPinをHIGHにする
S_OUT_PORT |= (1 << clockPin);
// clockPinをLOWにする
S_OUT_PORT &= ~(1 << clockPin);
}
// latchPinをHIGHにする
S_OUT_PORT |= (1 << latchPin);
}
// こんな感じに...
hc595_shiftout(0b00001001);
PORTAの他のピン(PA3など)には影響はないので、特に気にせず使用できます。