Собирая часы на газоразрядных индикаторах я столкнулся с нехваткой портов на 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); }