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

Arduino:Примеры/ShftIn13

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

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

Контакты:

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


Проверка разных комбинаций[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.     // таким образом, когда «n» равно «3», код сравнивает биты
  63.     // в switchVar1 и двоичное число «00001000», возвращая «true»
  64.     // лишь в том случае, если в этом бите (т.е. контакте)
  65.     // есть значение «1», присланное от сдвигового регистра:
  66.     if (switchVar1 & (1 << n) ){
  67.       // печатаем значение из этого места в массиве:
  68.       Serial.println(note2sing[n]);
  69.     }
  70.   }
  71.  
  72. // далее изучаем весь байт и создаем комбинации настроек;
  73.  
  74. // эти настройки (читай, разные ситуации) создаются при помощи
  75. // оператора switch, которому «скармливается» переменная switchVar1;
  76. // далее switchVar1 сравнивается с несколькими заданными
  77. // числовыми значениями:
  78.  
  79.   switch (switchVar1) {
  80.   case B00101010:
  81.     Serial.println("D minor");  //  "Ре минор"
  82.     break;
  83.   case B00010101:
  84.     Serial.println("C major");  //  "До мажор"
  85.     break;
  86.   case B01010100:
  87.     Serial.println("E minor");  //  "Ми минор"
  88.     break;
  89.   case B00101001:
  90.     Serial.println("F major");  //  "Фа мажор"
  91.     break;    
  92.   case B01010010:  
  93.     Serial.println("G major");  //  "Соль мажор"
  94.     break;        
  95.   case B00100101:
  96.     Serial.println("A minor");  //  "Ля минор"
  97.     break;    
  98.   case B01001010:
  99.     Serial.println("B diminished");  //  "Си (полтона)"
  100.     break;    
  101.   default:
  102.     // если ничего не подходит, пишем следующее:
  103.     Serial.println("Play It, Joe");  //  "Сыграй-ка сам, Василий!"
  104.   }
  105.  
  106. // пустое место:
  107. Serial.println("-------------------");
  108. // вставляем задержку, чтобы все как следует допечаталось:
  109. delay(500);
  110.  
  111. }
  112.  
  113. //-----------------------------------------------конец главного цикла
  114.  
  115. ////////// ----------------------------------- функция shiftIn()
  116. ///// в качестве аргументов ей требуются лишь контакт для данных
  117. ///// и контакт-защелка; возвращает байт, у которого каждый бит
  118. ///// соответствует какому-либо контакту сдвигового регистра:
  119. ///// 7-ой бит – это 7-ой контакт, 0-ой бит – это 0-ой контакт
  120.  
  121. byte shiftIn(int myDataPin, int myClockPin) {
  122.   int i;
  123.   int temp = 0;
  124.   int pinState;
  125.   byte myDataIn = 0;
  126.  
  127.   pinMode(myClockPin, OUTPUT);
  128.   pinMode(myDataPin, INPUT);
  129.  
  130. // 8 раз подаем на тактовый контакт значение HIGH (0,..,7),
  131. // т.е. при каждом прохождении цикла for();
  132.  
  133. // в начале каждого цикла мы задаем тактовому контакту значение LOW;
  134. // это нужно для последующего перехода из LOW в HIGH, чтобы сдвиговый
  135. // регистр поменял состояние на основе значения в следующем бите
  136. // последовательного потока данных;
  137.  
  138. // регистр передает информацию о контактах в порядке с 7-го по 0-ой,
  139. // поэтому наша функция ведет отсчет в обратном порядке:
  140.  
  141.   for (i=7; i>=0; i--)
  142.   {
  143.     digitalWrite(myClockPin, 0);
  144.     delayMicroseconds(0.2);
  145.     temp = digitalRead(myDataPin);
  146.     if (temp) {
  147.       pinState = 1;
  148.       // несмотря ни на что, задаем биту значение «0»:
  149.       myDataIn = myDataIn | (1 << i);
  150.     }
  151.     else {
  152.       pinState = 0;
  153.     }
  154.  
  155.     // печатаем отладочную информацию (если отладка не нужна,
  156.     // оставьте эти строчки закоментированными):
  157.     //Serial.print(pinState);
  158.     //Serial.print("     ");
  159.     //Serial.println (dataIn, BIN);
  160.  
  161.     digitalWrite(myClockPin, 1);
  162.  
  163.   }
  164.   // печатаем пустое место, разделяющее проверочные данные:
  165.   //Serial.println();
  166.   //Serial.println(myDataIn, BIN);
  167.   return myDataIn;
  168. }

См.также

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

  1. www.arduino.cc - ShftIn13