Программирование микроконтроллеров. Часть 6-1


И снова здравствуйте. Сегодня продолжим изучение на примере подключения семисегментного четырехразрядного LED индикатора к микроконтроллеру.

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


Обозначение разрядов индикатора:

Картинка взята с википедии

Для этого я нарисовал в Proteus такую схему:

Индикатор я выбрал с общим катодом. По всем правилам электротехники нужно общие катоды всех разрядов подключить к выводам микроконтроллера через транзисторные ключи, но для моделирования в программе Proteus это не критично. Можно и в готовом устройстве транзисторные ключи не использовать, только в этом случае возрастет ток, протекающий через выходные ключи микроконтроллера, что может привести к его выходу из строя.


В новом проекте AtmelStudio добавил файл main.h в который буду добавлять по мере необходимости все подключения всех необходимых заголовочных файлов, библиотек и макроподстановок:

#ifndef MAIN_H_
#define MAIN_H_
#define F_CPU 8000000UL //Рабочая частота МК (8МГц)
#include <avr/io.h>
#include <util/delay.h> //подключение библиотеки для генерации задержек

void port_ini();

#endif /* MAIN_H_ */

Как видите инициализацию всех портов я вынес также в отдельный файл port_ini.c:

#include "main.h"

void port_ini(){
DDRB = 0xff; //Переключаем порт B на выход
PORTB = 0x00; //устанавливаем все выходы порта в логический 0
PORTB |= (1 << PORTB); //Подключаем подтягивающие резисторы
DDRC  //Переключаем порт C на выход
PORTC  //устанавливаем все выходы порта в логический 0
}

В файле main.c добавил массив с кодами отображаемых чисел от 0 до 9 и децимальной точки

//                              0    1    2    3    4    5    6    7    8    9    .
const unsigned char codes[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};

Семисегментный индикатор может отображать 128 вариантов состояния сегментов:

Картинка взята с википедии
Я пока решил ограничиться цифрами и точкой. В дальнейшем этот массив можно дополнить необходимыми комбинациями.


В теле цикла while добавил еще один цикл который выводит на все индикаторы цифры от 0 до 9 а после 9 выводит децимальную точку. Код файла main.c:


#include "main.h"
//                              0    1    2    3    4    5    6    7    8    9    .
const unsigned char codes[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};

int main(void)
{
    port_ini(); //Инициализируем порты

    while(1){

            for (int i = 0; i < 11; i++)
                {
                    PORTB >
Результат моделирования в программе Proteus:
<center></center>
<br>
В этой части я показал, как выводить информацию статическим методом. В следующей части покажу как выводить информацию на индикаторы динамическим методом.

***
Если есть вопросы и предложения по этому уроку, пишите комментарии буду рад ответить на ваши вопросы.
<br>
Часть 1
Часть 2-1 Часть 2-2
Часть 3-1 Часть 3-2
Часть 4-1 Часть 4-2
Часть 5
<br>
Мой блог в ЖЖ: http://evgenij-byvshev.livejournal.com


Comments 1


Всё это применимо к Arduino?

09.03.2017 07:26
0

Конечно. И здесь и там ATMEGA328. Возможно конкретно для ARDUINO платформы придется немного доработать код.

09.03.2017 07:41
0