1. Семи сегментного четырех разрядного дисплея с общим катодом или анодом (разный код, но схема общая).
2. Сдвиговый регистр 74HC595 - 2 штуки
3. Модуль часов реального времени DS1307.
3. Плата Ардуино.
Схема
Скетч для общего анода
- Скетч для общего анода
Код: Выделить всё
/*
********************************************************************
Name : Arduino, 4-разрядный 7-сегментный индикатор, 74HC595 сдвиговый регистр, DS1307 RTC
Author : CheBuraw
Date : 12 Feb, 2015
Optimiser: Datak
Version : 1.1
********************************************************************
4-разрядный 7-сегментный индикатор. общий анод
1 A F 2 3 B
_______________|__|__|__|__|__|_____________
| | | | | |
| A | A | | A | A |
| F B | F B | dp | F B | F B |
| G | G | | G | G |
| E C | E C | dp | E C | E C |
| D | D | | D | D |
|_________|_________|____|_________|_________|
| | | | | |
E D dp C G 4
74HC595 Map:
_______
Q1 |1 * 16| Vcc PINS 1-7, 15 Q0 - Q7 Output Pins
Q2 |2 15| Q0 PIN 8 GND Ground, Vss
Q3 |3 14| DS PIN 9 Q7" Serial Out
Q4 |4 13| OE PIN 10 MR Master Reclear, active low
Q5 |5 12| ST_CP PIN 11 SH_CP Shift register clock pin
Q6 |6 11| SH_CP PIN 12 ST_CP Storage register clock pin (latch pin)
Q7 |7 10| MR PIN 13 OE Output enable, active low
GND |8_____9| Q7" PIN 14 DS Serial data input
PIN 16 Vcc Positive supply voltage
_______
LED B -|1 * 16|-5V
LED C -|2 15|-LED A
LED D -|3 14|-PIN 11
LED E -|4 13|-GND
LED F -|5 12|-PIN 8
LED G -|6 11|-PIN 12 ; 1uF TO GND
LED dp-|7 10|-5V
GND-|8_____9|-NILL
*/
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
int latchPin = 8; //Пин "защелки" первого регистра подключен к ST_CP входу первого регистра отвечающего за сегменты
int clockPin = 12; //Пин подключен к SH_CP входу 74HC595
int dataPin = 11; //Пин подключен к DS входу 74HC595
int TimeLight = 5; //время для разогрева сегментов
byte SegDisplay; // переменная для вывода символов на индикаторе
byte RazrDisplay; // переменная для включения разрядов
// Настройка комбинации для отображения каждого номера на дисплее.
byte g_digits[11]={
B01000000, B01111001, // 0 1
B00100100, B00110000, // 2 3
B00011001, B00010010, // 4 5
B00000010, B01111000, // 6 7
B00000000, B00010000, // 8 9
B11111111, }; // все сегменты выключены
byte g_registerArray[4]={8,4,2,1}; //массив цифр, указывающий разряды
void setup() {
Wire.begin();
RTC.begin();
// обозначаем все пины как выходы
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
int hour,minute,disp = 0;
DateTime now = RTC.now(); //Создаём переменную для вывода времени
hour = now.hour(); // Считываем значение часов
minute = now.minute(); // Считываем значение минут
disp = (hour * 100) + minute; //"Собираем" значения часов и минут в одну цифру
// Разбиваем цифру по разрядам индикатора
for( int i = 0; i < 4; i++ )
{
if( i == 0 || disp != 0 )
Indicate( i, disp % 10 );
else
Indicate( i, 10 );
disp /= 10;
}
}
void Indicate(int r,int x)
{
SegDisplay=g_digits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре.
RazrDisplay=g_registerArray[r]; // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре.
digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW
shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда)
shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа)
digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах
delay(TimeLight); // пауза, чтобы сегменты "разгорелись"
}
Скетч для общего катода
- Скетч для общего катода
Код: Выделить всё
/*
********************************************************************
Name : Arduino, 4-разрядный 7-сегментный индикатор, 74HC595 сдвиговый регистр, DS1307 RTC
Author : CheBuraw
Date : 12 Feb, 2015
Optimiser: Datak
Version : 1.1
********************************************************************
4-разрядный 7-сегментный индикатор. общий анод
1 A F 2 3 B
_______________|__|__|__|__|__|_____________
| | | | | |
| A | A | | A | A |
| F B | F B | dp | F B | F B |
| G | G | | G | G |
| E C | E C | dp | E C | E C |
| D | D | | D | D |
|_________|_________|____|_________|_________|
| | | | | |
E D dp C G 4
74HC595 Map:
_______
Q1 |1 * 16| Vcc PINS 1-7, 15 Q0 - Q7 Output Pins
Q2 |2 15| Q0 PIN 8 GND Ground, Vss
Q3 |3 14| DS PIN 9 Q7" Serial Out
Q4 |4 13| OE PIN 10 MR Master Reclear, active low
Q5 |5 12| ST_CP PIN 11 SH_CP Shift register clock pin
Q6 |6 11| SH_CP PIN 12 ST_CP Storage register clock pin (latch pin)
Q7 |7 10| MR PIN 13 OE Output enable, active low
GND |8_____9| Q7" PIN 14 DS Serial data input
PIN 16 Vcc Positive supply voltage
_______
LED B -|1 * 16|-5V
LED C -|2 15|-LED A
LED D -|3 14|-PIN 11
LED E -|4 13|-GND
LED F -|5 12|-PIN 8
LED G -|6 11|-PIN 12 ; 1uF TO GND
LED dp-|7 10|-5V
GND-|8_____9|-NILL
*/
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
int latchPin = 8; //Пин "защелки" первого регистра подключен к ST_CP входу первого регистра отвечающего за сегменты
int clockPin = 12; //Пин подключен к SH_CP входу 74HC595
int dataPin = 11; //Пин подключен к DS входу 74HC595
int TimeLight = 5; //время для разогрева сегментов
byte SegDisplay; // переменная для вывода символов на индикаторе
byte RazrDisplay; // переменная для включения разрядов
// Настройка комбинации для отображения каждого номера на дисплее.
byte g_digits[11]={
B00111111, B00000110, // 0 1
B01011011, B01001111, // 2 3
B01100110, B01101101, // 4 5
B01111101, B00000111, // 6 7
B01111111, B01101111, // 8 9
B00000000, }; // все сегменты выключены
byte g_registerArray[4]={~8,~4,~2,~1};
void setup() {
Wire.begin();
RTC.begin();
// обозначаем все пины как выходы
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
int hour,minute,disp = 0;
DateTime now = RTC.now(); //Создаём переменную для вывода времени
hour = now.hour(); // Считываем значение часов
minute = now.minute(); // Считываем значение минут
disp = (hour * 100) + minute; //"Собираем" значения часов и минут в одну цифру
// Разбиваем цифру по разрядам индикатора
for( int i = 0; i < 4; i++ )
{
if( i == 0 || disp != 0 )
Indicate( i, disp % 10 );
else
Indicate( i, 10 );
disp /= 10;
}
}
void Indicate(int r,int x)
{
SegDisplay=g_digits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре.
RazrDisplay=g_registerArray[r]; // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре.
digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW
shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда)
shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа)
digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах
delay(TimeLight); // пауза, чтобы сегменты "разгорелись"
}
Файлы для proteus