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




