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

Arduino:Примеры/ShftOut13

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

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

Контакты:

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


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

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

Код

  1. /*
  2.  
  3. Использование массива
  4.  
  5. Этот скетч включает выходные контакты сдвигового регистра 74HC595
  6. при помощи массива.
  7.  
  8. Оборудование:
  9.  
  10. * Сдвиговый регистр 74HC595
  11. * Светодиоды, подключенные к каждому выходному контакту 74HC595
  12.  
  13. */
  14.  
  15. // Контакт, подключенный к контакту-защелке (ST_CP) на 74HC595:
  16. int latchPin = 8;
  17. // Контакт, подключенный к тактовому контакту (SH_CP) на 74HC595:
  18. int clockPin = 12;
  19. // Контакт, подключенный к контакту для данных (DS) на 74HC595:
  20. int dataPin = 11;
  21.  
  22. // здесь будет храниться информация, которая впоследствии будет
  23. // передана функции, отправляющей данные сдвиговому регистру:
  24. byte data;
  25. byte dataArray[10];
  26.  
  27. void setup() {
  28.   // выставляем latchPin в режим OUTPUT,
  29.   // поскольку он будет использоваться в блоке loop():
  30.   pinMode(latchPin, OUTPUT);
  31.   Serial.begin(9600);
  32.  
  33.   // за слешами – двоичные значения чисел:
  34.   dataArray[0] = 0xFF; //0b11111111
  35.   dataArray[1] = 0xFE; //0b11111110
  36.   dataArray[2] = 0xFC; //0b11111100
  37.   dataArray[3] = 0xF8; //0b11111000
  38.   dataArray[4] = 0xF0; //0b11110000
  39.   dataArray[5] = 0xE0; //0b11100000
  40.   dataArray[6] = 0xC0; //0b11000000
  41.   dataArray[7] = 0x80; //0b10000000
  42.   dataArray[8] = 0x00; //0b00000000
  43.   dataArray[9] = 0xE0; //0b11100000
  44.  
  45.   // функция, мигающая всеми светодиодами;
  46.   // параметры – количество миганий и пауза между ними:
  47.   blinkAll_2Bytes(2,500);
  48. }
  49.  
  50. void loop() {
  51.  
  52.   for (int j = 0; j < 10; j++) {
  53.     // загружаем из массива паттерн мигания:
  54.     data = dataArray[j];
  55.     // задаем контакту latchPin значение LOW и оставляем так,
  56.     // пока все данные не будут переданы:
  57.     digitalWrite(latchPin, 0);
  58.     // перемещаем данные:
  59.     shiftOut(dataPin, clockPin, data);
  60.     // возвращаем latchPin значение HIGH, сообщая чипу,
  61.     // что ему больше не нужно прослушивать входящую информацию:
  62.     digitalWrite(latchPin, 1);
  63.     delay(300);
  64.   }
  65. }
  66.  
  67. // «сердце» программы;
  68. // эта функция передает 8 бит данных (первым идет самый старший бит);
  69. // передача осуществляется на возрастающем фронте тактового сигнала:
  70. void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
  71.  
  72.   // аналог блока setup(), но внутри функции:
  73.   int i=0;
  74.   int pinState;
  75.   pinMode(myClockPin, OUTPUT);
  76.   pinMode(myDataPin, OUTPUT);
  77.  
  78.   // стираем все, чтобы подготовить
  79.   // сдвиговый регистр к передаче битов:
  80.   digitalWrite(myDataPin, 0);
  81.   digitalWrite(myClockPin, 0);
  82.  
  83.   // выполняется для каждого бита в байте myDataOut;
  84.   // обратите внимание, что в цикле for() ниже
  85.   // СЧЕТ ИДЕТ В ОБРАТНОМ НАПРАВЛЕНИИ, и это значит, что значение
  86.   // «%00000001» или «1» будет соответствовать контакту Q0:
  87.   for (i=7; i>=0; i--)  {
  88.     digitalWrite(myClockPin, 0);
  89.  
  90.     // если значение было передано переменной myDataOut и проверка
  91.     // битовой маской прошла успешно... то есть если i=6
  92.     // и наше значение это «%11010100», код сравнит его с «%01000000»,
  93.     // а затем запишет в pinState значение «1»:
  94.     if ( myDataOut & (1<<i) ) {
  95.       pinState= 1;
  96.     }
  97.     else {  
  98.       pinState= 0;
  99.     }
  100.  
  101.     // задаем этому контакту HIGH или LOW в зависимости от pinState:
  102.     digitalWrite(myDataPin, pinState);
  103.     // если тактовый контакт получает значение HIGH,
  104.     // сдвиговый регистр перемещает биты:
  105.     digitalWrite(myClockPin, 1);
  106.     // после перемещения битов задаем контакту для данных
  107.     // значение «0», чтобы избежать «просачивания» данных:
  108.     digitalWrite(myDataPin, 0);
  109.   }
  110.  
  111.   // останавливаем перемещение битов:
  112.   digitalWrite(myClockPin, 0);
  113. }
  114.  
  115.  
  116. // эта функция мигает всеми светодиодами, подключенными к регистру;
  117. // переменная «n» – это то, сколько раз нужно мигнуть, а «d» – сколько
  118. // должна длиться пауза между миганиями; запускается с момента,
  119. // когда светодиоды не горят – чтобы визуальный эффект
  120. // от первого мигания был полным:
  121. void blinkAll_2Bytes(int n, int d) {
  122.   digitalWrite(latchPin, 0);
  123.   shiftOut(dataPin, clockPin, 0);
  124.   shiftOut(dataPin, clockPin, 0);
  125.   digitalWrite(latchPin, 1);
  126.   delay(200);
  127.   for (int x = 0; x < n; x++) {
  128.     digitalWrite(latchPin, 0);
  129.     shiftOut(dataPin, clockPin, 255);
  130.     shiftOut(dataPin, clockPin, 255);
  131.     digitalWrite(latchPin, 1);
  132.     delay(d);
  133.     digitalWrite(latchPin, 0);
  134.     shiftOut(dataPin, clockPin, 0);
  135.     shiftOut(dataPin, clockPin, 0);
  136.     digitalWrite(latchPin, 1);
  137.     delay(d);
  138.   }
  139. }

См.также

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

  1. www.arduino.cc - ShftOut13