| Ваш IP: 3.235.75.174 | Online(30) - гости: 21, боты: 9 | Загрузка сервера: 0.64 ::::::::::::

Модуль индикации на 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

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

Войти с помощью: 

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

  • Реле времени с тиристорным управлением

    Реле времени на включение или выключение сетевой нагрузки можно собрать и на тиристоре. Такое устройство имеет большую надежность и долговечность. Принципиальная схема универсального реле времени с бесконтактным выключением нагрузки показана на рисунке. Максимальная выдержка времени на включение или выключение 30 мин. Потребляемая мощность не превышает 0,3 Вт. Если реле времени …Подробнее...
  • Трехполосные разделительные фильтры

    Принципиальная схема разделительного фильтра показана на рисунке. Частоты разделения составляют 750Гц между НЧ и СЧ и 7 кГц между СЧ и ВЧ. Крутизна спадов АЧХ за пределами полос -12дБ\окт. Ниже приведена таблица которая позволяет использовать при конструировании трех полосного фильтра разные по сопротивлению звуковых катушек НЧ, СЧ и ВЧ головок. …Подробнее...
  • Генераторы импульсов на микросхемах К176ИЕ5, К176ИЕ12, К176ИЕ18

    На рис. приведена принципиальная схема генератора секундных импульсов на микросхеме К176ИЕ5. Здесь и в других схемах на этом рисунке численные данные приведены для варианта применения стандартного кварцевого резонатора на частоту 32 768 Гц. Микросхемы допускают также использование кварцевого резонатора на частоту 16 384 Гц. Тогда секундные импульсы выделяются на выходе …Подробнее...
  • Простой терморегулятор

    Нередко для регулирования температуры не подходят схемы, работающие от электросети, либо по условиям безопасности, либо потому что напряжение сети отключают. Схема (рис.1) предназначена для поддержания температуры внутри инкубатора, а также температуры сбраживания йогурта и более низких температур для хранения овощей в ящике на балконе зимой. Питание схема получает от 12-вольтового …Подробнее...
  • Таймер 5 минут

    На рисунке показана схема простого 5-и минутного таймера, который управляет нагрузкой посредством 12В реле. Нагрузкой может быть например лампы освещения подъезда (как накаливания, так и люминесцентные). А вместо SA1 может быть геркон установленный на входную дверь, при активации геркона происходит включение освещения примерно на 5-10 минут. Время работы таймера зависит …Подробнее...