меню для семисегментного индикатора

Максимально универсальный семисегментный дисплей. Часть первая — Hardware

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

Случилось так, что по наследству мне досталась целая коробка семисегментных индикаторов с гордой надписью «Комплект часы». Давно хотелось пустить её содержимое в дело, а когда дошли руки — оказалось, что внутри целый зоопарк разномастных индикаторов, разных размеров, цветов, с общим катодом и с общим анодом. По количеству штук так двадцать. И чтобы не пилить «очередные часы» пришла идея сделать, собственно, сабж — максимально универсальный семисегментный дисплей.

Что из этого получилось — под катом.

Disclaimer

Описанные ниже устройства являются довольно нишевыми, сделаны мною just for fun, но примененный подход может быть использован для решения аналогичной задачи универсализации там, где это потребуется. Текст разбавлю пояснениями для начинающих. Основная цель — спроектировать единую плату под все имеющиеся индикаторы и различные идеи их использования.

Статья получилась объемная, так что я разделил hardware и software части. К вашему вниманию часть первая — hardware.

Постановка задачи

Что я понимаю под максимальной универсальностью? Спроектировать модуль, с помощью которого или его комбинаций можно создать любой (или практически любой, в разумных пределах) дисплей для отображение информации с использованием этих самых семисегментных индикаторов. В голову приходит сразу с десяток применений — часы, конечно же, куда без них; туда же таймеры, счетчики чего угодно; термометры; табло для разных игр; дисплеи для отображения цифровой информации — курсов валют, индексов бирж и т.п. В общих чертах задача абсолютно тривиальная, но усложняется зоопарком типов индикаторов. В наличии одноразрядные китайские индикаторы с размером цифры 2.3 дюйма (тип FJ23101, четыре светодиода на сегмент) и 3 дюйма (тип CL-30011, пять светодиодов на сегмент), разных цветов и с различным типом подключения — с общим катодом и с общим анодом. Чтобы покрыть использование всех этих типов пришлось посидеть над схемой и разводкой, которая давала бы возможность без изменения топологии печатной платы управлять разными индикаторами. Поискав вечерок в интернете мне не удалось найти универсальных решений или схем, что и стало поводом для написания данной статьи.

По приведенным примерам использования становится понятно, что модуль должен поддерживать различную разрядность, от одной цифры для простых счетчиков событий, до шести для индексов некоторых финансовых бирж. Я решил ограничиться двумя цифрами для большего трехдюймового размера и тремя для меньшего, с возможностью подключения еще одного модуля в виде slave-а.

При выборе управляющей части долго думать не пришлось, выбор сразу пал на готовые модули ESP-07 на контроллере ESP8266 от Espressif. Дешевизна и простота использования этих модулей, возможность легкого подключения к Интернету, обширная комьюнити разработчиков и элементарность программирования этого контроллера отмели все другие варианты.

Приступим к деталям

Начнем с питания семисегментных индикаторов большого размера, где каждый сегмент представляет собой цепочку из нескольких последовательно включенных светодиодов. Такие дисплеи уже не получится зажечь «цифровыми» уровнями напряжения, так как падение на цепочке светодиодов больше этого значения. Конкретное значение указывается в даташите на дисплей, оно зависит от характеристик светодиодов, цвета и их количества и может варьироваться от 6 до 12 Вольт. Ток через каждый сегмент также превышает допустимые значения тока через отдельный пин для большинства контроллеров и составляет от 20 до 50 мА. Соответственно, нужно использовать напряжение 12 Вольт и коммутирующие ключи для управления сегментами и общими выводами. Также не стоит забывать о динамической индикации — последовательном переключении разрядов с частотой превышающей частоту восприятия глаза человека. Это позволяет значительно снизить энергопотребление практически без потери визуальной яркости дисплея.

Общее питание было решено брать от порта USB, как наиболее универсального стандарта на данный момент. После непродолжительного гугления я выбрал готовый модуль повышающего DC-DC преобразователя на МТ3608. Он компактный, дешевый ( 45мА на сегмент), чего с головой достаточно для данных типоразмеров индикаторов.

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

Для общего анода все немного сложнее. Тут уже нужно использовать разнотипные ключи для верхнего и для нижнего плечей плюс инвертирующий буфер для управления разрядами. Инвертирование сигналов для сегментов получаем автоматически при использовании ULN2803.

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

Как видим, со стороны драйвера MAX7219 и управляющего всем этим ESP8266 нет никакой разницы какой именно тип индикатора установлен в модуле, модифицировать прошивку не требуется.

Замечу, что при использовании внешних драйверов встроенное в контроллер ограничение тока сегментов (которое задается резистором на входе Iset) корректно работать не будет, поэтому интенсивность будем регулировать напряжением питания при максимальной скважности от MAX7219. Драйвер позволяет устанавливать интенсивность скважностью встроенного ШИМ генератора от 1/32 до 31/32 с шагом 1/16.

Для управляющей части на ESP8266 ничего выдумывать не нужно, берем типовое включение модуля, заводим линии SPI на MAX7219, UART для прошивки на внешний разъем. Дополнительно решил добавить преобразователь протокола UART в virtual COM port через USB, его устанавливать необязательно, но места на плате предостаточно, пускай будет такая возможность. Как преобразователь я выбрал СН340, как максимально простое и бюджетное решение. В версии чипа СН340G преобразователь даже не требует частотозадающего кварца, он уже встроен в конвертер, а из обвеса всего пара конденсаторов, проще не бывает.

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

Полная схема в хорошем качестве тут.

Со схемой определились, теперь можно приступать к топологии печатной платы. Как я уже упоминал, все эти заморочки именно через плату. Хотелось заказать партию плат на нормальном производстве под все вышеперечисленные устройства и не дорабатывать их по месту напильником и скальпелем. После непродолжительных размышлений на плате вырисовались аж целых восемь посадочных мест под семисегментные индикаторы:

Такая комбинация позволяет расширить разрядность до шести цифр, а так же комбинируя расположение и размер индикаторов изготовить табло для различных, предположим, настольных игр и, конечно же, часы! На контакты продублированы сигналы управления всеми сегментами и выведены линии подключения 3 и 4 разряда для трехдюймовок, и 4, 5 и 6 разряд для двухдюймовок.

Дополнительно, два оставшихся свободных канала MAX7219 подключены к двум цепочкам дискретных светодиодов, расположенных над и под индикаторами. Их, например, можно будет использовать для фоновой подсветки, так сказать эффект ambilight.

Размер платы выбран таким образом, чтобы она не выходила за края индикаторов. В таком случае можно скомбинировать дисплей с одинаковыми расстояниями между цифрами для бо́льших и 6ти-разрядный для меньших индикаторов.

По углам платы расположены четыре отверстия под болт М3 для крепления модуля к несущей конструкции.

Микросхемы, если это было возможно, выбраны в выводных корпусах DIP, так как вопрос миниатюризации для данного устройства не актуален, а на плате они выглядят уже почти стимпанково, на фоне привычных BGA монстров. Это придает особого шарма, как у ламповых усилителей.

Посадочное место под модуль ESP-07 также pin-to-pin совместимо с модулями ESP-12S/E/F.
Плата проектировалась за два вечера, по этой причине использовался простой принцип разводки как у автороутеров — разделение горизонтальных и вертикальных линий на разные слои. В итоге плата получилась двухсторонняя, несложная и визуально красивая.

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

За время пока в Китае изготавливались платы, в местном рекламном агентстве были заказаны основы из прозрачного акрила, куда можно закрепить платы и светорассеиватель. Теперь можно посмотреть, что получилось из задуманного.

Вот так выглядит вариант платы, запаянной под индикаторы с общим катодом. На фото указаны названия микросхем и обведены перемычки под запайку.

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

А вот так — под индикаторы с общим анодом.

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

На фото ниже различные комбинации индикаторов разных размеров. Как вы можете понять, их также можно удвоить, добавив slave-модуль.

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

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

Источник

PIC Урок 7. Семисегментный индикатор. Динамическая индикация

Продолжаем работать с программированием микроконтроллеров PIC.

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

Справиться с данной ситуацией нам поможет метод динамической индикации. То есть мы не будем зажигать цифры одновременно на всех индикаторах, а будем зажигать индикаторы по очереди, используя инерционность зрения человека. Мы установим частоту смены зажигания разрядов индикатора до такой, при которой глаз уже не будет ощущать мерцание. То есть мы параллельно соединим одноимённые сегменты всех индикаторов, общие провода каждого индикатора подключим к ножкам другого порта. Поэтому если у нас будет 4 индикатора, а в данном занятии у нас их будет именно 4, то мы задействуем всего лишь ещё 4 ножки портов. Только подключать данные общие ножки напрямую к ножкам портов нежелательно, так как суммарный ток легко может превысить максимально допустимый для ножки порта, поэтому использовать мы будем для этой цели ключи на транзисторах, так как ток базы для открытия ключа очень малый и с портами ничего не случится. Причем использовать мы будем не просто 4 раздельных индикатора а один индикатор с четырьмя разрядами, что то же самое, причём в них не выводятся наружу ножки сегментов всех разрядов, а они уже параллельно соединены внутри корпуса индикатора. Хотя мы уже работали раньше с таким индикатором, но я всё же приведу схему индикатора, подобную моему (нажмите на картинку для увеличения изображения)

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

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

Вживую индикатор, который я исползую выглядит вот таким образом

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

Также у меня есть такой же по распиновке индикатор, но меньшего размера, который прекрасно работает при установке его вместо большого в макетную плату. Вот они оба для сравнения

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

А вот маркировка маленького индикатора

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

Ну вот мы немного познакомились с динамической индикацией, для чего она нужна, а также с некоторыми многоразрядными индикаторами.

Осталось дело за малым. Реализовать динамическую индикацию на деле, используя наши знания по программированию.

Микроконтроллер мы будем использовать такой же, как ина предыдущем занятииPIC16F876A, поэтому и проект мы сделаем из проекта прошлого занятия, только назовём мы его, соответственно, LED_DYN.X. Проекты мы создавать из других умеем, поэтому рассказывать об этом уже нет никакого смысла.

Откроем наш проект в MPLAB.X и попробуем его собрать.

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

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

В дереве проектов в папке с нашим проектом вызовем контекстное меню нажатием правой кнопки мыши на папке «Header Files» и выберем в нём пункт, показанный на следующем рисунке

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

И сохраним новый файл, нажав кнопку Finish.

В открывшемся файле main.h удалим полностью весь автокод и добавим следующий

#ifndef MAIN_H

#define MAIN_H

#include

#define _XTAL_FREQ 4000000

// CONFIG

#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)

#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)

#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)

#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)

#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)

#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)

#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)

#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

#endif /* MAIN_H */

Мы вынесли весь конфигурационный код из файла main.c в данный файл. Поэтому в файле main.c мы подобный код удалим, а вместо него подключим файл main.h

#include «main.h»

void segchar ( unsigned int seg)

Затем создадим заголовочный файл led.h со следующим содержимым

#ifndef LED_H

#define LED_H

#include

#endif /* LED_H */

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

#include «led.h»

void segchar ( unsigned int seg)

switch (seg)

case 1 :

PORTB = 0 b11111001;

break ;

case 2 :

PORTB = 0 b10100100;

break ;

case 3 :

PORTB = 0 b10110000;

break ;

case 4 :

PORTB = 0 b10011001;

break ;

case 5 :

PORTB = 0 b10010010;

break ;

case 6 :

PORTB = 0 b10000010;

break ;

case 7 :

PORTB = 0 b11111000;

break ;

case 8 :

PORTB = 0 b10000000;

break ;

case 9 :

PORTB = 0 b10010000;

break ;

case 0 :

PORTB = 0 b11000000;

break ;

Создадим прототип функции в заголовочном файле led.h для видимости её в других модулях

void segchar ( unsigned int seg);

Также в файле main.h подключим файл led.h

#include «led.h»

Вообщем, проект мы пока только настроили. Соберём его и теперь начнём заниматься динамической индикацией. Посмотрим схему в протеусе (нажмите на картинку для увеличения изображения)

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

По схеме мы видим, что катоды, соответствующие сегментам, у нас соединены параллельно во всех разрядах и подключены к соответствующим ножкам порта B, а общие аноды посредством транзисторных ключей на транзисторах ss8050 подключены через резисторы по 2 килоома (можно и больше) к ножкам 0-3 порта C.

Также не следует забывать о питании, резисторе на ножке MCLR, кварцевом резонаторе и конденсаторах.

А вот так выглядит схема на макетной плате с живым контроллером (нажмите на картинку для увеличения изображения)

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

Как мы видим, резисторы, идущие от ножек портов к базам транзисторов, у меня все разные, но не менее 2 килоом. Максимальный номинал также существует и зависит от тока базы, требуемому для открытия транзистора, но я этим не заморачивался, вроде и так всё работает.

Вернёмся в проект и в файле led.c добавим несколько глобальных переменных для хранения цифр разрядов и счёта таймера

Добавим также функцию для включения анода определённого разряда

void TIM0_Callback( void )

if (n_count== 0 )

PORTCbits.RC0 = 1 ;

PORTCbits.RC1 = 0 ;

PORTCbits.RC2 = 0 ;

PORTCbits.RC3 = 0 ;

segchar(R1);

if (n_count== 1 )

PORTCbits.RC0 = 0 ;

PORTCbits.RC1 = 1 ;

PORTCbits.RC2 = 0 ;

PORTCbits.RC3 = 0 ;

segchar(R2);

if (n_count== 2 )

PORTCbits.RC0 = 0 ;

PORTCbits.RC1 = 0 ;

PORTCbits.RC2 = 1 ;

PORTCbits.RC3 = 0 ;

segchar(R3);

if (n_count== 3 )

PORTCbits.RC0 = 0 ;

PORTCbits.RC1 = 0 ;

PORTCbits.RC2 = 0 ;

PORTCbits.RC3 = 1 ;

segchar(R4);

n_count++;

if (n_count> 3 ) n_count= 0 ;

В данной функции мы постепенно при каждом входе считаем от 0 до 3, а затем обнуляем счётчик и счёт начинается сначала. Также, в зависимости от значения счётчика мы попадаем в соответствующий этому значению кейс и выполняем код, находящийся в нём, который включает необходимый анод, а остальные выключает. Также мы в кейсе переключаем цифру, соответствующую данному разряду. Это код не окончательный и он будет впоследствии несколько оптимизирован. Почему возникнет данная необходимость, вы увидите позднее.

Также добавим ещё одну функцию, которая будет выводить цифру на индикатор

void ledprint( unsigned int number)

R1 = number% 10 ;

R2 = number% 100 / 10 ;

R3 = number% 1000 / 100 ;

R4 = number/ 1000 ;

Данная функция распределяет по разрядам число, которое пришло во входном параметре.

Создадим на эти две функции прототипы в заголовочном файле led.h, а прототип функции segchar() удалим, он нам теперь не нужен, так как как мы к данной функции извне обращаться уже не будем

void segchar ( unsigned int seg);

void TIM0_Callback( void );

void ledprint( unsigned int number);

Перейдём в файл main.c в функцию main() и изменим разрядность переменной для счёта, так как мы будем считать до 9999

unsigned int i;

Удалим пока весь код из бесконечного цикла.

Также изменим код инициализации портов и инициализируем таймер 0, он и будет перебирать наши разряды, а по окончании инициализации зажжем какую-нибудь цифру на индикаторе

TRISB = 0x00 ;

PORTB = 0xFF ;

TRISC = 0x00 ;

PORTC = 0x00 ;

OPTION_REG= 0 b00000111; //Prescaler 256

INTCON= 0xA0 ;

TMR0= 0 ;

ledprint( 1234 );

Я специально включил работу таймера на самой медленной частоте, задействовав самый большой делитель, чтобы мы сначала увидели воочию, как перебираются разряды, а затем мы его уменьшим.

Пока наш код не будет работать, так как нам необходимо написать обработчик прерывания от таймера по окончанию счёта. Добавим его над функцией main()

void interrupt timer0()

TIM0_Callback();

T0IF= 0 ;

В данном обработчике мы вызываем нашу функцию перебора разрядов, и затем обнуляем флаг прерывания.

Соберём проект и запустим его пока в протеусе. Мы увидим следующую картину

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

Разряды наши включаются по очереди, как и положено. Теперь попробуем данный код прошить в настоящий контроллер и увидим там подобную картину (на видео конечно будет нагляднее, так что смотрите видеоурок)

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

Изменим значение делителя в функции main()

OPTION_REG= 0 b00000011; //Prescaler 16

Соберём код и посмотрим результат

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

Вроде бы всё хорошо, но не совсем. Мы видим отображение цифр других разрядов в виде елезаметных артефактов.

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

Поэтому перейдём в файл led.c и заменим код в обработчике, заодно немного оптимизируем его и в другом плане. Нам не зачем тушить каждый раз три разряда, достаточно тушить только один, который у нас в данный момент светится

void TIM0_Callback( void )

PORTCbits.RC3 = 0 ;

segchar(R1);

PORTCbits.RC0 = 1 ;

else if (n_count== 1 )

PORTCbits.RC0 = 0 ;

segchar(R2);

PORTCbits.RC1 = 1 ;

else if (n_count== 2 )

PORTCbits.RC1 = 0 ;

segchar(R3);

PORTCbits.RC2 = 1 ;

else if (n_count== 3 )

PORTCbits.RC2 = 0 ;

segchar(R4);

PORTCbits.RC3 = 1 ;

if (n_count> 3 ) n_count= 0 ;

Теперь мы уже сначала тушим предыдущий разряд, затем готовим цифру для следующего разряда, а затем только зажигаем следующий разряд. Также вместо if мы используем else if, чтобы код попадал только куда надо, а затем не перебирал все условия. То есть мы основательно оптимизировали свой код.

Соберём код, прошьём контроллер, а вот и результат налицо

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

Теперь давайте сделаем так, чтобы у нас отображалось не одно и то же число, а чтобы число увеличивалось, например 5 раз в секунду. Мы удалим вывод числа 1234 и напишем соответствующий код в бесконечный цикл функции main() файла main.c

for (i= 0 ;i 10000 ;i++)

ledprint(i);

__delay_ms( 200 );

Соберём код, прошьём контроллер и посмотрим результат нашей работы на индикаторе

меню для семисегментного индикатора. Смотреть фото меню для семисегментного индикатора. Смотреть картинку меню для семисегментного индикатора. Картинка про меню для семисегментного индикатора. Фото меню для семисегментного индикатора

Счётчик наш прекрасно считает и никаких артефактов нет.

Таким образом, мы сегодня освоили вывод информации на многоразрядный светодиодный семисегментный индикатор с применением метода динамической индикации. Также мы оптимизировали код динамической индикации, который мы применяли ранее на других контроллерах и повторили работу таймера.

Всем спасибо за внимание!

Купить программатор (неоригинальный) можно здесь: PICKit3

Купить программатор (оригинальный) можно здесь: PICKit3 original

Отладочную плату PIC Open18F4520-16F877A можно приобрести здесь: PIC Open18F4520-16F877A

Смотреть ВИДЕОУРОК (нажмите на картинку)

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *