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

Arduino:Примеры/ShftOut23

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

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

Контакты:

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


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

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

Код

  1. //**************************************************************//
  2. //  Название    : Использование двух массивов                   //
  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 dataRED;
  20. byte dataGREEN;
  21. byte dataArrayRED[10];
  22. byte dataArrayGREEN[10];
  23.  
  24. void setup() {
  25.   // выставляем latchPin в режим OUTPUT,
  26.   // поскольку он будет использоваться в блоке loop():
  27.   pinMode(latchPin, OUTPUT);
  28.   Serial.begin(9600);
  29.  
  30.   // Arduino не умеет записывать данные двоичного формата прямо в код,
  31.   // поэтому они представлены здесь в шестнадцатеричном виде
  32.   // (но подойдет и десятичный формат):
  33.   dataArrayRED[0] = 0xFF; //11111111
  34.   dataArrayRED[1] = 0xFE; //11111110
  35.   dataArrayRED[2] = 0xFC; //11111100
  36.   dataArrayRED[3] = 0xF8; //11111000
  37.   dataArrayRED[4] = 0xF0; //11110000
  38.   dataArrayRED[5] = 0xE0; //11100000
  39.   dataArrayRED[6] = 0xC0; //11000000
  40.   dataArrayRED[7] = 0x80; //10000000
  41.   dataArrayRED[8] = 0x00; //00000000
  42.   dataArrayRED[9] = 0xE0; //11100000
  43.  
  44.   // Arduino не умеет записывать данные двоичного формата прямо в код,
  45.   // поэтому они представлены здесь в шестнадцатеричном виде
  46.   // (но подойдет и десятичный формат):
  47.   dataArrayGREEN[0] = 0xFF; //11111111
  48.   dataArrayGREEN[1] = 0x7F; //01111111
  49.   dataArrayGREEN[2] = 0x3F; //00111111
  50.   dataArrayGREEN[3] = 0x1F; //00011111
  51.   dataArrayGREEN[4] = 0x0F; //00001111
  52.   dataArrayGREEN[5] = 0x07; //00000111
  53.   dataArrayGREEN[6] = 0x03; //00000011
  54.   dataArrayGREEN[7] = 0x01; //00000001
  55.   dataArrayGREEN[8] = 0x00; //00000000
  56.   dataArrayGREEN[9] = 0x07; //00000111
  57.  
  58.   // функция, мигающая всеми светодиодами;
  59.   // параметры – количество миганий и пауза между ними:
  60.   blinkAll_2Bytes(2,500);
  61. }
  62.  
  63. void loop() {
  64.  
  65.  
  66.   for (int j = 0; j < 10; j++) {
  67.     // загружаем из массива паттерн мигания:
  68.     dataRED = dataArrayRED[j];
  69.     dataGREEN = dataArrayGREEN[j];
  70.     // задаем контакту latchPin значение LOW и оставляем так,
  71.     // пока все данные не будут переданы:
  72.     digitalWrite(latchPin, 0);
  73.     // перемещаем данные:
  74.     shiftOut(dataPin, clockPin, dataGREEN);  
  75.     shiftOut(dataPin, clockPin, dataRED);
  76.     // возвращаем latchPin значение HIGH, сообщая чипу,
  77.     // что ему больше не нужно прослушивать входящую информацию:
  78.     digitalWrite(latchPin, 1);
  79.     delay(300);
  80.   }
  81. }
  82.  
  83.  
  84.  
  85. // сердце» программы;
  86. // эта функция передает 8 бит данных (первым идет самый старший бит);
  87. // передача осуществляется на возрастающем фронте тактового сигнала:
  88. void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
  89.  
  90.   // аналог блока setup(), но внутри функции:
  91.   int i=0;
  92.   int pinState;
  93.   pinMode(myClockPin, OUTPUT);
  94.   pinMode(myDataPin, OUTPUT);
  95.  
  96.   // стираем все, чтобы подготовить
  97.   // сдвиговый регистр к передаче битов:
  98.   digitalWrite(myDataPin, 0);
  99.   digitalWrite(myClockPin, 0);
  100.  
  101.   // выполняется для каждого бита в байте myDataOut;
  102.   // обратите внимание, что в цикле for() ниже
  103.   // СЧЕТ ИДЕТ В ОБРАТНОМ НАПРАВЛЕНИИ, и это значит, что значение
  104.   // «%00000001» или «1» будет соответствовать контакту Q0:
  105.   for (i=7; i>=0; i--)  {
  106.     digitalWrite(myClockPin, 0);
  107.  
  108.     // если значение было передано переменной myDataOut и проверка
  109.     // битовой маской прошла успешно... то есть если i=6
  110.     // и наше значение это «%11010100», код сравнит его с «%01000000»,
  111.     // а затем запишет в pinState значение «1»:
  112.     if ( myDataOut & (1<<i) ) {
  113.       pinState= 1;
  114.     }
  115.     else {     
  116.       pinState= 0;
  117.     }
  118.  
  119.     // задаем этому контакту HIGH или LOW в зависимости от pinState:
  120.     digitalWrite(myDataPin, pinState);
  121.     // если тактовый контакт получает значение HIGH,
  122.     // сдвиговый регистр перемещает биты:
  123.     digitalWrite(myClockPin, 1);
  124.     // после перемещения битов задаем контакту для данных
  125.     // значение «0», чтобы избежать «просачивания» данных:
  126.     digitalWrite(myDataPin, 0);
  127.   }
  128.  
  129.   // останавливаем перемещение битов:
  130.   digitalWrite(myClockPin, 0);
  131. }
  132.  
  133.  
  134. // эта функция мигает всеми светодиодами, подключенными к регистру;
  135. // переменная «n» – это то, сколько раз нужно мигнуть, а «d» – сколько
  136. // должна длиться пауза между миганиями; запускается с момента,
  137. // когда светодиоды не горят – чтобы визуальный эффект
  138. // от первого мигания был полным:
  139. void blinkAll_2Bytes(int n, int d) {
  140.   digitalWrite(latchPin, 0);
  141.   shiftOut(dataPin, clockPin, 0);
  142.   shiftOut(dataPin, clockPin, 0);
  143.   digitalWrite(latchPin, 1);
  144.   delay(200);
  145.   for (int x = 0; x < n; x++) {
  146.     digitalWrite(latchPin, 0);
  147.     shiftOut(dataPin, clockPin, 255);
  148.     shiftOut(dataPin, clockPin, 255);
  149.     digitalWrite(latchPin, 1);
  150.     delay(d);
  151.     digitalWrite(latchPin, 0);
  152.     shiftOut(dataPin, clockPin, 0);
  153.     shiftOut(dataPin, clockPin, 0);
  154.     digitalWrite(latchPin, 1);
  155.     delay(d);
  156.   }
  157. }

См.также

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

  1. www.arduino.cc - ShftOut23