Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Подключение семисегментных индикаторов.



 

В этой главе рассмотрим подключение семисегментных индикаторов к МК и работу с ними. Что это такое, будет понятно из картинки:

Семисегментный индикатор представляет собой микросхему, на верхней поверхности которой располагаются светодиоды. Эти индикаторы являются очень удобным и простым в использовании устройством отображения числовой информации. Внутри них, как правило, все светодиоды соединены вмести либо катодом (общий катод), либо анодом (общий анод).

В качестве примера рассмотрим два индикатора: SA39-11xxx (xxx - три-четыре буквы, кодирующие цвет, в моём случае GWA) и BC56-12xxx. Приведем ниже список цветов:

  • HWA - ярко-красный на фосфиде галлия GaP, 700 нм
  • EWA - высокопроизводительный красный на фосфиде-арсениде и фосфиде галлия GaAsP/GaP, 625 нм (не знаю, как по-другому можно перевести " HIGH EFFICIENCY RED" )
  • GWA - зеленый на фосфиде галлия GaP, 565 нм
  • YWA - желтый на фосфиде-арсениде и фосфиде галлия GaAsP/GaP, 590 нм
  • SRWA - супер ярко-красный на арсениде галлия-алюминия GaAlAs, 660 нм

В названии индикаторов вторая буква обозначает тип соединения светодиодов: С - общий катод, А - общий анод. Ниже приведена электрическая схема и чертеж SA39 и SC39. Обратите внимание на буквы, которыми обозначили каждый сегмент (a-g) и обозначение точки (DP). Эти названия мы будем использовать в коде программы для объявления макросов. Это позволит как можно сильнее абстагировать программу от электрической схемы, от способа соединения индикатора и МК.

 

Значит, " ножки" 3 и 8 нужно подключить к шине +5 В (или, в крайнем случае, подать на них +5 В от МК, но так делать не рекомендуется), а остальные - к какому-либо порту МК. Символ, отображемый на индикаторе, зависит от того, какое число отправить в порт. Всего существует 255 комбинаций, и все они возможны независимо от способа подключения. В нашем случае использовался порт D для подключения индикатора.

Остается только лишь написать программу:

#include " iom16.h"

#define a 1 // Эти макросы содержат числа, соответствующие двойке,

#define b 2 // возведенной в степень, равной номеру " ножки" того

#define c 4 // порта, к которому подключен сегмент индикатора с

#define d 128 // одноименным макросу названием. Для того, чтобы вывести

#define e 64 // какую-либо цифру на индикатор, нужно отправить в порт

#define f 32 // число 255 минус сумму соответствующих сегментам макросов.

#define g 16 // Эти числа позволяют сделать программу независимой от подключения.

#define DP 8 // Измените эти числа, если индикатор выводит букву " зю"

 

short unsigned int i = 1;

unsigned char DigNumber = 0;

unsigned char Dig[10]; // Массив, в котором хранятся числа, которые нужно

// вывести через порт на индикатор, чтобы он показал цифру, равную номеру

// элемента массива. Числа зависят только от макросов.

 

void io_init()

{

DDRD = 0xFF; // К порту D подключен индикатор

PORTD = 0xFF;

}

 

void timer0_init()

{

OCR0 = 15; // Таймер срабатывает каждые 1024 такта. Прерывание каждые

// 1024*16 тактов.

TCCR0 |= (1 < < WGM01) | (1 < < CS00) | (1 < < CS02);

TIMSK |= (1 < < OCIE0);

}

 

void Dig_init()

{

Dig[0] = 255 - (a+b+c+d+e+f); // Если индикатор с общим анодом,

Dig[1] = 255 - (b+c);       // нужно сумму макросов отнять от

Dig[2] = 255 - (a+b+g+e+d); // 255. Если с общим катодом, то

Dig[3] = 255 - (a+b+g+c+d); // отнимать не нужно.

Dig[4] = 255 - (f+g+b+c);   // Имена макросов соответствуют

Dig[5] = 255 - (a+f+g+c+d); // именам сегментов индикатора

Dig[6] = 255 - (a+f+g+c+d+e);

Dig[7] = 255 - (a+b+c);

Dig[8] = 255 - (a+b+c+d+e+f+g);

Dig[9] = 255 - (a+b+c+d+f+g);

}

 

void main()

{

io_init();

timer0_init();

Dig_init();

SREG |= (1 < < 7);

PORTD = Dig[0]; //Выводим на индикатор цифру " 0"

while(1)

{}

}

 

#pragma vector = TIMER0_COMP_vect

__interrupt void Indic_change()

{

if (i < 675) // 675*16*1024 = 11, 0592 МГц

{        // Каждую секунду меняется цифра на индикаторе

i++;

}

else

{

i = 1;

if (DigNumber < 9)

DigNumber++;

else

DigNumber = 0;

PORTD = Dig[DigNumber];

}

}

Макросы после #define позволяют сделать код почти независящим от способа подключения индикатора. Если, например, Вы подключили 5-й вывод индикатора (d-сегмент) к выводу PD3 МК, то для того, чтобы все правильно работало, нужно сопоставить макросу d число 23=8, написав

#define d 8

Откомпилировав программу и прошив ее в МК, если все правильно подключено и соответствующе описано в #define, получаем цифровые электронные часы, которые умеют считать до 10.

Рассмотрим работу с трехзначным индикатором, коим является BC56-12xxx. По логике у него должно быть 8*3+1=25 выводов. Но у него их только лишь 12.

Оказывается, внутри находятся три семисегментных индикатора, соединенные параллельно, и от каждого из них выходит один общий электрод (катод или анод). Электрическая схема представлена ниже:

Итак, подавая напряжение на выводы 1, 2, 3, 4, 5, 7, 10, 11, формируют цифру (символ), мы их назовем информационными или шиной данных, а управляя выводами 8, 9, 12, определяют позицию этой цифры. Выводы 8, 9, 12 назовем выводами выбора устройства или шиной адреса. Понятно, что нельзя одновременно зажечь две или три разные цифры. Придется использовать стробирование, т. е. зажигать цифры по очереди с высокой скоростью. Они будут мерцать, но глаз этого не успеет заметить.

Значит, с выводами 1, 2, 3, 4, 5, 7, 10, 11 работа совершенно аналогична. А выводы 8, 9, 12 нужно замыкать на землю по очереди. Казалось бы, чего проще - присоединить их к МК и все. Но не следует цеплять к МК общий электрод - это слишком большая нагрузка для него, и его порт ввода-вывода может сгореть. Следует использовать полевые транзисторы.


Поделиться:



Последнее изменение этой страницы: 2019-03-20; Просмотров: 390; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.016 с.)
Главная | Случайная страница | Обратная связь