Привет! Постоянно что-то забываю. А интернет -ничего. Буду пользоваться.
Итак, что мы наверняка знаем о семисегментных индикаторах? Кроме того, что вытекает из названия.
- В основном в качестве сегмента выступает один или несколько светодиодов.
- Есть две распространенные схемы включения светодиодов в индикаторе. Это общий анод (слева) и общий катод(справа).
3. Так как сегменты - это светодиоды, то на каждом из них нужно ограничить ток резистором или использовать специальный драйвер.
4. Общий анод или катод подключаются или постоянно к соответствующим цепям питания или через ключ для режима динамической индикации.
5. Для отображения символов на индикаторе используется заранее записанная в память микроконтроллера или заданная комбинацией стандартной логики таблица. Каждый символ в таблице представляет собой последовательность логических нулей и единиц, соответствующих не активным или активным сегментам.
Конструкция индикатора
Существует огромное количество заводских индикаторов любых форм, расцветок и размеров, но нас интересует кастомное решение. Состоящее из отдельных светодиодов, встраиваемых в 3д печатный корпус.
Распаивать светодиоды и резисторы по месту будет довольно проблематично, поэтому лучше сделать крепление светодиодов на установочной пластине или печатной плате и установить уже распаянный вариант в посадочное место.
Программирование
Открываем MounRiver Studio и делаем новый проект под свой микроконтроллер. У меня он ch32v003f4u6.
Жмем "Finish".
Открываем в готовой папке файл main.c и удаляем всё. Программу будем составлять так, как предлагает IDE.
Для начала опишем выводы, к которым подключены аноды.
#define LED1_A GPIO_Pin_6 // обозначаем пины, к которым подключены
#define LED1_B GPIO_Pin_5 // соответствующие аноды сегментов
#define LED1_C GPIO_Pin_4
#define LED1_D GPIO_Pin_3
#define LED1_E GPIO_Pin_2
#define LED1_F GPIO_Pin_7
#define LED1_G GPIO_Pin_6
Далее создадим функцию инициализации портов как цифровых выходов.
void GPIO_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0}; // Структура для инициализации
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE); // Включение тактирования портов D и C
GPIO_InitStructure.GPIO_Pin = LED1_A; //пин из "дефайна"
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // настройка как выход
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //скорость нарастания фронта
GPIO_Init(GPIOD, &GPIO_InitStructure); // структура для порта D
GPIO_InitStructure.GPIO_Pin = LED1_G; //пин из "дефайна"
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// настройка как выход
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//скорость нарастания фронта
GPIO_Init(GPIOC, &GPIO_InitStructure);// структура для порта C
... // далее аналогично для остальных пинов
}
Далее идет функция main
int main(void)
{
SystemCoreClockUpdate();
Delay_Init(); //Инициализация функции Delay_MS()
GPIO_INIT(); //Инициализация портов
while(1) // бесконечный цикл
{
Delay_Ms(100); //После короткой задержки
GPIO_WriteBit(GPIOD, LED1_A,1 );//Зажигаем один светодиод( Порт "D", GPIO_Pin_6)
Delay_Ms(200);//Немного ждем
GPIO_WriteBit(GPIOD, LED1_A,0 );//Гасим
Delay_Ms(100);//Немного ждем
GPIO_WriteBit(GPIOD, LED1_B,1 );//Зажигаем другой
Delay_Ms(200);//И так далее...
GPIO_WriteBit(GPIOD, LED1_B,0 );
Delay_Ms(100);
... // далее аналогично для остальных светодиодов
}
Жмем "Собрать" и "Загрузить".
Должно получиться как-то так.
В последующих статьях рассмотрим отображение символов и сделаем свою библиотеку для управления такими индикаторами.
Это была моя первая статья. Спасибо, что дочитали!