| Ваш IP: 18.212.92.235 | Online(14) - гости: 6, боты: 8 | Загрузка сервера: 1.81 ::::::::::::

Модуль индикации на 74НС595 (Arduino)

Модуль индикации представляет собой 4-х разрядный 7-и сегментный дисплей на сдвиговых регистрах 74НС595.

Микросхема 74HC595 содержит 8 битный регистр хранения и 8 битный сдвиговый регистр. Данные последовательно передаются в сдвиговый регистр, затем фиксируются в регистре хранения. К регистру хранения подключены 8 выходных линий.

На основе двух микросхем 74HC595 образована динамическая индикация, первый сдвиговый регистр управляет разрядами, а второй сегментами. В данном варианте рассмотрен 4-х разрядный индикатор, но индикация на двух ИМС 74HC595 может достигать 8-и разрядов.

Модуль на сдвиговых регистрах содержит пять выводов:

  • DIO — пин данных
  • SCLK — пин тактирования
  • RCLK — пин «защелка»
  • GND — подключение к земле
  • VCC  — подключение питания +5 В

Скетч показанный ниже позволяет выводить значение переменной int k, значение которой увеличивается на единицу каждые 100 мс. Значение переменной может находится в пределах от 0 до 9999.

#include <MsTimer2.h>
 
byte razr[5] = {0x08, 0x04, 0x02, 0x01, 0x00};// 0123         
byte digit[12] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF}; // 0123456789
byte pointDigit = 0x80; //точка
int k;
byte a[4];
 
void setup(){
  MsTimer2::set(15, to_Timer);// задаем период 10...20 мс
  MsTimer2::start();// старт индикации
  pinMode(3, OUTPUT);  // RCLK
  pinMode(4, OUTPUT);  // SCLK
  pinMode(2, OUTPUT);  // DIO
}
 
void to_Timer(){
  a[0]=k/1000;
  a[1]=k/100%10;
  a[2]=k/10%10;
  a[3]=k%10%10;
  for(int i=0;i<5;i++){
  digitalWrite(3, LOW);
  shiftOut(2, 4, MSBFIRST, digit[a[i]]);
  shiftOut(2, 4, MSBFIRST, razr[i]);
  digitalWrite(3, HIGH);
  } 
}
 
void loop(){
k++;delay(100);
}

Следующий скетч позволяет выводить значение переменной float k которое может находиться в пределах от 0,001 до 9999. Значение переменной увеличивается на 0,001 каждые 10 мс.

#include <MsTimer2.h>
 
byte razr[5] = {0x08, 0x04, 0x02, 0x01, 0x00};// 0123         
byte digit[12] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF}; // 0123456789 
byte point = 0x80; //точка
float k=0.000;
int k1,t;
byte a[4];
 
void setup(){
  MsTimer2::set(15, to_Timer);// задаем период 10...20 мс
  MsTimer2::start();// старт индикации
  pinMode(3, OUTPUT);  // RCLK
  pinMode(4, OUTPUT);  // SCLK
  pinMode(2, OUTPUT);  // DIO
}
 
void to_Timer(){
  if(k<10){k1=round(k*1000);t=0;}
  else if(k<100){k1=round(k*100);t=1;}
  else if(k<1000){k1=round(k*10);t=2;}
  else {k1=k;t=4;}
  a[0]=k1/1000;
  a[1]=k1/100%10;
  a[2]=k1/10%10;
  a[3]=k1%10%10;
  for(int i=0;i<5;i++){
  digitalWrite(3, LOW);
  if(i==t){shiftOut(2, 4, MSBFIRST, digit[a[i]] ^ point);}
  else{shiftOut(2, 4, MSBFIRST, digit[a[i]]);}
  shiftOut(2, 4, MSBFIRST, razr[i]);
  digitalWrite(3, HIGH);
  } 
}
 
void loop(){
k+=0.001;delay(10);
}

Следующий скетч позволяет выводить значение переменной float k которое может находиться в пределах от ±0,01 до ±999. Значение переменной (по умолчанию float k = 999) уменьшается на 0,01 каждые 10 мс.

#include <MsTimer2.h>
 
byte razr[5] = {0x08, 0x04, 0x02, 0x01, 0x00};// 0123         
byte digit[12] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF, 0xBF}; // 0123456789 минус
byte point = 0x80; //точка
float k=999;
float k2;
int k1,t;
byte a[4];
 
void setup(){Serial.begin(9600);
  MsTimer2::set(15, to_Timer);// задаем период 10...20 мс
  MsTimer2::start();// старт индикации
  pinMode(3, OUTPUT);  // RCLK
  pinMode(4, OUTPUT);  // SCLK
  pinMode(2, OUTPUT);  // DIO
}
 
void to_Timer(){
  if(k<0){k2 = abs(k);a[0]=11;}else{k2=k;a[0]=10;}
  Serial.println(k2);
  if(k2<10){k1=round(k2*100);t=1;}
  else if(k2<100){k1=round(k2*10);t=2;}
  else {k1=k2;t=4;}
  a[1]=k1/100%10;
  a[2]=k1/10%10;
  a[3]=k1%10%10;
  for(int i=0;i<5;i++){
  digitalWrite(3, LOW);
  if(i==t){shiftOut(2, 4, MSBFIRST, digit[a[i]] ^ point);}
  else{shiftOut(2, 4, MSBFIRST, digit[a[i]]);}
  shiftOut(2, 4, MSBFIRST, razr[i]);
  digitalWrite(3, HIGH);
  } 
}

void loop(){
k-=0.1;delay(100);
}

Так же можно на индикаторе выводить не только цифры но и любые символы состоящие из семи сегментов:

.GFEDCBA = 0b1111111 — все сегменты включая точку отключены

.GFEDCBA = 0b00000000 — все сегменты включены включая точку

.GFEDCBA = 0b0111111 — горит точка

.GFEDCBA = 0b10111111 — горит минус, точка выключена

.GFEDCBA = 0b10000111 — горит t, точка выключена

Для удобства новые символы можно внести в массив:

byte digit[12] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF, 0xBF,}; // 0123456789 пусто минус

Использование в скетче:

if(k<0){k2 = abs(k);a[0]=11;}else{k2=k;a[0]=10;}

Например: если переменная k<0 , то есть отрицательное число, то выводить число 11 из массива 0xBF (минус), если положительное то число 10 0xFF (все сегменты погашены).

Если например нужно чтобы постоянно горел символ то можно использовать код:

добавим новый символ t в массив 0x87 или 0b10000111, а переменной k зададим значение например 23.2

byte digit[13] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF, 0xBF, 0x87}; // 0123456789 пусто минус символ:t

a[0]=12;

Будет всегда гореть символ t  .

Библиотека MsTimer2.h - MsTimer2.zip

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

Случайные статьи

  • Преобразователи напряжения

    В связи с выключением электроэнергии возникла необходимость в других источниках питания. Я некоторое время работал с различными схемами преобразователей с 12 В АКБ в ~220 В, 50 Гц на различную мощность нагрузки, поэтому возникла возможность питать как лампы (свет в квартире), так и различную аппаратуру. Выключал автоматические пробки на счетчике, …Подробнее...
  • КЛАССИФИКАЦИЯ РАДИОИЗМЕРИТЕЛЬНЫХ ПРИБОРОВ СОГЛАСНО ГОСТ 15094-69

    КЛАССИФИКАЦИЯ РАДИОИЗМЕРИТЕЛЬНЫХ ПРИБОРОВ СОГЛАСНО ГОСТ 15094-69 Радиоэлектронные измерительные приборы (РИП) классифицируются по различным признакам (см. табл.) Классификация электронных радиоизмерительных приборов Признак классификации Разновидности измерительных приборов Выполняемые метрологические функции Эталоны, образцовые приборы, рабочие приборы Характер измерений, вид измеряемых величин, основные выполняемые функции, совокупность технических характеристик и очередность разработки Подгруппы, виды, типы …Подробнее...
  • Онлайн — калькулятор цветовой маркировки резисторов

    Онлайн — калькулятор цветовой маркировки резисторов

    Для резисторов с точностью 20 % используют маркировку с тремя полосками, для резисторов с точностью 10 % и 5 % маркировку с четырьмя полосками, для более точных резисторов с пятью или шестью полосками. Первые две полоски всегда означают первые два знака номинала. Если полосок 3 или 4, третья полоска означает …Подробнее...
  • Излучение и распространение радиоволн

    Излучение и распространение радиоволн

    Как известно, постоянный ток, проходящий по проводу создает вокруг него постоянное магнитное поле. Когда ток исчезает, то созданное им магнитное поле исчезая возвращает энергию в провод. При переменном токе вокруг провода создается переменное магнитное поле, напряженность которого меняется с частотой тока. Часть энергии магнитного поля возвращается в провод, другая часть …Подробнее...
  • Полицейская сирена на LM324

    Полицейская сирена на LM324

    Данная схема издает звук напоминающий полицейскую сирену. Схема основана на ОУ LM324 представляющий собой генератор ЗЧ. При нажатии на кнопку SA1 начнет быстро заряжаться С1, сирена начнет издавать звук. При размыкании контактов SA1  сирена будет работать до тех пор пока не разрядится через R2 конденсатор С1. Источник — http://www.eleccircuit.com/police-bicycle-siren-circuits/ скраб для …Подробнее...