Arduino:Примеры/ShftOut12: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
Строка 9: Строка 9:
==Код==
==Код==


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
/*
/*
Один за одним
Один за одним

Текущая версия от 18:19, 14 мая 2023

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


Один за одним[1]

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

Код

/*
Один за одним

Используется вместе со сдвиговым регистром 74HC595.

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

Оборудование:

* Сдвиговый регистр 74HC595, подключенный к контактам 8, 12 и 11
  на Arduino (более подробно – в самом скетче)
* Светодиоды, подключенные ко всем выходным контактам сдвигового 
  регистра

Создан 22 мая 2009 года Томом Иго.
Модифицирован 23 марта 2010 года им же.

*/

// Контакт, подключенный к контакту-защелке (ST_CP) на 74HC595:
const int latchPin = 8;
// Контакт, подключенный к тактовому контакту (SH_CP) на 74HC595:
const int clockPin = 12;
// Контакт, подключенный к контакту для данных (DS) на 74HC595:
const int dataPin = 11;

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

void loop() {
  if (Serial.available() > 0) {
    // В таблице ASCII символы с «0» до «9» представлены числами 
    // от «48» до «57». Поэтому, если пользователь печатает цифру 
    // от «0» до «9» в формате ASCII, то нам, чтобы получить 
    // нужное значение, нужно вычесть «48»:
    int bitToSet = Serial.read() - 48;

  // передаем значение на сдвиговый регистр, выставляя нужному 
  // контакту значение HIGH:
    registerWrite(bitToSet, HIGH);
  }
}

// эта функция передает биты сдвиговому регистру:
void registerWrite(int whichPin, int whichState) {
// биты, которые вы хотите отправить:
  byte bitsToSend = 0;

  // отключаем вывод данных, чтобы во время передачи битов 
  // светодиоды не загорались:
  digitalWrite(latchPin, LOW);

  // включаем самый старший бит в переменной bitsToSend:
  bitWrite(bitsToSend, whichPin, whichState);

  // перемещаем биты:
  shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);

    // включаем вывод данных, чтобы передать значения светодиодам:
  digitalWrite(latchPin, HIGH);

}

См.также

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