| Ваш IP: 3.234.143.26 | Online(35) - гости: 19, боты: 16 | Загрузка сервера: 0.89 ::::::::::::

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

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

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

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

  • Домашняя метеостанция + будильник (Nokia 5110 LCD)(Arduino)

    Домашняя метеостанция + будильник (Nokia 5110 LCD)(Arduino)

    На странице https://rcl-radio.ru/?p=55605 рассматривался пример создания простой погодной метеостанции на основе датчиков давления, влажности и температуры с выводом информации на LCD экран Nokia 5110. На данной странице будет показан пример создания погодной станции с будильником, так как в погодной станции имеются часы реального времени, то добавить дополнительный функционал в виде будильника не …Подробнее...
  • Усилитель мощности 300W

    Усилитель мощности 300W

    Во многих случаях мы хотим усилитель выдавал мощность больше чем 100W который является усилителем — средней мощности. Если вы хотите, чтобы усилитель подходил по мощности для небольшой комнаты, небольшого клуба или открытого пространства, то данный усилитель это что вы именно искали. Он легок в повторении и не содержит дорогих и …Подробнее...
  • FM радиоприемник на TDA7021T

    На этой странице представлена схема FM приемника на микросхеме TDA7021T, радиоприемник выполнен в моно варианте, наушники подключаем к разъему К1. К2 — сканер поиска радиостанций. Элементная база R1 = 8kΩ2 R2 = 10kΩ R3 = 390Ω C1,C3 = 10nF C2,C6,C9,C16 = 100nF C4 = 33pF C5 = 25pF trimmer (Murata …Подробнее...
  • Простой кварцевый генератор

    Простой кварцевый генератор

    На рисунке показана схема простого кварцевого генератора на двух логических элементов «НЕ». Кварцевый генератор обеспечивает стабильную работу на частотах от 1 МГц до 10 МГц. Сопротивление резисторов может находится в пределах от 1 кОм до 4,7 кОм, но при этом они должны быть одного номинала. В кварцевом генераторе можно применить микросхему …Подробнее...
  • Низкочастотный частотомер

    Частотомер измеряет частоту до 1 МГц при амплитуде входного сигнала от 0,5 до 15В. Точность измерения для режима ГРУБО 10Гц, 0,05с и 0,2 с, режим точно 1 Гц, 0,5с, 2 с. Входной сигнал поступает на формирователь импульсов на компараторе А1(триггер Шмитта). ПОС его образована элементами R2 R4. Сформированные импульсы с …Подробнее...