Найти в Дзене
Евгений Бывшев

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

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

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

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

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

-2

Индикатор я выбрал с общим катодом. По всем правилам электротехники нужно общие катоды всех разрядов подключить к выводам микроконтроллера через транзисторные ключи, но для моделирования в программе 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 = 0xff; //Переключаем порт C на выход
PORTC = 0x00; //устанавливаем все выходы порта в логический 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 = codes[i];
_delay_ms(100);
}

}
}

Результат моделирования в программе Proteus:

-4

В этой части я показал, как выводить информацию статическим методом. В следующей части покажу как выводить информацию на индикаторы динамическим методом.

Программирование микроконтроллеров:

Часть 1 Часть 2-2 Часть 2-2 Часть 3-1 Часть 3-2 Часть 4-1 Часть 4-2 Часть 5