Arduino:Примеры/ShftOut23

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

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


Использование двух массивов[1]

Это скетч для платы Arduino и двух сдвиговых регистров 74HC595. Он использует данные из массивов, чтобы с их помощью задать паттерн мигания светодиодов.

Код

//**************************************************************//
//  Название    : Использование двух массивов                   //
//  Авторы      : Кэрлин Мо, Том Иго                            //
//  Дата        : 25 октября 2006 года                          //
//  Версия      : 1.0                                           //
//  Примечания  : Код для использования с двумя о сдвиговым     //
//              : сдвиговыми регистрами 74РС595                 //
//**************************************************************//

// Контакт, подключенный к контакту ST_CP на 74HC595:
int latchPin = 8;
// Контакт, подключенный к контакту SH_CP на 74HC595:
int clockPin = 12;
// Контакт, подключенный к контакту DS на 74HC595:
int dataPin = 11;

// переменные и массивы для хранения информации, которая будет 
// передана функции, отвечающей за перемещение битов:
byte dataRED;
byte dataGREEN;
byte dataArrayRED[10];
byte dataArrayGREEN[10];

void setup() {
  // выставляем latchPin в режим OUTPUT, 
  // поскольку он будет использоваться в блоке loop():
  pinMode(latchPin, OUTPUT);
  Serial.begin(9600);

  // Arduino не умеет записывать данные двоичного формата прямо в код,
  // поэтому они представлены здесь в шестнадцатеричном виде 
  // (но подойдет и десятичный формат):
  dataArrayRED[0] = 0xFF; //11111111
  dataArrayRED[1] = 0xFE; //11111110
  dataArrayRED[2] = 0xFC; //11111100
  dataArrayRED[3] = 0xF8; //11111000
  dataArrayRED[4] = 0xF0; //11110000
  dataArrayRED[5] = 0xE0; //11100000
  dataArrayRED[6] = 0xC0; //11000000
  dataArrayRED[7] = 0x80; //10000000
  dataArrayRED[8] = 0x00; //00000000
  dataArrayRED[9] = 0xE0; //11100000

  // Arduino не умеет записывать данные двоичного формата прямо в код,
  // поэтому они представлены здесь в шестнадцатеричном виде 
  // (но подойдет и десятичный формат):
  dataArrayGREEN[0] = 0xFF; //11111111
  dataArrayGREEN[1] = 0x7F; //01111111
  dataArrayGREEN[2] = 0x3F; //00111111
  dataArrayGREEN[3] = 0x1F; //00011111
  dataArrayGREEN[4] = 0x0F; //00001111
  dataArrayGREEN[5] = 0x07; //00000111
  dataArrayGREEN[6] = 0x03; //00000011
  dataArrayGREEN[7] = 0x01; //00000001
  dataArrayGREEN[8] = 0x00; //00000000
  dataArrayGREEN[9] = 0x07; //00000111

  // функция, мигающая всеми светодиодами;
  // параметры – количество миганий и пауза между ними:
  blinkAll_2Bytes(2,500); 
}

void loop() {


  for (int j = 0; j < 10; j++) {
    // загружаем из массива паттерн мигания:
    dataRED = dataArrayRED[j];
    dataGREEN = dataArrayGREEN[j];
    // задаем контакту latchPin значение LOW и оставляем так, 
    // пока все данные не будут переданы:
    digitalWrite(latchPin, 0);
    // перемещаем данные:
    shiftOut(dataPin, clockPin, dataGREEN);   
    shiftOut(dataPin, clockPin, dataRED);
    // возвращаем 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);
  }
}

См.также

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