shiftIn()
1バイトのデータを1ビットだけシフトインします。
書式
uint32 shiftIn( uint32 ulDataPin, uint32 ulClockPin, uint32 ulBitOrder )
引数
ulDataPin :各ビットを入力するピン
ulClockPin :ulDataPin からのデータ読み取りを指示するピン
ulBitOrder :シフトする順番; MSBFIRST (最上位ビット側から) または LSBFIRST(最下位ビット側から)
戻り値
読み取った値(1バイト)
解説
1バイトのデータを1ビットだけシフトインします. 最上位ビット(MSB,左側)と最下位ビット(LSB,右側)のどちらからでも実行できます. それぞれのビットにおいて, 最初にクロックピンをHIGHにし, その次に,データラインから次のビットを読み取ります.その後,クロックピンはLOWに戻ります.
もし,立ち上がりエッジをクロックとして使用するデバイスを接続する場合は,shiftIn() を実行する前に,最初にクロックピンをLOWにしておく必要があります.たとえば, digitalWrite(clockPin, LOW) を実行します.
注: この関数はソフトウェアによって実行されています; ハードウェアで実行され,高速で動作する SPI ライブラリも参照(特定のピンでしか動作しません) 利用例
シフトれじすた74HC165 からデータを読み取るサンプルです。
(SparkFun Electronics,Creative Commons tutorials are CC BY-SA 4.0)
code:sample.ino
// HARDWARE CONNECTIONS
// Connect the following pins between your Arduino and the 74HC165 Breakout Board
// Connect pins A-H to 5V or GND or switches or whatever
const int data_pin = 11; // Connect Pin 11 to SER_OUT (serial data out)
const int shld_pin = 8; // Connect Pin 8 to SH/!LD (shift or active low load)
const int clk_pin = 12; // Connect Pin 12 to CLK (the clock that times the shifting)
const int ce_pin = 9; // Connect Pin 9 to !CE (clock enable, active low)
byte incoming; // Variable to store the 8 values loaded from the shift register
// The part that runs once
void setup() {
// Initialize serial to gain the power to obtain relevant information, 9600 baud
Serial.begin(9600);
// Initialize each digital pin to either output or input
// We are commanding the shift register with each pin with the exception of the serial
// data we get back on the data_pin line.
pinMode(shld_pin, OUTPUT);
pinMode(ce_pin, OUTPUT);
pinMode(clk_pin, OUTPUT);
pinMode(data_pin, INPUT);
// Required initial states of these two pins according to the datasheet timing diagram
digitalWrite(clk_pin, HIGH);
digitalWrite(shld_pin, HIGH);
}
// The part that runs to infinity and beyond
void loop() {
incoming = read_shift_regs(); // Read the shift register, it likes that
// Print out the values being read from the shift register
Serial.println("\nThe incoming values of the shift register are: ");
Serial.print("ABCDEFGH : ");
print_byte(incoming); // Print every 1 and 0 that correlates with A through H
//Serial.println(incoming,BIN); // This way works too but leaves out the leading zeros
delay(2000); // Wait for some arbitrary amount of time
}
// This code is intended to trigger the shift register to grab values from it's A-H inputs
byte read_shift_regs() {
byte the_shifted = 0; // An 8 bit number to carry each bit value of A-H
// Trigger loading the state of the A-H data lines into the shift register
digitalWrite(shld_pin, LOW);
delayMicroseconds(5); // Requires a delay here according to the datasheet timing diagram
digitalWrite(shld_pin, HIGH);
delayMicroseconds(5);
// Required initial states of these two pins according to the datasheet timing diagram
pinMode(clk_pin, OUTPUT);
pinMode(data_pin, INPUT);
digitalWrite(clk_pin, HIGH);
digitalWrite(ce_pin, LOW); // Enable the clock
// Get the A-H values
the_shifted = shiftIn(data_pin, clk_pin, MSBFIRST);
digitalWrite(ce_pin, HIGH); // Disable the clock
return the_shifted;
}
// A function that prints all the 1's and 0's of a byte, so 8 bits +or- 2
void print_byte(byte val) {
byte i;
for(byte i=0; i<=7; i++) {
Serial.print(val >> i & 1, BIN); // Magic bit shift, if you care look up the <<, >>, and & operators
}
Serial.print("\n"); // Go to the next line, do not collect $200
}
関連項目
本文章はたま吉が一部加筆修正したものです。