Arduino:Примеры/ShftIn12
Перейти к навигации
Перейти к поиску
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.
Какая кнопка нажата?[1]
Это скетч для платы Arduino и одного сдвигового регистра CD4021B. Он считывает данные с переключателей, подключенных к сдвиговому регистру, тем самым определяя, какая кнопка находится в положении «вкл».
Код
1 //**************************************************************//
2 // Название : Какая кнопка нажата ? //
3 // Автор : Кэрлин Мо //
4 // Дата : 25 января 2007 года //
5 // Версия : 1.0 //
6 // Примечания : Скетч для использования со сдвиговым //
7 // : регистром CD4021B //
8 //**************************************************************//
9
10 // задаем номера для интерфейсных контактов:
11 int latchPin = 8;
12 int dataPin = 9;
13 int clockPin = 7;
14
15 // задаем переменные, которые будут хранить данные для
16 // сдвигового регистра; в целях отладки лучше начать
17 // со значений без «0»:
18 byte switchVar1 = 72; // 01001000
19
20 // задаем массив со значениями для каждого контакта на регистре:
21 char note2sing[] = {
22 'C', 'd', 'e', 'f', 'g', 'a', 'b', 'c'};
23
24
25 void setup() {
26 // запускаем последовательную коммуникацию:
27 Serial.begin(9600);
28
29 // задаем режимы для контактов:
30 pinMode(latchPin, OUTPUT);
31 pinMode(clockPin, OUTPUT);
32 pinMode(dataPin, INPUT);
33
34 }
35
36 void loop() {
37
38 // подаем импульс на контакт-защелку;
39 // чтобы собрать параллельные данные, задаем ему значение «1»:
40 digitalWrite(latchPin,1);
41 // ждем:
42 delayMicroseconds(20);
43 // задаем ему «0», чтобы передать последовательные данные:
44 digitalWrite(latchPin,0);
45
46 // пока сдвиговый регистр переключен в последовательный режим,
47 // собираем все его данные в байт; сначала это делает регистр,
48 // подключенный к чипу:
49 switchVar1 = shiftIn(dataPin, clockPin);
50
51 // показываем результат; если первый контакт получит значение HIGH,
52 // то «0», стоящий в старшей части байта (7, 6, 5 и т.д.),
53 // будет удален:
54 Serial.println(switchVar1, BIN);
55
56
57 // этот цикл loop() бит за битом прочесывает байт,
58 // содержащий данные сдвигового регистра; при значении HIGH (1)
59 // он печатает соответствующее место в массиве:
60 for (int n=0; n<=7; n++)
61 {
62
63 // таким образом, когда «n» равно «3», код сравнивает биты
64 // в switchVar1 и двоичное число «00001000», возвращая «true»
65 // лишь в том случае, если в этом бите (т.е. контакте)
66 // есть значение «1», присланное от сдвигового регистра:
67 if (switchVar1 & (1 << n) ){
68 // печатаем значение из этого места в массиве:
69 Serial.println(note2sing[n]);
70 }
71 }
72
73 // пустое место:
74 Serial.println("-------------------");
75 // вставляем задержку, чтобы все как следует допечаталось:
76 delay(500);
77
78 }
79
80 //-----------------------------------------------конец главного цикла
81
82 ////////// ----------------------------------- функция shiftIn()
83 ///// в качестве аргументов ей требуются лишь контакт для данных
84 ///// и контакт-защелка; возвращает байт, у которого каждый бит
85 ///// соответствует какому-либо контакту сдвигового регистра:
86 ///// 7-ой бит – это 7-ой контакт, 0-ой бит – это 0-ой контакт
87
88 byte shiftIn(int myDataPin, int myClockPin) {
89 int i;
90 int temp = 0;
91 int pinState;
92 byte myDataIn = 0;
93
94 pinMode(myClockPin, OUTPUT);
95 pinMode(myDataPin, INPUT);
96
97 // 8 раз подаем на тактовый контакт значение HIGH (0,..,7),
98 // т.е. при каждом прохождении цикла for();
99
100 // в начале каждого цикла мы задаем тактовому контакту значение LOW;
101 // это нужно для последующего перехода из LOW в HIGH, чтобы сдвиговый
102 // регистр поменял состояние на основе значения в следующем бите
103 // последовательного потока данных;
104
105 // регистр передает информацию о контактах в порядке с 7-го по 0-ой,
106 // поэтому наша функция ведет отсчет в обратном порядке:
107
108 for (i=7; i>=0; i--)
109 {
110 digitalWrite(myClockPin, 0);
111 delayMicroseconds(0.2);
112 temp = digitalRead(myDataPin);
113 if (temp) {
114 pinState = 1;
115 // несмотря ни на что, задаем биту значение «0»:
116 myDataIn = myDataIn | (1 << i);
117 }
118 else {
119 pinState = 0;
120 }
121
122 // печатаем отладочную информацию (если отладка не нужна,
123 // оставьте эти строчки закоментированными):
124 //Serial.print(pinState);
125 //Serial.print(" ");
126 //Serial.println (dataIn, BIN);
127
128 digitalWrite(myClockPin, 1);
129
130 }
131 // печатаем пустое место, разделяющее проверочные данные:
132 //Serial.println();
133 //Serial.println(myDataIn, BIN);
134 return myDataIn;
135 }
См.также
Внешние ссылки