Динамический вывод информации на 7-ми сегментный индикатор


• О проекте
• Обратная связь
• Полезные ссылки
• Полезные программы
• Друзья сайта


Последние комментарии

Сергей: Работа с часами реального времени DS3231
Извините что проп...

Алексей: Осваиваем PCAD с нуля. Вывод на печать
Пикад уже умер. Я...




           

Библиотека для AVR





AXLIB Генератор





Помощь сайту


   
				

Динамический вывод информации на 7-ми сегментный индикатор



	
По просьбе трудящихся решил я рассказать о замечательной вещи под названием 7-ми сегментный светодиодный индикатор. Для начала что это такое. Светодиодный 7-ми сегментный индикатор Вот такая вот штука. Это один разряд, так же бывают двух разрядные, трех и четырех разрядные. Видел еще шести разрядные. После каждого разряда стоит десятичная точка. Если разрядов четыре, то чаще всего после второго разряда можно встретить двоеточие для индикации секунд, при выводе времени. Разобравшись с железками давайте перейдем к изучению схемы. Что вообще такое динамическая индикация и зачем она нужна. Так-как индикатор 7-ми сегментный, то для отображения цифры используется всего 7 сегментов. Обозначаются они всегда латинскими буквами A, B, C, D, E, F, G и DP Смотрим картинку. Обозначение сегментов индикатора Под каждым сегментом расположен светодиод. Все светодиоды одним концом объеденены. Либо анодами либо катодами, а противоположные концы выведены наружу. Легко заметить что для отображения цифры необходимо использовать 8 выводов. Один общий и семь для сегментов. Если это касается одного разряда, то тут думать не о чем, просто вешаем все на один порт. А если разрядов четыре? Восемь помножим на четыре будет тридцать два. О... Да над таким индикатором 32 мега будет одна корпеть. Так дело не пойдет. Есть два решения. Наша с вами динамическая индикация либо статическая. Что бы дальше разбираться, давайте посмотрим схему включения индикатора.
Схема подключения дисплея к микроконтроллеру
Данная схема подразумевает динамическую индикацию. Да что я все динамическая да статическая. В чем разница?. Статическая индикация - это когда мы задали каждому разряду по своей цифре и она постоянно горит, а динамическая - это когда мы выводим цифру в первый разряд, потом его гасим и выводим во второй разряд, потом его гасим и выводим в третий разряд и так далее пока не закончатся разряды. После последнего разряда переходим опять к первому и так по кругу. Если это делать медленно то можно будет лицезреть цифровую бегущую строку, а если увеличить скорость к примеру до 50 Гц, то уже мерцания глаз не увидит. Вот таким образом и работает динамическая индикация. Давайте теперь разберем схему. Слева МК ATmega8 за ней на порту D висит микросхема 74ALS373. Зачем она нужна? Дело в том что индикатор это просто 8 светодиодов собранных в некую матрицу. То есть индикатор можно представить в виде линейки из 8 светодиодов. А как известно светодиоды кушают по отношению к МК ого го сколько. Конечно не возбраняется подключение напрямую, но лучше поставить между МК и индикатором какой-нибудь ретранслятор. Вот для этих целей я и решил использовать 8-и разрядный буфер с защелкой. Почему именно его. С учетом того что индикатор я использую с общим анодом, то есть для задачи цифры активный уровень 0, то можно было бы смело использовать микросхему ULN2003A(7 транзисторных сборок по схеме Дарлингтона) и не париться с буфером, но... Но в том что ULN2003A имеет на борту только NPN транзисторы и я могу использовать индикатор только с общим анодом, а если нужно поставить с общим катодом? Вот тут и поможет буфер, так как что я туда напишу, то и будет на выходе. Хочешь 0, хочешь 1. Управляющие ножки подключены в режиме транслятора. То есть буфер выводит на выход тоже самое что и на входе. Аля псевдо гальваническая развязка. За буфером следуют токоограничивающие резисторы. Помним, это светодиоды и без резисторов сгорят. Номинал резисторов нужно подбирать чуть меньше чем допустимо. Дело в том что динамическая индикация выводит символы с некой частотой и она с родни ШИМу, то есть чем выше частота, тем выше так сказать контрастность. И при максимально комфортной контрастности цифры будут светить чуть тускнее. По этому резисторы нужно брать чуть меньшего номинала. Я использовал 360Ом только потому что у меня такие были в наличии. Далее после резисторов наш индикатор. С другой стороны, где аноды, я подключил первые четыре разряда порта С. Так, со схемой вроде разобрались. Теперь давайте обсудим алгоритм программы. Для того чтобы поочередно включать разряды индикатора, напишем отдельную функцию и будем ее бесконечно вызывать в основном теле программы. Конкретнее, функция будет получать число от 0 до 9999, рабирать его на разряды и потом выводить каждый разряд на своем месте. Если число имеет количество разрядов меньше 4, то пустышки слева будем заполнять нулями. Ровняемся по правому краю. Бегать по разрядам будем слева направо. Чтобы было видно какие-нибудь действия, то мы используя прерывания от счетчика, раз в секунду будем увеличивать выводимое число на единицу. Так задача поставлена, к бою. #define F_CPU 7372800UL // Частота кварца #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> volatile unsigned int test = 9980; // Переменная для вывода на индикатор ISR(TIMER1_COMPA_vect) // Обработчик прерывания по совпадению таймера 1 { test++; // Увеличить выводимое число if(test > 9999) test = 0; // Если вышел за пределы четырех разрядов, обнулить TCNT1H=0x00; // Сброс регистра TCNT1L=0x00; // счета } void dig_out(int num); // Объявление функции вывода на индикатор int main(void) { DDRC = 0x0F; // Настройка портов DDRD = 0xFF; // для работы с индикатором Порт С для разрядов, Порт D для цифр TCCR1A=0x00; // Настройка таймера TCCR1B=0x04; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x70; OCR1AL=0x80; TIMSK=0x10; sei(); // Разрешение прерываний while(1) { dig_out(test); //Постоянно вызываем функцию вывода текущего числа } } void dig_out(int num) // Функция для вывода на индикатор 4-х разрядов { unsigned char i = 0; // Переменная счетчика unsigned char raz = 1; // Номер разряда unsigned char dig_num[] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; // Коды цифр для индикатора с общим анодом unsigned char dig[] = {0, 0, 0, 0}; // Массив для значения разряда if(num < 10) // Для заполнения нулями левых разрядов { dig[0] =0; dig[1] =0; dig[2] =0; } if(num < 100) // Для заполнения нулями левых разрядов { dig[0] =0; dig[1] =0; } if(num < 1000) // Для заполнения нулями левых разрядов { dig[0] =0; } while(num > 999) // Получение количества тысяч { dig[0]++; num -= 1000; } while(num > 99) // Получение количества сотен { dig[1]++; num -= 100; } while(num > 9) // Получение числа десятков { dig[2]++; num -= 10; } dig[3] = num; // Получения количества единиц while(raz <= 0x10) // Крутимся пока не заполним все 4 разряда { PORTC = raz; // Выбираем разряд PORTD = dig_num[dig[i]]; // Выводим цифру raz = raz<<1; // Сдвигаемся на следующий разряд i++; // Увеличиваем индекс следующей цифры _delay_ms(1); // Задержка 1 мс } } Вот и весь код. Расписывать его не буду так как он имеет комментарии к каждой строке. Ниже можно скачать архив с проектом под AtmelStudio6.2 Если все же возникнут вопросы, то милости просим на форум. Ну и для самых привередливых ниже видео все этой балалайки))). Архив с проектом.
JW Player goes here



Рейтинг@Mail.ru Яндекс.Метрика