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

Arduino:Примеры/ShftIn14

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

Перевод: Максим Кузьмин (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. byte lowcBitNum = 7;
  21. byte dBitNum = 6;
  22. byte eBitNum = 5;
  23. byte fBitNum = 4;
  24. byte gBitNum = 3;
  25. byte aBitNum = 2;
  26. byte bBitNum = 1;
  27. byte highcNum = 0;
  28.  
  29. boolean dBit;
  30.  
  31.  
  32. void setup() {
  33.   // запускаем последовательную коммуникацию:
  34.   Serial.begin(9600);
  35.  
  36.   // задаем режимы для контактов:
  37.   pinMode(latchPin, OUTPUT);
  38.   pinMode(clockPin, OUTPUT);
  39.   pinMode(dataPin, INPUT);
  40.  
  41. }
  42.  
  43. void loop() {
  44.  
  45.   // подаем импульс на контакт-защелку;
  46.   // чтобы собрать параллельные данные, задаем ему значение «1»:
  47.   digitalWrite(latchPin,1);
  48.   // ждем:
  49.   delayMicroseconds(20);
  50.   // задаем ему «0», чтобы передать последовательные данные:
  51.   digitalWrite(latchPin,0);
  52.  
  53.   // пока сдвиговый регистр переключен в последовательный режим,
  54.   // собираем все его данные в байт; сначала это делает регистр,
  55.   // подключенный к чипу:
  56.   switchVar1 = shiftIn(dataPin, clockPin);
  57.  
  58.   // показываем результат; если первый контакт получит значение HIGH,
  59.   // то «0», стоящий в старшей части байта (7, 6, 5 и т.д.),
  60.   // будет удален:
  61.   Serial.println(switchVar1, BIN);
  62.  
  63. // вы можете узнать состояние бита при помощи функции ниже, либо...
  64.  
  65. // задаем переменную типа boolean:
  66. dBit = getBit(switchVar1, dBitNum);
  67.  
  68.   if (dBit) {
  69.     Serial.println("D");
  70.   }
  71.  
  72. // проверяем правильность функции (новой переменной не требуется):
  73.  if (getBit(switchVar1, aBitNum)) {
  74.     Serial.println("A");
  75.   }
  76.  
  77. // пустое место:
  78. Serial.println("-------------------");
  79. // вставляем задержку, чтобы все как следует допечаталось:
  80. delay(500);
  81.  
  82. }
  83.  
  84. //-----------------------------------------------конец главного цикла
  85.  
  86. ////////// ----------------------------------- функция shiftIn()
  87. ///// в качестве аргументов ей требуются лишь контакт для данных
  88. ///// и контакт-защелка; возвращает байт, у которого каждый бит
  89. ///// соответствует какому-либо контакту сдвигового регистра:
  90. ///// 7-ой бит – это 7-ой контакт, 0-ой бит – это 0-ой контакт
  91.  
  92. byte shiftIn(int myDataPin, int myClockPin) {
  93.  
  94. // аналог блока setup() внутри функции:
  95.   int i;
  96.   int temp = 0;
  97.   int pinState;
  98.   byte myDataIn = 0;
  99.  
  100.   pinMode(myClockPin, OUTPUT);
  101.   pinMode(myDataPin, INPUT);
  102.  
  103. //8 раз подаем на тактовый контакт значение HIGH (0,..,7),
  104. // т.е. при каждом прохождении цикла for();
  105.  
  106. // в начале каждого цикла мы задаем тактовому контакту значение LOW;
  107. // это нужно для последующего перехода из LOW в HIGH, чтобы сдвиговый
  108. // регистр поменял состояние на основе значения в следующем бите
  109. // последовательного потока данных;
  110.  
  111. // регистр передает информацию о контактах в порядке с 7-го по 0-ой,
  112. // поэтому наша функция ведет отсчет в обратном порядке:
  113.  
  114.   for (i=7; i>=0; i--)
  115.   {
  116.     digitalWrite(myClockPin, 0);
  117.     delayMicroseconds(0.2);
  118.     temp = digitalRead(myDataPin);
  119.     if (temp) {
  120.       pinState = 1;
  121.       // несмотря ни на что, задаем биту значение «0»:
  122.       myDataIn = myDataIn | (1 << i);
  123.     }
  124.     else {
  125.       pinState = 0;
  126.     }
  127.  
  128.     // печатаем отладочную информацию (если отладка не нужна,
  129.     // оставьте эти строчки закоментированными):
  130.     //Serial.print(pinState);
  131.     //Serial.print("     ");
  132.     //Serial.println (dataIn, BIN);
  133.  
  134.     digitalWrite(myClockPin, 1);
  135.  
  136.   }
  137.   // печатаем пустое место, разделяющее проверочные данные:
  138.   //Serial.println();
  139.   //Serial.println(myDataIn, BIN);
  140.   return myDataIn;
  141. }
  142.  
  143. ////// ---------------------------------------- функция getBit()
  144. boolean getBit(byte myVarIn, byte whatBit) {
  145.   boolean bitState;
  146.   bitState = myVarIn & (1 << whatBit);
  147.   return bitState;
  148. }
  149.  
  150.  
  151. ////// маленькая дополнительная функция...
  152. ////// ---------------------------------------- функция setBit()
  153. byte setBit(byte myVarIn, byte whatBit, boolean s) {
  154.   boolean bitState;
  155.   if (s) {
  156.     myVarIn = myVarIn | (1 << whatBit);
  157.   } else {
  158.     myVarIn = myVarIn & ~(1 << whatBit);
  159.   }
  160.   return myVarIn;
  161. }

См.также

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

  1. www.arduino.cc - ShftIn14