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

Arduino:Примеры/ShftIn21

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

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

Контакты:

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


Простой ввод данных от двух сдвиговых регистров[1]

Это скетч для платы Arduino и двух сдвиговых регистров CD4021B. Он считывает данные с переключателей, подключенных к сдвиговым регистрам, а затем выводит их на монитор порта.

Код

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

См.также

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

  1. www.arduino.cc - ShftIn21