| Ваш IP: 34.228.42.25 | Online(50) - гости: 19, боты: 31 | Загрузка сервера: 2.08 ::::::::::::

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

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

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

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

  • Источник опорного напряжения

    Источник опорного напряжения

    На рисунке показана схема источника опорного напряжение, который может работать от двух батареек AA в течении 18 месяцев. Дрейф напряжения не более 5,5 мкВ  / ° С. Выходное напряжение источника 1,23 В при 25 ° C. Регулировка выхода опорного напряжения не более чем на 120мВ.Подробнее...
  • BA5417 стерео-усилитель 2*5Вт

    BA5417 стерео-усилитель 2*5Вт

    Усилитель на базе ВА5417 имеет выходную мощность 5 Вт на канал при 4 ом нагрузке, питание 12В (от 6 до 15В) постоянного напряжения. Усилитель на BA5417 имеет отличное качество звука и низкий коэффициент нелинейных искажений, не более 0,1% на частоте 1 кГц при Рвых=0, 5Вт. SA1 — включение режима ОЖИДАНИЕ …Подробнее...
  • Термометр на PIC16F628A (-55…+125 гр. Цельсия)

    Термометр на PIC16F628A (-55…+125 гр. Цельсия)

    На рисунке показана схема термометра выполненного на основе микроконтроллера PIC16F628A, в качестве датчика используется цифровой датчик температуры DS18B20. Индикатор термометра состоит из 4-х разрадного семисегментного индикатора. Диапазон измеряемой температуры от -55 до + 125 градусов Цельсия. Температура считывается каждые 15 секунд, время считывания можно изменить в коде.   Напряжение питания термометра 5В, …Подробнее...
  • Высокоточный стабилизатор

    Высокоточный стабилизатор

    Можно добиться суммарной нестабильности вызванной изменением нагрузки, входного напряжения и температуры менее 0,01% применив схему показанную на рисунке. R4 определяет ток через стабилитрон, ток стабилитрона определяет температурный дрейф. R2 и R3 высокоточные резисторы. Литература — Джеймс Уитсон — 500 практических схем на ИСПодробнее...
  • Медный обмоточный провод

    В табл. представлены обмоточные провода ПЭВ-1 ПЭВ-2, они одножильные с винифлексовой изоляцией(лак). ПЭВ- 1-однослойная изоляция 2-двухслойная. Провода рассчитаны на работу при температуре от -60 до 105 градусов Цельсия. Ресурс провода при макс. температуре 20000 часов.Подробнее...