Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/ShftOut21

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

Код

  1. //***************************************************************//
  2. //  Название    : Два светодиодных счетчика                      //
  3. //  Автор       : Кэрлин Мо, Том Иго                             //
  4. //  Дата        : 25 октября 2006 года                           //
  5. //  Версия      : 1.0                                            //
  6. //  Примечания  : Код для использования со сдвиговым             //
  7. //              : регистром 74РС595, считает от «0» до «255»     //
  8. //***************************************************************//
  9.  
  10. // Контакт, подключенный к контакту ST_CP на 74HC595:
  11. int latchPin = 8;
  12. // Контакт, подключенный к контакту SH_CP на 74HC595:
  13. int clockPin = 12;
  14. // Контакт, подключенный к контакту DS на 74HC595:
  15. int dataPin = 11;
  16.  
  17.  
  18.  
  19. void setup() {
  20.   // запускаем последовательную коммуникацию (в отладочных целях):
  21.   Serial.begin(9600);
  22.   // выставляем latchPin в режим OUTPUT, чтобы с его помощью
  23.   // можно было управлять сдвиговым регистром:
  24.   pinMode(latchPin, OUTPUT);
  25.  
  26. }
  27.  
  28. void loop() {
  29.   // функция для счета:
  30.   for (int j = 0; j < 256; j++) {
  31.     // пока данные передаются, ставим latchPin на LOW:
  32.     digitalWrite(latchPin, 0);
  33.     // считаем на зеленых светодиодах:
  34.     shiftOut(dataPin, clockPin, j);
  35.     // считаем на красных светодиодах:
  36.     shiftOut(dataPin, clockPin, 255-j);
  37.     // возвращаем latchPin значение HIGH, сообщая чипу,
  38.     // что ему больше не нужно прослушивать входящую информацию:
  39.     digitalWrite(latchPin, 1);
  40.     delay(1000);
  41.   }
  42. }
  43.  
  44. // эта функция передает 8 бит данных (первым идет самый старший бит);
  45. // передача осуществляется на возрастающем фронте тактового сигнала:
  46. void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
  47.  
  48.   // аналог блока setup(), но внутри функции:
  49.   int i=0;
  50.   int pinState;
  51.   pinMode(myClockPin, OUTPUT);
  52.   pinMode(myDataPin, OUTPUT);
  53.  
  54.   // стираем все, чтобы подготовить
  55.   // сдвиговый регистр к передаче битов:
  56.   digitalWrite(myDataPin, 0);
  57.   digitalWrite(myClockPin, 0);
  58.  
  59.   // выполняется для каждого бита в байте myDataOut;
  60.   // обратите внимание, что в цикле for() ниже
  61.   // СЧЕТ ИДЕТ В ОБРАТНОМ НАПРАВЛЕНИИ, и это значит, что значение
  62.   // «%00000001» или «1» будет соответствовать контакту Q0:
  63.   for (i=7; i>=0; i--)  {
  64.     digitalWrite(myClockPin, 0);
  65.  
  66.     // если значение было передано переменной myDataOut и проверка
  67.     // битовой маской прошла успешно... то есть если i=6
  68.     // и наше значение это «%11010100», код сравнит его с «%01000000»,
  69.     // а затем запишет в pinState значение «1»:
  70.     if ( myDataOut & (1<<i) ) {
  71.       pinState= 1;
  72.     }
  73.     else {     
  74.       pinState= 0;
  75.     }
  76.  
  77.     // задаем этому контакту HIGH или LOW в зависимости от pinState:
  78.     digitalWrite(myDataPin, pinState);
  79.     // если тактовый контакт получает значение HIGH,
  80.     // сдвиговый регистр перемещает биты:
  81.     digitalWrite(myClockPin, 1);
  82.     // после перемещения битов задаем контакту для данных
  83.     // значение «0», чтобы избежать «просачивания» данных:
  84.     digitalWrite(myDataPin, 0);
  85.   }
  86.  
  87.   // останавливаем перемещение битов:
  88.   digitalWrite(myClockPin, 0);
  89. }

См.также

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

  1. www.arduino.cc - ShftOut21