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

Arduino:Примеры/ShftIn11

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

Перевод: Максим Кузьмин (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. void setup() {
  21.   // запускаем последовательную коммуникацию:
  22.   Serial.begin(9600);
  23.  
  24.   // задаем режимы для интерфейсных контактов:
  25.   pinMode(latchPin, OUTPUT);
  26.   pinMode(clockPin, OUTPUT);
  27.   pinMode(dataPin, INPUT);
  28.  
  29. }
  30.  
  31. void loop() {
  32.  
  33.   // подаем импульс на контакт-защелку;
  34.   // чтобы собрать параллельные данные, задаем ему значение «1»:
  35.   digitalWrite(latchPin,1);
  36.   // ждем:
  37.   delayMicroseconds(20);
  38.   // задаем ему «0», чтобы передать последовательные данные:
  39.   digitalWrite(latchPin,0);
  40.  
  41.   // пока сдвиговый регистр переключен в последовательный режим,
  42.   // собираем все его данные в байт; сначала это делает регистр,
  43.   // подключенный к чипу:
  44.   switchVar1 = shiftIn(dataPin, clockPin);
  45.  
  46.   // показываем результат; если первый контакт получит значение HIGH,
  47.   // то «0», стоящий в старшей части байта (7, 6, 5 и т.д.),
  48.   // будет удален:
  49.   Serial.println(switchVar1, BIN);
  50.  
  51. // пустое место:
  52. Serial.println("-------------------");
  53. // вставляем задержку, чтобы все как следует допечаталось:
  54. delay(500);
  55.  
  56. }
  57.  
  58. //-----------------------------------------------конец главного цикла
  59.  
  60. ////////// ----------------------------------- функция shiftIn()
  61. ///// в качестве аргументов ей требуются лишь контакт для данных
  62. ///// и контакт-защелка; возвращает байт, у которого каждый бит
  63. ///// соответствует какому-либо контакту сдвигового регистра:
  64. ///// 7-ой бит – это 7-ой контакт, 0-ой бит – это 0-ой контакт
  65.  
  66. byte shiftIn(int myDataPin, int myClockPin) {
  67.   int i;
  68.   int temp = 0;
  69.   int pinState;
  70.   byte myDataIn = 0;
  71.  
  72.   pinMode(myClockPin, OUTPUT);
  73.   pinMode(myDataPin, INPUT);
  74.  
  75. // 8 раз подаем на тактовый контакт значение HIGH (0,..,7),
  76. // т.е. при каждом прохождении цикла for();
  77.  
  78. // в начале каждого цикла задаем тактовому контакту значение LOW;
  79. // это нужно для последующего перехода из LOW в HIGH, чтобы сдвиговый
  80. // регистр поменял состояние на основе значения в следующем бите
  81. // последовательного потока данных;
  82.  
  83. // регистр передает информацию о контактах в порядке с 7-го по 0-ой,
  84. // поэтому наша функция ведет отсчет в обратном порядке:
  85.  
  86.   for (i=7; i>=0; i--)
  87.   {
  88.     digitalWrite(myClockPin, 0);
  89.     delayMicroseconds(0.2);
  90.     temp = digitalRead(myDataPin);
  91.     if (temp) {
  92.       pinState = 1;
  93.       // несмотря ни на что, задаем биту значение «0»:
  94.       myDataIn = myDataIn | (1 << i);
  95.     }
  96.     else {
  97.       pinState = 0;
  98.     }
  99.  
  100.     // печатаем отладочную информацию (если отладка не нужна,
  101.     // оставьте эти строчки закоментированными):
  102.     //Serial.print(pinState);
  103.     //Serial.print("     ");
  104.     //Serial.println (dataIn, BIN);
  105.  
  106.     digitalWrite(myClockPin, 1);
  107.  
  108.   }
  109.   // печатаем пустое место, разделяющее проверочные данные:
  110.   //Serial.println();
  111.   //Serial.println(myDataIn, BIN);
  112.   return myDataIn;
  113. }

См.также

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

  1. www.arduino.cc - ShftIn11