Arduino:Примеры/ShftIn11

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

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

См.также

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