Arduino:Примеры/ShftOut21

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

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


Два светодиодных счетчика[1]

Это скетч для платы Arduino и двух сдвиговых регистров 74HC595. Он поочередно генерирует числа от «0» до «255», передает их сдвиговым регистрам, а те передают их 16 светодиодам, которые показывают двоичную версию этих чисел.

Код

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

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



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

}

void loop() {
  // функция для счета:
  for (int j = 0; j < 256; j++) {
    // пока данные передаются, ставим latchPin на LOW:
    digitalWrite(latchPin, 0);
    // считаем на зеленых светодиодах:
    shiftOut(dataPin, clockPin, j); 
    // считаем на красных светодиодах:
    shiftOut(dataPin, clockPin, 255-j);
    // возвращаем latchPin значение HIGH, сообщая чипу, 
    // что ему больше не нужно прослушивать входящую информацию:
    digitalWrite(latchPin, 1);
    delay(1000);
  }
}

// эта функция передает 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);
}

См.также

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