Arduino:Примеры/ShftOut13
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Использование массива[1]
Это скетч для платы Arduino и одного сдвигового регистра 74HC595. Он использует данные из массива, чтобы с их помощью задать паттерн мигания светодиодов.
Код
/*
Использование массива
Этот скетч включает выходные контакты сдвигового регистра 74HC595
при помощи массива.
Оборудование:
* Сдвиговый регистр 74HC595
* Светодиоды, подключенные к каждому выходному контакту 74HC595
*/
// Контакт, подключенный к контакту-защелке (ST_CP) на 74HC595:
int latchPin = 8;
// Контакт, подключенный к тактовому контакту (SH_CP) на 74HC595:
int clockPin = 12;
// Контакт, подключенный к контакту для данных (DS) на 74HC595:
int dataPin = 11;
// здесь будет храниться информация, которая впоследствии будет
// передана функции, отправляющей данные сдвиговому регистру:
byte data;
byte dataArray[10];
void setup() {
// выставляем latchPin в режим OUTPUT,
// поскольку он будет использоваться в блоке loop():
pinMode(latchPin, OUTPUT);
Serial.begin(9600);
// за слешами – двоичные значения чисел:
dataArray[0] = 0xFF; //0b11111111
dataArray[1] = 0xFE; //0b11111110
dataArray[2] = 0xFC; //0b11111100
dataArray[3] = 0xF8; //0b11111000
dataArray[4] = 0xF0; //0b11110000
dataArray[5] = 0xE0; //0b11100000
dataArray[6] = 0xC0; //0b11000000
dataArray[7] = 0x80; //0b10000000
dataArray[8] = 0x00; //0b00000000
dataArray[9] = 0xE0; //0b11100000
// функция, мигающая всеми светодиодами;
// параметры – количество миганий и пауза между ними:
blinkAll_2Bytes(2,500);
}
void loop() {
for (int j = 0; j < 10; j++) {
// загружаем из массива паттерн мигания:
data = dataArray[j];
// задаем контакту latchPin значение LOW и оставляем так,
// пока все данные не будут переданы:
digitalWrite(latchPin, 0);
// перемещаем данные:
shiftOut(dataPin, clockPin, data);
// возвращаем latchPin значение HIGH, сообщая чипу,
// что ему больше не нужно прослушивать входящую информацию:
digitalWrite(latchPin, 1);
delay(300);
}
}
// «сердце» программы;
// эта функция передает 8 бит данных (первым идет самый старший бит);
// передача осуществляется на возрастающем фронте тактового сигнала:
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
// аналог блока setup(), но внутри функции:
int i=0;
int pinState;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);
// стираем все, чтобы подготовить
// сдвиговый регистр к передаче битов:
digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);
// выполняется для каждого бита в байте myDataOut;
// обратите внимание, что в цикле for() ниже
// СЧЕТ ИДЕТ В ОБРАТНОМ НАПРАВЛЕНИИ, и это значит, что значение
// «%00000001» или «1» будет соответствовать контакту Q0:
for (i=7; i>=0; i--) {
digitalWrite(myClockPin, 0);
// если значение было передано переменной myDataOut и проверка
// битовой маской прошла успешно... то есть если i=6
// и наше значение это «%11010100», код сравнит его с «%01000000»,
// а затем запишет в pinState значение «1»:
if ( myDataOut & (1<<i) ) {
pinState= 1;
}
else {
pinState= 0;
}
// задаем этому контакту HIGH или LOW в зависимости от pinState:
digitalWrite(myDataPin, pinState);
// если тактовый контакт получает значение HIGH,
// сдвиговый регистр перемещает биты:
digitalWrite(myClockPin, 1);
// после перемещения битов задаем контакту для данных
// значение «0», чтобы избежать «просачивания» данных:
digitalWrite(myDataPin, 0);
}
// останавливаем перемещение битов:
digitalWrite(myClockPin, 0);
}
// эта функция мигает всеми светодиодами, подключенными к регистру;
// переменная «n» – это то, сколько раз нужно мигнуть, а «d» – сколько
// должна длиться пауза между миганиями; запускается с момента,
// когда светодиоды не горят – чтобы визуальный эффект
// от первого мигания был полным:
void blinkAll_2Bytes(int n, int d) {
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, 0);
shiftOut(dataPin, clockPin, 0);
digitalWrite(latchPin, 1);
delay(200);
for (int x = 0; x < n; x++) {
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, 255);
shiftOut(dataPin, clockPin, 255);
digitalWrite(latchPin, 1);
delay(d);
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, 0);
shiftOut(dataPin, clockPin, 0);
digitalWrite(latchPin, 1);
delay(d);
}
}