Программирование микроконтроллеров. Часть 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 = 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:
В этой части я показал, как выводить информацию статическим методом. В следующей части покажу как выводить информацию на индикаторы динамическим методом.
Если есть вопросы и предложения по этому уроку, пишите комментарии буду рад ответить на ваши вопросы.
Часть 1
Часть 2-1 Часть 2-2
Часть 3-1 Часть 3-2
Часть 4-1 Часть 4-2
Часть 5
Мой блог в ЖЖ: http://evgenij-byvshev.livejournal.com