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

Arduino:Примеры/ShftOut22

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

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

Контакты:

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


Поочередное зажигание 16 светодиодов[1]

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

Код

  1. //***************************************************************//
  2. //  Название    : Поочередное зажигание 16 светодиодов           //
  3. //  Автор       : Кэрлин Мо, Том Иго                             //
  4. //  Дата        : 25 октября 2006 года                           //
  5. //  Версия      : 1.0                                            //
  6. //  Примечания  : Код для использования с двумя о сдвиговым      //              
  7. //              : сдвиговыми регистрами 74РС595                  //
  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. byte data = 0;
  20.  
  21.  
  22.  
  23. void setup() {
  24.   // выставляем latchPin в режим OUTPUT,
  25.   // поскольку он будет использоваться в блоке loop():
  26.   pinMode(latchPin, OUTPUT);
  27.  
  28. }
  29.  
  30. void loop() {
  31.  
  32.   // функция, мигающая всеми светодиодами;
  33.   // параметры – количество миганий и пауза между ними:
  34.   blinkAll_2Bytes(1,500);
  35.  
  36.   // поочередно зажигаем каждый светодиод с помощью функции A:
  37.   for (int j = 0; j < 8; j++) {
  38.     // задаем контакту latchPin значение LOW и оставляем так,
  39.     // пока все данные не будут переданы:
  40.     digitalWrite(latchPin, 0);
  41.     // красные светодиоды:
  42.     lightShiftPinA(7-j);
  43.     // зеленые светодиоды:
  44.     lightShiftPinA(j);
  45.     // возвращаем latchPin значение HIGH, сообщая чипу,
  46.     // что ему больше не нужно прослушивать входящую информацию:
  47.     digitalWrite(latchPin, 1);
  48.     delay(1000);
  49.   }
  50.  
  51.   // поочередно зажигаем каждый светодиод с помощью функции B:
  52.   for (int j = 0; j < 8; j++) {
  53.     // задаем контакту latchPin значение LOW и оставляем так,
  54.     // пока все данные не будут переданы:
  55.     digitalWrite(latchPin, 0);
  56.     // красные светодиоды:
  57.     lightShiftPinB(j);
  58.     // зеленые светодиоды:
  59.     lightShiftPinB(7-j);
  60.     // возвращаем latchPin значение HIGH, сообщая чипу,
  61.     // что ему больше не нужно прослушивать входящую информацию:
  62.     digitalWrite(latchPin, 1);
  63.     delay(1000);
  64.   }
  65.  
  66. }
  67.  
  68. // чтобы перемещаться по контактам, эта функция
  69. // использует побитовые расчеты:
  70. void lightShiftPinA(int p) {
  71.   // задаем локальную переменную:
  72.   int pin;
  73.  
  74.   // эта строчка кода использует побитовый оператор;
  75.   // перемещение бита влево при помощи «<<» – это то же самое,
  76.   // что и умножение десятичного числа на «2»:
  77.   pin = 1<< p;
  78.  
  79.   // перемещаем биты:
  80.   shiftOut(dataPin, clockPin, pin);  
  81.  
  82. }
  83.  
  84. // чтобы перемещаться по контактам, эта функция использует тот факт,
  85. // что каждый бит в байте в два раза больше, чем предыдущий:
  86. void lightShiftPinB(int p) {
  87.   // задаем локальную переменную:
  88.   int pin;
  89.  
  90.   // начинаем с pin = 1; таким образом, если задать этой переменной
  91.   // значение «0», это зажжет светодиод номер «0»:
  92.   pin = 1;
  93.  
  94.   for (int x = 0; x < p; x++) {
  95.     pin = pin * 2;
  96.   }
  97.   // перемещаем биты:
  98.   shiftOut(dataPin, clockPin, pin);  
  99. }
  100.  
  101.  
  102. // «сердце» программы;
  103. // эта функция передает 8 бит данных (первым идет самый старший бит);
  104. // передача осуществляется на возрастающем фронте тактового сигнала:
  105. void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
  106.  
  107.   // аналог блока setup(), но внутри функции:
  108.   int i=0;
  109.   int pinState;
  110.   pinMode(myClockPin, OUTPUT);
  111.   pinMode(myDataPin, OUTPUT);
  112.  
  113.   // стираем все, чтобы подготовить
  114.   // сдвиговый регистр к передаче битов:
  115.   digitalWrite(myDataPin, 0);
  116.   digitalWrite(myClockPin, 0);
  117.  
  118.   // выполняется для каждого бита в байте myDataOut;
  119.   // обратите внимание, что в цикле for() ниже
  120.   // СЧЕТ ИДЕТ В ОБРАТНОМ НАПРАВЛЕНИИ, и это значит, что значение
  121.   // «%00000001» или «1» будет соответствовать контакту Q0:
  122.   for (i=7; i>=0; i--)  {
  123.     digitalWrite(myClockPin, 0);
  124.  
  125.     // если значение было передано переменной myDataOut и проверка
  126.     // битовой маской прошла успешно... то есть если i=6
  127.     // и наше значение это «%11010100», код сравнит его с «%01000000»,
  128.     // а затем запишет в pinState значение «1»:  
  129.     if ( myDataOut & (1<<i) ) {
  130.       pinState= 1;
  131.     }
  132.     else {     
  133.       pinState= 0;
  134.     }
  135.  
  136.     // задаем этому контакту HIGH или LOW в зависимости от pinState:
  137.     digitalWrite(myDataPin, pinState);
  138.     // если тактовый контакт получает значение HIGH,
  139.     // сдвиговый регистр перемещает биты:
  140.     digitalWrite(myClockPin, 1);
  141.     // после перемещения битов задаем контакту для данных
  142.     // значение «0», чтобы избежать «просачивания» данных:
  143.     digitalWrite(myDataPin, 0);
  144.   }
  145.  
  146.   // останавливаем перемещение битов:
  147.   digitalWrite(myClockPin, 0);
  148. }
  149.  
  150.  
  151. // эта функция мигает всеми светодиодами, подключенными к 2 регистрам;
  152. // переменная «n» – это то, сколько раз нужно мигнуть, а «d» – сколько
  153. // должна длиться пауза между миганиями; запускается с момента,
  154. // когда светодиоды не горят – чтобы визуальный эффект
  155. // от первого мигания был полным:
  156. void blinkAll_2Bytes(int n, int d) {
  157.   digitalWrite(latchPin, 0);
  158.   shiftOut(dataPin, clockPin, 0);
  159.   shiftOut(dataPin, clockPin, 0);
  160.   digitalWrite(latchPin, 1);
  161.   delay(200);
  162.   for (int x = 0; x < n; x++) {
  163.     digitalWrite(latchPin, 0);
  164.     shiftOut(dataPin, clockPin, 255);
  165.     shiftOut(dataPin, clockPin, 255);
  166.     digitalWrite(latchPin, 1);
  167.     delay(d);
  168.     digitalWrite(latchPin, 0);
  169.     shiftOut(dataPin, clockPin, 0);
  170.     shiftOut(dataPin, clockPin, 0);
  171.     digitalWrite(latchPin, 1);
  172.     delay(d);
  173.   }
  174. }

См.также

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

  1. www.arduino.cc - ShftOut22