Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
evgenij-byvshev
8 лет назад

Программирование микроконтроллеров. Часть 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

9
390.906 GOLOS
На Golos с February 2017
Комментарии (2)
Сортировать по:
Сначала старые