Arduino:Примеры/ShftOut13

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Использование массива[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);
  }
}

См.также

Внешние ссылки