Сдвиговые регистры 74hc595 и ARDUINO, множим выходы.

Собирая часы на газоразрядных индикаторах я столкнулся с нехваткой портов на 328 Atmega. Решил выйти из положения с помощью сдвиговых регистров  74hc595

Выводы микросхемы имеют следующее назначение:

Пины 1-7, 15     Q0 » Q7     Параллельные выходы
Пин 8     GND     Земля
Пин 9     Q7″     Выход для последовательного соединения регистров
Пин 10     MR     Сброс значений регистра. Сброс происходит при получение LOW
Пин 11     SH_CP     Вход для тактовых импульсов
Пин 12     ST_CP     Синронизация («защелкивание») выходов
Пин 13     OE     Вход для переключения состояния выходов из высокоомного в рабочее
Пин 14     DS     Вход для последовательных данных
Пин 16     Vcc     Питание

Схема подключения для одного регистра такая:

  • DS (пин 14) с 11-ым цифровой выход Arduino (на схеме синий провод)
  • SH_CP (пин 11) с 12-ым цифровым выходом (желтый провод)
  • ST_CP (пин 12) c 8-ым (зеленый провод)

//**************************************************************//
//  Name    : shiftOutCode, Hello World                               
//  Author  : Carlyn Maw,Tom Igoe, David A. Mellis
//  Date    : 25 Oct, 2006   
//  Modified: 23 Mar 2010                                
//  Version : 2.0                                            
//  Notes   : Программа использует один сдвиговый регистр 74HC595
//          : для вывода значений от 0 до 255                           
//****************************************************************
 
//Пин подключен к ST_CP входу 74HC595
int latchPin = 8;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 12;
//Пин подключен к DS входу 74HC595
int dataPin = 11;
 
 
 
void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
 
void loop() {
  // отсчитываем от 0 до 255  и отображаем значение на светодиоде
  for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
    // устанавливаем синхронизацию "защелки" на LOW
    digitalWrite(latchPin, LOW);
    // передаем последовательно на dataPin
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay); 
 
    //"защелкиваем" регистр, тем самым устанавливая значения на выходах
    digitalWrite(latchPin, HIGH);
    // пауза перед следующей итерацией
    delay(500);
  }
}

 

И того мы получим из трех ножек восемь, но этого мало! Подключим два регистра и сделаем независимое управление!

 

  • DS (пин 14) с 11-ым цифровой выход Arduino
  • SH_CP (пин 11) с 12-ым цифровым выходом

Эти линии общие, а вот линии ST_CP разные для каждого регистра.

byte Reg1[8]; // массив для каждого регистра
byte Reg2[8];

byte num1[8] ={0,0,0,0,1,1,1,1}; //массивы которые поместим в регистры, 
                                 //каждый элемент отвечает за один порт регистра
byte num2[8] ={1,0,0,0,1,0,0,0};
//Пины подключены к ST_CP входу 74HC595
int latchPin = 5; // для одного регистра
int latchPin2 = 6;  // для другого регистра
//Пин подключен к SH_CP входу 74HC595
int clockPin = 3;
//Пин подключен к DS входу 74HC595
int dataPin = 4;



void setup() {
  // put your setup code here, to run once:

   pinMode(latchPin, OUTPUT);
   pinMode(latchPin2, OUTPUT);
   pinMode(dataPin, OUTPUT); 
   pinMode(clockPin, OUTPUT);
 
}
//процедура записи в регистр 1
 void REGIDSTRI()
 {
 byte bitsToSend = Reg1[0]*1<<0 | Reg1[1]*1<<1 | Reg1[2]*1<<2 | Reg1[3]*1<<3 | Reg1[4]*1<<4 | Reg1[5]*1<<5 | Reg1[6]*1<<6 | Reg1[7]*1<<7 ;
//Отключаем вывод на регистре
   digitalWrite(latchPin, LOW);
 
  // проталкиваем байт в регистр
  shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);
 
    // "защелкиваем" регистр, чтобы байт появился на его выходах
  digitalWrite(latchPin, HIGH);
 }
//процедура записи в регистр 2
  void REGIDSTRI2()
 {
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////
 byte bitsToSend = Reg2[0]*1<<0 | Reg2[1]*1<<1 | Reg2[2]*1<<2 | Reg2[3]*1<<3 | Reg2[0]*1<<4 | Reg2[5]*1<<5 | Reg2[6]*1<<6 | Reg2[7]*1<<7 ;
//Отключаем вывод на регистре
   digitalWrite(latchPin2, LOW);
 
  // проталкиваем байт в регистр
  shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);
 
    // "защелкиваем" регистр, чтобы байт появился на его выходах
  digitalWrite(latchPin2, HIGH);

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
 }

void loop() {
     memcpy( Reg1,num1,8);  // помещаем значение массива num1 в массив Reg1
     memcpy( Reg2,num2,8);  // помещаем значение массива num2 в массив Reg2

   REGIDSTRI (); //записываем массив Reg1 в первый регистр
   REGIDSTRI2 ();//записываем массив Reg2 во второй регистр
   delay(1000);
}

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *