Arduino:Примеры/ShftOut22

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Поочередное зажигание 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 }

См.также

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