Arduino:Примеры/ShftIn12

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

Перевод: Максим Кузьмин (Cubewriter) Перевел 364226 статей для сайта.</br>Контакты:</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 }

См.также

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