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

Arduino:Примеры/ShftIn12

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

Перевод: Максим Кузьмин (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.    
  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. }

См.также

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

  1. www.arduino.cc - ShftIn12