Использование библиотеки для работы с семисегментным индикатором. Делаем простые часы.

Использование этой библиотеки значительно упрощает работу с семисегментным индикатором. Библиотека написана под четырехразрядный семисегментный индикатор с общим анодом или катодом. Она позволяет выводить на дисплей не только цифры, но и буквы, текущее время, бегущую строку, менять яркость свечения индикатора. Далее рассмотрим функции этой библиотеки(скачать файлы display.c и display.h можно внизу статьи).

display_init(void); - инициализация дисплея

set_brightness(uint8_t b); - установка яркости от 0 до 100

shift_in(char c); - сдвиг символа на одну позицию справа-налево

set_char_at(char c, uint8_t offset); - вывод символа в определенное знакоместо

Например: set_char_at('A', 0); // вывод символа А в первое знакоместо
set_char_at(2, 2); // вывод цифры 2 в третье знакоместо

set_segments_at(uint8_t segments, uint8_t offset); - вывод сегмента в определенное знакоместо

Например: set_segments_at(2, 1); // вывод сегмента "b" во второе знакоместо

shift_in_segments(uint8_t segments); - сдвиг сегмента на одну позицию справа-налево

set_number(uint16_t num); - вывод цифр в формате "XXXX"

clear_screen(void); - очистить дисплей

set_time(uint8_t hour, uint8_t min, uint8_t sec); - вывод времени в формате "XX.XX.XX"

Для создания своего проекта как обычно добавляем к нему два файла display.c и display.h. Принцип работы библиотеки рассмотрим на примере часов. Используем для этого микроконтроллер atmega8, который тактируется от внешнего кварца частотой 8 МГц. Внешний кварц выбран для более точного хода часов. Сегменты индикатора подключаем к порту D, кстати в  заголовочном файле display.h можно изменить конфигурацию подключения по своему желанию, если например, на печатной плате надо оптимизировать разводку дорожек. Общие аноды(катоды) подключаются к выводам  PB3-PB0. Настройка часов осуществляется с помощью двух кнопок "Часы+" и "Минуты+", при нажатии на которые увеличиваются часы и минуты соответственно. При нажатии на обе кнопки изменяется яркость дисплея.

Использование библиотеки для работы с семисегментным индикатором. Делаем простые часы.

В нашей программе используются два таймера Т0 и Т1. Восьмибитный таймер Т0 используется для динамической индикации, шестнадцатибитный таймер Т1 используется для создания интервала в 1 секунду, он используется для подсчета времени. Как только наступает прерывание по совпадению Т1 переменная "second" увеличивается на 1 секунду, если "second" будет больше 60, переменная "minute" увеличится на 1 минуту, если переменная "minute" будет больше 60, переменная "hour" увеличится на 1 час, и т.д по кругу. Полный текст программы представлен ниже:

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "display.h"

volatile unsigned char second, minute, hour, level;

ISR(TIMER1_COMPA_vect)	// обработчик прерывания по совпадению Т1
{                       
second++;				// увеличиваем секунды
if(second == 60)        // если second = 60, second = 0
{  second = 0;
   minute++;            // увеличиваем минуты
if(minute == 60)        // если minute = 60, minute = 0
{  minute = 0;
   hour++;              // увеличиваем часы
if(hour == 24)          // если hour = 24, hour = 0
   hour = 0;
}
}

set_time(hour,minute,second); // выводим часы и минуты на дисплей

}

int main(void)
{
hour = 12;	// начальная установка времени
minute = 0;
second = 0;

DDRB |= (0 << PB5)|(0 << PB4);
PORTB |= (1 << PB5)|(1 << PB4);

TCCR1B |= (1 << WGM12)|(1 << CS12); //8MHz/256/(1+31249)=1Hz
OCR1A = 31249;

sei();                // глобально разрешаем прерывания

set_brightness(80);   // начальная установка яркости дисплея
display_init();       // инициализация дисплея

shift_in('t'); // выводим бегущую строку "test display"
_delay_ms(50);
shift_in('E');
_delay_ms(50);
shift_in('s');
_delay_ms(50);
shift_in('t');
_delay_ms(50);
shift_in(' ');
_delay_ms(50);
shift_in('d');
_delay_ms(50);
shift_in('i');
_delay_ms(50);
shift_in('s');
_delay_ms(50);
shift_in('p');
_delay_ms(50);
shift_in('L');
_delay_ms(50);
shift_in('a');
_delay_ms(50);
shift_in('y');
_delay_ms(50);
shift_in(' ');
_delay_ms(50);
shift_in(' ');
_delay_ms(50);
shift_in(' ');
_delay_ms(50);
clear_screen();
_delay_ms(100);

TIMSK |= (1 << OCIE1A); // разрешаем прерывание по совпадению Т1

while(1)
{	
unsigned char i, dr;

if((PINB&(1 << PB4))==0 && (PINB&(1 << PB5))==0) // если кнопка Часы+ и Минуты+ нажаты
{
dr=0;
for (i=0;i<10;i++)
  { // программный антидребезг контактов
   _delay_ms(5);
   if((PINB&(1 << PB4))==0 && (PINB&(1 << PB5))==0) 
   dr++;
  } 
if(dr > 5) 
  {
   if(level != 99) 
   level++;	// увеличиваем яркость
   else level = 0;
   set_brightness(level);
  }
} 

if((PINB&(1 << PB4))==0 && PINB&(1 << PB5)) // если кнопка Часы+ нажата
{
dr=0;
for (i=0;i<10;i++)
  { // программный антидребезг контактов
   _delay_ms(5);
   if((PINB&(1 << PB4))==0) 
   dr++;
  } 
if(dr > 5) 
  {
   if(hour != 23) hour++;	// увеличиваем часы
   else hour = 0;
   set_time(hour,minute,second); // выводим часы и минуты на дисплей
  }
} 

if((PINB&(1 << PB5))==0 && PINB&(1 << PB4)) // если кнопка Минуты+ нажата
{
dr=0;
for (i=0;i<10;i++)
  { // программный антидребезг контактов
   _delay_ms(5);
   if((PINB&(1 << PB5))==0) 
   dr++;
  } 
if (dr > 5) 
  {
   if(minute != 59) minute++;	// увеличиваем минуты
   else minute = 0;
   set_time(hour,minute,second); // выводим часы и минуты на дисплей
  }
}

}
}

Обсуждение статьи на форуме

Архив для статьи "Использование библиотеки для работы с семисегментным индикатором. Делаем простые часы." HOT
Проект AVRStudio и Proteus
File Size 64.41 KB Download 3 553 Download

Печать E-mail

Комментарии  

0 #21 Ання 15.11.2017 21:51
Возник маленький вопрос, как открыть библиотеки? можете их сюда написать, я от руки вобью их (заранее спасибо^^)
Сообщить модератору

Авторизация