Arduino:Примеры/ShftOut22
Перейти к навигации
Перейти к поиску
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин (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 }
См.также
Внешние ссылки