Семисегментный индикатор. Программирование микроконтроллеров AVR Принцип динамической индикации

Иногда требуется подключить к микроконтроллеру несколько семисегментных индикаторов или светодиодную матрицу, при этом для отображения информации используется динамическая индикация. Суть динамической индикации заключается в поочередном выводе информации на индикаторы. Ниже на схеме представлен пример соединения нескольких семисегментных индикаторов (для примера с общим катодом) для реализации динамической индикации, вообще с учетом точки получается 8 сегментов, но по старинке их называют именно так. Все выводы (аноды) одноименных сегментов соединяют вместе, итого 8 линий которые через резисторы подключают к микроконтроллеру. Общий катод каждого индикатора подключают к микроконтроллеру через транзистор.


Алгоритм индикации следующий: сначала устанавливаем на линиях требуемые логические уровни в зависимости от того какие сегменты надо включить на первом индикаторе (индикация слево направо), при этом высокий логический уровень для включения, низкий для выключения сегмента. Далее подаем высокий логический уровень на базу транзистора VT1, тем самым общий катод первого индикатора подключается к общему проводу, в этот момент загораются те сегменты, на анодах которых присутствует логическая единица. Через определенное время (пауза) индикатор отключаем, подав низкий логический уровень на базу транзистора, затем снова меняем логические уровни на линиях в соответствии с выводимой информацией, предназначенной для второго индикатора, и подаем сигнал включения на транзистор VT2. Таким образом, по порядку в круговом цикле коммутируем все индикаторы, вот и вся динамическая индикация.

Для получения цельного изображения без мерцаний, переключение необходимо выполнять с большой скоростью, для исключения мерцания светодиодов частоту обновления необходимо устанавливать от 70 Гц и более, я обычно устанавливаю 100 Гц. Для вышерассмотренной конструкции пауза рассчитывается следующим образом: для частоты в 100 Гц период равен 10 мс, всего 4 индикатора, соответственно время свечения каждого индикатора устанавливаем на уровне 10/4=2,5 мс. Существуют многоразрядные семисегментные индикаторы в одном корпусе, в которых одноименные сегменты соединены внутри самого корпуса, естественно для их использования необходимо применять динамическую индикацию.

Для реализации динамической индикации необходимо воспользоваться прерываниями по переполнению одного из таймеров. Ниже представлен код с использованием таймера TMR0:

;Реализация динамической индикации для 4-х семисегментных индикаторов ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; swapf STATUS,W ; clrf STATUS ; movwf STATUS_TEMP ; ; bcf ind1 ;выключение 1-го индикатора bcf ind2 ;выключение 2-го индикатора bcf ind3 ;выключение 3-го индикатора bcf ind4 ;выключение 4-го индикатора; incf shet,F ;инкремент регистра shet movlw .5 ;проверка содержимого регистра shet xorwf shet,W ;на равенство числу 5 btfss STATUS,Z ; goto met1 ;число в регистре shet не равно 5 movlw .1 ;число в регистре shet равно 5: запись числа 1 movwf shet ;в регистр shet ; met1 movlw .1 ;проверка содержимого регистра shet xorwf shet,W ;на равенство числу 1 btfss STATUS,Z ; goto met2 ;число в регистре shet не равно 1: переход на met2 movf datind1,W ;число в регистре shet равно 1: копирование movwf PORTB ;содержимого регистра datind1 в регистр PORTB bsf ind1 ;включение 1-го индикатора met2 movlw .2 ;проверка содержимого регистра shet xorwf shet,W ;на равенство числу 2 btfss STATUS,Z ; goto met3 ;число в регистре shet не равно 2: переход на met3 movf datind2,W ;число в регистре shet равно 2: копирование movwf PORTB ;содержимого регистра datind2 в регистр PORTB bsf ind2 ;включение 2-го индикатора goto exxit ;переход на метку exxit met3 movlw .3 ;проверка содержимого регистра shet xorwf shet,W ;на равенство числу 3 btfss STATUS,Z ; goto met4 ;число в регистре shet не равно 3: переход на met4 movf datind3,W ;число в регистре shet равно 3: копирование movwf PORTB ;содержимого регистра datind3 в регистр PORTB bsf ind3 ;включение 3-го индикатора goto exxit ;переход на метку exxit met4 movf datind4,W ;копирование содержимого регистра datind3 movwf PORTB ;в регистр PORTB bsf ind4 ;включение 4-го индикатора; movlw .100 ;запись числа 156 в регистр таймера TMR0 movwf TMR0 ; ; movwf STATUS ; swapf W_TEMP,F ; swapf W_TEMP,W ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа ................. movlw b"11010011" ;OPTION_REG, тем самым устанавливаем внутренний ;устанавливаем коэффициент предделителя 1:16 ; clrf shet ;обнуление регистра shet, перед запуском;прерываний по переполнению TMR0, выполняется; clrf datind1 ;очистка регистров вывода информации на clrf datind2 ;индикаторы, равнозначно выключению clrf datind3 ;индикаторов, так как индикаторы с общим clrf datind4 ;катодом; bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0 bsf INTCON,T0IE ;разрешение прерываний по переполнению TMR0 bsf INTCON,GIE ;разрешение глобальных прерываний; movlw b"00000110" ;пример вывода числа 13,52 movwf datind1 ; movlw b"11001111" ; movwf datind2 ; movlw b"01101101" ; movwf datind3 ; movlw b"01011011" ; movwf datind4 ; ; ................. ; ................. ; ................. ; ; end ;конец всей программы;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Реализация динамической индикации для 4-х семисегментных индикаторов

;Частота тактового генератора для примера 4 МГц, машинный цикл 1 мкс

org 0000h ;начать выполнение программы с адреса 0000h

goto Start ;переход на метку Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма обработки прерываний

org 0004h ;начать выполнение подпрограммы с адреса 0004h

movwf W_TEMP ;сохранение значений ключевых регистров

swapf STATUS,W ;

movwf STATUS_TEMP ;

bcf ind1 ;выключение 1-го индикатора

bcf ind2 ;выключение 2-го индикатора

bcf ind3 ;выключение 3-го индикатора

bcf ind4 ;выключение 4-го индикатора

incf shet,F ;инкремент регистра shet

movlw .5 ;проверка содержимого регистра shet

xorwf shet,W ;на равенство числу 5

btfss STATUS,Z ;

goto met1 ;число в регистре shet не равно 5

movlw .1 ;число в регистре shet равно 5: запись числа 1

movwf shet ;в регистр shet

met1 movlw .1 ;проверка содержимого регистра shet

xorwf shet,W ;на равенство числу 1

btfss STATUS,Z ;

goto met2 ;число в регистре shet не равно 1: переход на met2

movf datind1,W ;число в регистре shet равно 1: копирование

movwf PORTB ;содержимого регистра datind1 в регистр PORTB

bsf ind1 ;включение 1-го индикатора

goto exxit ;переход на метку exxit

met2 movlw .2 ;проверка содержимого регистра shet

xorwf shet,W ;на равенство числу 2

btfss STATUS,Z ;

goto met3 ;число в регистре shet не равно 2: переход на met3

movf datind2,W ;число в регистре shet равно 2: копирование

movwf PORTB ;содержимого регистра datind2 в регистр PORTB

bsf ind2 ;включение 2-го индикатора

goto exxit ;переход на метку exxit

met3 movlw .3 ;проверка содержимого регистра shet

xorwf shet,W ;на равенство числу 3

btfss STATUS,Z ;

goto met4 ;число в регистре shet не равно 3: переход на met4

movf datind3,W ;число в регистре shet равно 3: копирование

movwf PORTB ;содержимого регистра datind3 в регистр PORTB

bsf ind3 ;включение 3-го индикатора

goto exxit ;переход на метку exxit

met4 movf datind4,W ;копирование содержимого регистра datind3

movwf PORTB ;в регистр PORTB

bsf ind4 ;включение 4-го индикатора

exxit bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0

movlw .100 ;запись числа 156 в регистр таймера TMR0

swapf STATUS_TEMP,W ;восстановление содержимого ключевых регистров

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;выход из подпрограммы прерывания

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основная программа

Start ................. ;первоначальная настройка регистров

................. ;специального назначения

.................

bsf STATUS,RP0 ;запись двоичного числа 11010011 в регистр

movlw b"11010011" ;OPTION_REG, тем самым устанавливаем внутренний

movwf OPTION_REG ;источник тактового сигнала для TMR0

bcf STATUS,RP0 ;включаем предделитель перед TMR0

;устанавливаем коэффициент предделителя 1:16

clrf shet ;обнуление регистра shet, перед запуском

;прерываний по переполнению TMR0, выполняется

;однократно, после включения питания

clrf datind1 ;очистка регистров вывода информации на

clrf datind2 ;индикаторы, равнозначно выключению

clrf datind3 ;индикаторов, так как индикаторы с общим

clrf datind4 ;катодом

bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0

bsf INTCON,T0IE ;разрешение прерываний по переполнению TMR0

bsf INTCON,GIE ;разрешение глобальных прерываний

movlw b"00000110" ;пример вывода числа 13,52

movlw b"11001111" ;

movlw b"01101101" ;

movlw b"01011011" ;

................. ;

................. ;

................. ;

end ;конец всей программы

В основной программе сначала настраиваем таймер с помощью регистра OPTION_REG, ранее я рассказывал про использование таймеров для . Далее очищаем регистр shet, предназначенный для введения счета от 1 до 4, для каждого индикатора. Этот регистр инкрементируется в подпрограмме обработки прерываний и там же корректируется (он будет считать от 1 до 4), поэтому данная очистка выполняется однократно после включения питания. По этому регистру будем определять, какой индикатор включать и выдавать данные соответствующие ему. Следующим шагом будет очистка регистров хранения информации, четыре регистра dataind1,2,3,4 соответствующие четырем индикаторам. Очистка равнозначна выключению индикаторов, так как в подпрограмме обработки прерываний, содержимое этих регистров передается в регистр PORTB, к которому подключены аноды индикаторов. Это необходимо для того чтобы на индикаторах не высвечивался всякий мусор после разрешения прерываний, в принципе этого можно и не делать, если сразу записывать правильную информацию для вывода. Далее сбрасываем флаг прерывания по переполнению таймера, разрешаем прерывания по переполнению TMR0, и наконец, разрешаем глобальные прерывания.

В подпрограмме обработки прерываний, первым делом выключаем все индикаторы (подав низкие логические уровни на базы транзисторов), потому что неизвестно какой из них включен. Производим инкремент регистра shet, с проверкой на равенство числу 5, при наличии такого совпадения записываем в регистр число 1, так как необходимо вести счет от 1 до 4. Далее проверяем, какое именно число лежит в регистре shet, по которому загружаем в PORTB данные из регистров хранения информации (dataind) для соответствующего индикатора и включаем его. После чего сбрасываем флаг прерывания по переполнению TMR0, записываем число 100 в таймер (ниже приведен расчет этого значения), для временной задержки и выходим из обработчика прерываний. При первом прерывании включается первый индикатор, во втором прерывании второй и так по круговому циклу. В основной программе остается только загружать данные в регистры хранения информации для каждого индикатора. В подпрограмме прерываний не забываем сохранять и восстанавливать значения ключевых регистров, об этом я писал в статье про .

Для вывода чисел лучше использовать знакогенератор в виде таблицы данных. Например, чтобы вывести число 3456 на индикаторы, его необходимо разбить на разряды, при этом лучше использовать отдельные регистры для хранения чисел разрядов (от 0 до 9), далее прогнать эти регистры через знакогенератор, получив тем самым правильные байты (загружаемые в регистры dataind) для зажигания соответствующих сегментов.

Частоту тактового генератора примем за 4 МГц, машинный цикл 1 мкс. Частота обновления каждого индикатора пускай составит 100 Гц (период T=10 мс), соответственно необходимая временная задержка равна 10/4 = 2,5 мс. Коэффициент предделителя для TMR0 устанавливаем равным 1:16, при этом максимально возможная задержка равна 256х16 = 4096 мкс, а нам требуется пауза в 2,5 мс. Рассчитаем число для записи в TMR0: 256-((256х2,5)/4,096) = 256-156,25 = 99,75. После округления получим число 100.

Ниже можно скачать модель для программы Proteus, прошивку и исходник с реализацией динамической индикации на 4-х разрядный индикатор с общим катодом с применением микроконтроллера PIC16F628A. Для примера на индикатор выводятся числа 0000; 0001; 0002; 13,52; 9764.

Теперь рассмотрим подключение матрицы с разрешением 8х8 точек (светодиодов). Структуру матрицы обычно рассматривают в виде строк и столбцов. На картинке ниже в каждом столбце соединены катоды всех светодиодов, а в каждой строке аноды. Строки (8 линий, аноды светодиодов) через резисторы подключают к микроконтроллеру. Каждый столбец (катоды светодиодов) подключают к микроконтроллеру через 8 транзисторов. Алгоритм индикации такой же, сначала устанавливаем необходимые логические уровни на строках, в соответствии с тем, какие светодиоды должны гореть в столбце, далее подключаем первый столбец (индикация слева направо). Через определенную паузу выключаем столбец, и изменяем логические уровни на строках для отображения второго столбца, далее подключаем второй столбец. И так поочередно коммутируем все столбцы. Ниже представлена схема подключения матрицы к микроконтроллеру.


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

Самым распространенным последовательным регистром является микросхема 74НС595, которая содержит в себе сдвиговый регистр для загрузки данных, и регистр хранения через который данные передаются на выходные линии. Загружать данные в него просто, устанавливаем логический 0 на входе тактирования SH_CP, далее устанавливаем требуемый логический уровень на входе данных DS, после чего переключаем вход тактирования в 1, при этом происходит сохранение значения уровня (на входе DS) внутри сдвигового регистра. Одновременно с этим происходит сдвиг данных на один разряд. Снова сбрасываем вывод SH_CP в 0, устанавливаем требуемый уровень на входе DS и поднимаем SH_CP в 1. После полной загрузки сдвигового регистра (8 бит), устанавливаем в 1 вывод ST_CP, в этот момент данные передаются в регистр хранения и поступают на выходные линии Q0…Q7, после чего сбрасываем вывод ST_CP. Во время последовательной загрузки, данные сдвигаются от Q0 до Q7. Вывод Q7’ подключен к последнему разряду сдвигового регистра, этот вывод можно подключить на вход второй микросхемы, таким образом можно загружать данные сразу в две и более микросхемы. Вывод OE переключает выходные линии в третье (высокоомное) состояние, при подаче на него логической 1. Вывод MR предназначен для сброса сдвигового регистра, то есть установка низких логических уровней на выходах триггеров регистра, что эквивалентно загрузке восьми нулей. Ниже представлена диаграмма загрузки данных в микросхему 74НС595, установка значения 11010001 на выходных линиях Q0…Q7, при условии, что изначально там были нули:


Рассмотрим подключение матрицы 8×8 к микроконтроллеру PIC16F628A с помощью двух сдвиговых регистров 74HC595, схема представлена ниже:


Данные загружаются в микросхему DD2 (управление логическими уровнями на строках, аноды светодиодов) затем через вывод Q7’ передаются в DD3 (управление столбцами), соответственно сначала загружаем байт для включения столбца, затем байт с логическими уровнями на строках. К выходным линиям DD3 подключены транзисторы коммутирующие столбцы матрицы (катоды светодиодов). Ниже приведен код программы для вывода изображения на матрицу:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Реализация динамической индикации для матрицы с разрешением 8х8 ;Частота тактового генератора для примера 4 МГц, машинный цикл 1 мкс org 0000h ;начать выполнение программы с адреса 0000h goto Start ;переход на метку Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрограмма обработки прерываний org 0004h ;начать выполнение подпрограммы с адреса 0004h movwf W_TEMP ;сохранение значений ключевых регистров swapf STATUS,W ; clrf STATUS ; movwf STATUS_TEMP ; ; movwf FSR_osn ;в регистр FSR_osn movf FSR_prer,W ;восстановление ранее сохраненного значения movwf FSR ;регистра FSR из регистра FSR_prer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;загрузка содержимого регистра stolb в микросхему movf stolb,W ;копирование содержимого регистра stolb movwf var ;в регистр var met2 btfsc var,0 ;устанавливаем вывод ds в соответствии с btfss var,0 ; bcf ds ; bcf sh_cp ; rrf var,F ;сдвиг регистра var вправо, для подготовки;следующего бита goto met2 ;scetbit не равен нулю: переход на метку met2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;загрузка содержимого регистра INDF в микросхему;74HC595 (последовательный сдвиговый регистр) movf INDF,W ;копирование содержимого регистра INDF movwf var ;в регистр var movlw .8 ;запись числа 8 в регистр scetbit, для отсчета movwf scetbit ;переданных битов met1 btfsc var,7 ;устанавливаем вывод ds в соответствии с bsf ds ;значением 7-го бита регистра var btfss var,7 ; bcf ds ; bsf sh_cp ;тактируем вывод sh_cp, для защелкивания данных bcf sh_cp ; rlf var,F ;сдвиг регистра var влево, для подготовки;следующего бита decfsz scetbit,F ;декремент с условием регистра scetbit goto met1 ;scetbit не равен нулю: переход на метку met1 ; bsf st_cp ;тактируем вывод st_cp, для передачи загруженных bcf st_cp ;байтов на выходные линии микросхем 74HC595 ; bcf STATUS,C ;сброс бита C регистра статус перед сдвигом rrf stolb,F ;сдвиг влево регистра stolb ; incf FSR,F ;инкремент регистра FSR, подготовка следующего;регистра для отправки данных на 74HC595 decfsz shet,F ;декремент с условием регистра shet goto exxit ;регистр shet не равен 0: переход на exxit movlw data1 ;регистр shet равен 0: запись адреса первого movwf FSR ;регистра хранения иннформации в регистр FSR movlw .8 ;запись числа 8 в регистр shet, для ведения movwf shet ;счета столбцов ; exxit bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0 movlw .124 ;запись числа 124 в регистр таймера TMR0 movwf TMR0 ; ; movf FSR,W ;сохранение текущего значения регистра FSR movwf FSR_prer ;в регистр FSR_prer movf FSR_osn ,W ;восстановление ранее сохраненного значения movwf FSR ;регистра FSR из регистра FSR_osn ; swapf STATUS_TEMP,W ;восстановление содержимого ключевых регистров movwf STATUS ; swapf W_TEMP,F ; swapf W_TEMP,W ; ; retfie ;выход из подпрограммы прерывания;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа Start ................. ;первоначальная настройка регистров................. ;специального назначения................. bsf STATUS,RP0 ;запись двоичного числа 11010011 в регистр movlw b"11010010" ;OPTION_REG, тем самым устанавливаем внутренний movwf OPTION_REG ;источник тактового сигнала для TMR0 bcf STATUS,RP0 ;включаем предделитель перед TMR0 ;устанавливаем коэффициент предделителя 1:8 ; movlw .8 ;запись числа 8 в регистр shet, перед запуском movwf shet ;прерываний по переполнению TMR0, выполняется;однократно, после включения питания movlw b"10000000" ;запись двоичного числа 10000000 в movwf stolb ;регистр stolb, для включения 1-го столбца;выполняется однократно, после включения питания; movlw data1 ;запись адреса первого регистра (регистры хранения movwf FSR_prer ;информации) в регистр FSR_prer, выполняется;однократно, после включения питания; movlw .8 ;очистка 8-ми регистров вывода информации на movwf tmp ;матрицу, равнозначно выключению movlw data1 ;матрицы movwf FSR ; met3 clrf INDF ; incf FSR,F ; decfsz tmp,F ; goto met3 ; ; bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0 bsf INTCON,T0IE ;разрешение прерываний по переполнению TMR0 bsf INTCON,GIE ;разрешение глобальных прерываний; m1 movlw data1 ;пример вывода буквы R movwf FSR ; movlw b"00000000" ; movwf INDF ; incf FSR,F ; movlw b"01111111" ; movwf INDF ; incf FSR,F ; movlw b"00001001" ; movwf INDF ; incf FSR,F ; movlw b"00011001" ; movwf INDF ; incf FSR,F ; movlw b"00101001" ; movwf INDF ; incf FSR,F ; movlw b"01000110" ; movwf INDF ; incf FSR,F ; movlw b"00000000" ; movwf INDF ; incf FSR,F ; movlw b"00000000" ; movwf INDF ; ; ................. ; ................. ; ................. ; ; end ;конец всей программы;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Реализация динамической индикации для матрицы с разрешением 8х8

;Частота тактового генератора для примера 4 МГц, машинный цикл 1 мкс

org 0000h ;начать выполнение программы с адреса 0000h

goto Start ;переход на метку Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма обработки прерываний

org 0004h ;начать выполнение подпрограммы с адреса 0004h

movwf W_TEMP ;сохранение значений ключевых регистров

swapf STATUS,W ;

movwf STATUS_TEMP ;

movf FSR,W ;сохранение текущего значения регистра FSR

movwf FSR_osn ;в регистр FSR_osn

movf FSR_prer,W ;восстановление ранее сохраненного значения

movwf FSR ;регистра FSR из регистра FSR_prer

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (последовательный сдвиговый регистр)

movf stolb,W ;копирование содержимого регистра stolb

movwf var ;в регистр var

movlw .8 ;запись числа 8 в регистр scetbit, для отсчета

movwf scetbit ;переданных битов

met2 btfsc var,0 ;устанавливаем вывод ds в соответствии с

bsf ds ;значением 7-го бита регистра var

bsf sh_cp ;тактируем вывод sh_cp, для защелкивания данных

rrf var,F ;сдвиг регистра var вправо, для подготовки

;следующего бита

decfsz scetbit,F ;декремент с условием регистра scetbit

goto met2 ;scetbit не равен нулю: переход на метку met2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (последовательный сдвиговый регистр)

movf INDF,W ;копирование содержимого регистра INDF

movwf var ;в регистр var

movlw .8 ;запись числа 8 в регистр scetbit, для отсчета

movwf scetbit ;переданных битов

met1 btfsc var,7 ;устанавливаем вывод ds в соответствии с

bsf ds ;значением 7-го бита регистра var

bsf sh_cp ;тактируем вывод sh_cp, для защелкивания данных

rlf var,F ;сдвиг регистра var влево, для подготовки

;следующего бита

decfsz scetbit,F ;декремент с условием регистра scetbit

goto met1 ;scetbit не равен нулю: переход на метку met1

bsf st_cp ;тактируем вывод st_cp, для передачи загруженных

bcf st_cp ;байтов на выходные линии микросхем 74HC595

bcf STATUS,C ;сброс бита C регистра статус перед сдвигом

rrf stolb,F ;сдвиг влево регистра stolb

incf FSR,F ;инкремент регистра FSR, подготовка следующего

;регистра для отправки данных на 74HC595

decfsz shet,F ;декремент с условием регистра shet

goto exxit ;регистр shet не равен 0: переход на exxit

movlw data1 ;регистр shet равен 0: запись адреса первого

movwf FSR ;регистра хранения иннформации в регистр FSR

movlw .8 ;запись числа 8 в регистр shet, для ведения

movwf shet ;счета столбцов

movlw b"10000000" ;запись двоичного числа 10000000 в

movwf stolb ;регистр stolb, для включения 1-го столбца

exxit bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0

movlw .124 ;запись числа 124 в регистр таймера TMR0

movf FSR,W ;сохранение текущего значения регистра FSR

movwf FSR_prer ;в регистр FSR_prer

movf FSR_osn ,W ;восстановление ранее сохраненного значения

movwf FSR ;регистра FSR из регистра FSR_osn

swapf STATUS_TEMP,W ;восстановление содержимого ключевых регистров

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;выход из подпрограммы прерывания

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основная программа

Start ................. ;первоначальная настройка регистров

................. ;специального назначения

.................

bsf STATUS,RP0 ;запись двоичного числа 11010011 в регистр

movlw b"11010010" ;OPTION_REG, тем самым устанавливаем внутренний

movwf OPTION_REG ;источник тактового сигнала для TMR0

bcf STATUS,RP0 ;включаем предделитель перед TMR0

;устанавливаем коэффициент предделителя 1:8

movlw .8 ;запись числа 8 в регистр shet, перед запуском

movwf shet ;прерываний по переполнению TMR0, выполняется

;однократно, после включения питания

movlw b"10000000" ;запись двоичного числа 10000000 в

movwf stolb ;регистр stolb, для включения 1-го столбца

Информация с логическими уровнями для строк каждого столбца, хранится в 8-ми регистрах хранения информации, обращение к которым выполняется через . Адресу первого регистра присвоено название data1. Кроме первоначальной записи регистров shet и stolb, необходимо записать в регистр FSR_prer адрес первого регистра хранения информации (регистр – data1, запись в FSR_prer выполняется однократно, далее корректируется в обработчике), только после этого разрешать прерывания по переполнению TMR0.

Перед разрешением прерываний, желательно очистить регистры хранения информации, данная операция производится с помощью дополнительного регистра tmp (в качестве счетчика) и косвенной адресации, очистка равнозначна выключению матрицы.

В подпрограмме обработки прерываний загружаем в микросхему DD2 содержимое регистра stolb (при первом входе в обработчик после разрешения прерываний, в регистре лежит число 10000000, как было сказано выше). Загрузка начинается с младшего бита регистра stolb, который сдвигается в направлении от Q0 к Q7 (внутри микросхемы DD2) по мере загрузки, алгоритм загрузки был рассмотрен выше, так что думаю, разобраться в коде не составит труда. Далее загружаем в DD2 содержимое регистра INDF, это один из регистров хранения информации, адрес которого находится в FSR (при первом входе в обработчик после разрешения прерываний в FSR лежит адрес первого регистра хранения информации с названием data1). Загрузка начинается со старшего бита регистра INDF. После загрузки рассмотренных 2-х байтов, тактируем вывод st_cp, тем самым загруженные данные передаются на выходные линии микросхем DD2, DD3. Таким образом, при первом входе в обработчик коммутируется первый столбец матрицы, в котором загораются светодиоды, на анодах которых присутствует высокий логический уровень, в соответствии с содержимым регистра data1 (первый регистр хранения информации).

Далее сдвигаем регистр stolb вправо на один бит, для того чтобы подготовить к коммутации второй столбец матрицы при следующем входе в обработчик прерываний. Перед сдвигом необходимо очистить флаг C регистра STATUS, так как сдвиг происходит через этот флаг, и его состояние не известно на момент сдвига. После сдвига, инкрементируем регистр FSR, подготавливая следующий регистр хранения информации (после регистра data1) с логическими уровнями строк для второго столбца. Далее декрементируем с условием регистр shet, и если он не равен нулю, сбрасываем флаг прерывания по переполнению TMR0, производим запись числа в таймер, и выходим из обработчика прерываний.

При следующем входе в обработчик включится второй столбец матрицы и так далее. При обнулении регистра shet (после коммутации 8-го столбца), в него записывается число 8 для очередного цикла коммутации столбов, кроме этого корректируется значение регистра stolb, в регистр FSR записывается адрес первого регистра хранения информации (data1).

Выполним расчет временной задержки для таймера TMR0, частота тактового генератора 4 МГц, машинный цикл 1 мкс. Чтобы избежать мерцания светодиодов, примем частоту обновления каждого столбца в 100Гц (период T=10 мс), временная задержка равна 10/8 = 1,25 мс. Коэффициент предделителя TMR0 установим равным 1:8, при этом максимально возможная задержка равна 256х8 = 2048 мкс. Для паузы в 1,25 мс таймер должен отсчитать (256х1,25)/2,048 = 156,25 раз, округляя получим 156 отсчетов. Соответственно в таймер необходимо записать число 256-156 = 100. Но это не совсем правильное значение, так как на выполнение подпрограммы обработки прерываний затрачивается некоторое время, в данном случае на это уходит около 190 мкс, в перерасчете с учетом коэффициента предделителя получаем 190/8 = 23,75 или 24 отсчета. Правильное значение для записи в TMR0 равно: 100+24=124.

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


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

Ниже по ссылке можно скачать прошивку и исходник для микроконтроллера PIC16F628A, с реализацией динамической индикации на матрице 8х8 с применением двух сдвиговых регистров 74HC595, схема подключения была рассмотрена выше. На матрицу поочередно выводятся буквы R, L, цифра 46, смайлик, и просто узор в виде креста, эта анимация продемонстрирована в видеоролике ниже.

с метками , . Читать .

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

OPTION=0b00000000; // Настройка TMR0 INTCON=0b10100000; // Прерывания разрешены и только от TMR0

Для работы понадобятся следующие глобальные переменные:

Unsigned char v1,v2,v3, vn;

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

Обработчик прерываний занят обработкой таймера, который постоянно по очереди сменяет сегменты.

Void interrupt isr(void) { if(T0IF) // при переполнение TMR0 { vn++; // переключение сегмента switch(vn) // выбор сегмента { case 1:seg7(v1,1);break; case 2:seg7(v2,2);break; case 3:{seg7(v3,3);vn=0;}break; } TMR0=100; // установка таймера не на начало T0IF=0; // сбрасываем флаг } }

Для вывода значения символа семисегментного индикатора с общим анодом используется следующая функция:

Void seg7(unsigned char c, unsigned char s) { unsigned char t=0; // g сегмент PORTA=0b00000000; // сброс порта A switch(s) // выбор анода { case 1:{t=1;}break; case 2:{t=2;}break; case 3:{t=32;}break; } switch(c%10) // выбор сегментов (катодов) { // 00bfaed g case 0: {PORTC=0b00000000;PORTA=t+4;}break; case 1: {PORTC=0b00011110;PORTA=t+4;}break; case 2: {PORTC=0b00010001;PORTA=t;}break; case 3: {PORTC=0b00010100;PORTA=t;}break; case 4: {PORTC=0b00001110;PORTA=t;}break; case 5: {PORTC=0b00100100;PORTA=t;}break; case 6: {PORTC=0b00100000;PORTA=t;}break; case 7: {PORTC=0b00010110;PORTA=t+4;}break; case 8: {PORTC=0b00000000;PORTA=t;}break; case 9: {PORTC=0b00000100;PORTA=t;}break; } }

У PIC16F676 неполный порты вывода, поэтому все сегменты на порт C не влезли, сегмент g пришлось разместить на порте A, а точку приходиться подключать схематически к одному из общих анодов через инвертор. Схема такого подключения выглядит следующим образом:

Если использовать другой микроконтроллер, у которого есть хотя бы один полноценный порт, например PIC16F628A

функция примет следующий вид:

Void seg7(unsigned char c, unsigned char s) { unsigned char t=0; switch(c%10) // выбор сегментов (катодов) { // gcPdeafb case 0: {t=0b10100000;}break; case 1: {t=0b10111110;}break; case 2: {t=0b01100010;}break; case 3: {t=0b00101010;}break; case 4: {t=0b00111100;}break; case 5: {t=0b00101001;}break; case 6: {t=0b00100001;}break; case 7: {t=0b10111010;}break; case 8: {t=0b00100000;}break; case 9: {t=0b00101000;}break; } PORTA=0b00000000; // сброс порта A switch(s) // выбор анода { case 1:{ PORTA =4;}break; case 2:{ PORTA =8;}break; case 3:{ PORTA =64;}break; } PORTB=t; if(c>9) { PORTB=t&0b11011111; } }

Точка у символа загорается, если с больше 9, значение на индикатор выводиться всё равно будет, т.е. будет выводиться только младший разряд, остальное всё отбрасываться (например: 19 , 39 = 9. ).

В основной функции (main) МК спокойно выполняет свою работу, для вывода новой информации на дисплей ему достаточно изменить значения переменных v1 ,v2 ,v3 , но изменять их следует одновременно, что бы избежать неразберихи на индикаторе.

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

Количество соединительных проводников можно уменьшить, если заставить индикаторы работать в импульсном режиме. Человеческий глаз обладает инерционностью и если заставить индикаторы отображать информацию поочередно с достаточно большой скоростью, то человеку будет казаться, что все индикаторы отображают свою информацию непрерывно. В результате можно по одним и тем же проводникам поочередно передавать отображаемую информацию. Обычно достаточно частоты обновления информации 50 Гц, но лучше увеличить эту частоту до 100 Гц.

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


Рисунок 1. Структурная схема динамической индикации

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

В результате, когда коммутатор подает двоично-десятичный код с входа A на входы семисегментного дешифратора, то этот код отображается на индикаторе HL1. Когда коммутатор подает на входы семисегментного дешифратора двоично-десятичный код с входа B, то этот код отображается на индикаторе HL2, и так далее, по циклу.

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

Во сколько же раз мы в результате уменьшили количество соединительных проводников? Это зависит от того, где мы проведем сечение схемы. Если мы на плате индикации оставим только индикаторы, то для их работы потребуется 7 информационных сигналов для сегментов и четыре коммутирующих сигнала. Всего 11 проводников. В статической схеме индикации нам потребовалось бы 7×4=28 проводников. Как видим, выигрыш налицо. При реализации 8-ми разрядного блока индикации выигрыш будет еще больше.

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

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


Как уже упоминалось ранее, для нормальной работы светодиода требуется ток от 3 до 10 мА. Зададимся минимальным током светодиода 3 мА. Однако при импульсном режиме работы яркость свечения индикатора падает в N раз, где коэффициент N равен скважности импульсов тока, подаваемых на этот индикатор.

Если мы собираемся сохранить ту же яркость свечения, то требуется увеличить величину импульсного тока, протекающего через сегмент, в N раз. Для восьмиразрядного индикатора коэффициент N равен восьми. Пусть первоначально мы выбрали статический ток через светодиод, равный 3 мА. Тогда для сохранения той же яркости свечения светодиода в восьмиразрядном индикаторе потребуется импульсный ток:

I сег дин = I сег стат ×N = 3мА×8 = 24мА.

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

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

I кл = I сег дин ×N сег = 24мА×7 = 168мА.

Как вам такой ток?! В радиолюбительских схемах я часто встречаю решения, где коммутирующий ток берется непосредственно с выхода дешифратора, который не может выдать ток больше 20 мА, и задаю себе вопрос — а где смотреть такой индикатор? В полной темноте? Получается «прибор ночного видения», то есть прибор, показания которого видны только в полной темноте.

А теперь давайте рассмотрим принципиальную схему полученного блока индикации. Она приведена на рисунке 3.



Рисунок 3. Принципиальная схема блока динамической индикации

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

В качестве недостатка следует привести наличие больших импульсных токов, а так как любой проводник является антенной, то динамическая индикация служит мощным источником помех. Еще одним путем распространения помех является источник питания.

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

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

Если по каким-либо причинам, например, необходимость применения матричных индикаторов, приходится использовать динамическую индикацию, то нужно принять все меры по подавлению помех.

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

Литература:

Вместе со статьей "Динамическая индикация" читают:

Индикаторы предназначены для отображения различных видов информации для человека. Простейший вид информации - это...
http://сайт/digital/Indic.php

Газоразрядные индикаторы используются как для индикации битовой информации, так и для отображения десятичной информации. При построении десятичных индикаторов катод...
http://сайт/digital/GazIndic/

В настоящее время практически везде для отображения двоичной информации используются светодиоды. Это обусловлено тем...
http://сайт/digital/LED.php

Принципы работы жидкокристаллических индикаторов... Режимы работы жидкокристаллических индикаторов... Формирование цветного изображения...
http://сайт/digital/LCD.php

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

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

Этому способствуют следующие их качества.

  • Низкая цена. В средствах индикации нет ничего дешевле светодиодных цифровых индикаторов.
  • Разнообразие размеров. Самые маленькие и самые большие индикаторы – светодиодные. Мне известны светодиодные индикаторы с высотой цифры от 2,5 мм, до 32 см.
  • Светятся в темноте. В некоторых приложениях это свойство чуть ли не решающее.
  • Имеют различные цвета свечения. Бывают даже двухцветные.
  • Достаточно малые токи управления. Современные светодиодные индикаторы могут подключаться к выводам микроконтроллеров без дополнительных ключей.
  • Допускают жесткие условия эксплуатации (температурный диапазон, высокая влажность, вибрации, агрессивные среды и т.п.). По этому качеству светодиодным индикаторам нет равных среди других типов элементов индикации.
  • Неограниченный срок службы.

Типы светодиодных индикаторов.

Семисегментный светодиодный индикатор отображает символ с помощью семи светодиодов – сегментов цифры. Восьмой светодиод засвечивает децимальную точку. Так что в семисегментном индикаторе 8 сегментов.

Сегменты обозначаются латинскими буквами от ”A” до ”H”.

Аноды или катоды каждого светодиода объединяются в индикаторе и образуют общий провод. Поэтому существуют индикаторы с общим анодом и общим катодом.

Светодиодный индикатор с общим анодом.

Светодиодный индикатор с общим катодом.

Статическое управление светодиодным индикатором.

Подключать светодиодные индикаторы к микроконтроллеру необходимо через резисторы, ограничивающие ток.

Расчет резисторов такой же, как для отдельных светодиодов.

R = (U питания - U сегмента) / I сегмента

Для этой схемы: I сегмента = (5 – 1,5) / 1000 = 3,5 мА

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

В схеме подключения индикатора с общим катодом меняется полярность питания и сигналов управления.

Засветится сегмент, на управляющем выводе которого будет сформирован высокий уровень (5 В).

Мультиплексированный режим управления светодиодными (LED) индикаторами.

Для подключения каждого семисегментного индикатора к микроконтроллеру требуется восемь выводов. Если индикаторов (разрядов) 3 – 4, то задача становится практически не выполнимой. Просто не хватит выводов микроконтроллера. В этом случае индикаторы можно подключить в мультиплексированном режиме, в режиме динамической индикации.

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

Для подключения трех индикаторов потребовалось 11 выводов, а не 24, как при статическом режиме управления.

При динамической индикации в каждый момент времени горит только одна цифра. На общий вывод одного из разрядов подается сигнал высокого уровня (5 В), а на выводы сегментов поступают сигналы низкого уровня для тех сегментов, какие должны светиться в этом разряде. Через определенное время зажигается следующий разряд. На его общий вывод подается высокий уровень, а на выводы сегментов сигналы состояния для этого разряда. И так для всех разрядов в бесконечном цикле. Время цикла называется временем регенерации индикаторов. Если время регенерации достаточно мало, то человеческий глаз не заметит переключения разрядов. Будет казаться, что все разряды светятся постоянно. Для исключения мерцания индикаторов считается, что частота цикла регенерации должно быть не менее 70 Гц. Я стараюсь использовать не менее 100 Гц.

Схема динамической индикации для светодиодов с общим катодом выглядит так.

Меняется полярность всех сигналов. Теперь на общий провод активного разряда подается низкий уровень, а на сегменты, которые должны светиться – высокий уровень.

Расчет элементов динамической индикации светодиодных (LED) индикаторов.

Расчет несколько сложнее, чем для статического режима. В ходе расчета необходимо определить:

  • средний ток сегментов;
  • импульсный ток сегментов;
  • сопротивление резисторов сегментов;
  • импульсный ток общих выводов разрядов.

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

Выберем средний ток сегмента 1 мА.

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

I сегм. имп. = I сегм. средн. * N

Для нашей схемы I сегм. имп. = 1 * 3 = 3 мА.

Рассчитываем сопротивление резисторов, ограничивающих ток.

R = (U питания - U сегмента) / I сегм. имп.

R = (5 – 1,5) / 0.003 = 1166 Ом

Определяем импульсные токи общих выводов разрядов. Одновременно светиться могут 8 сегментов, значит надо импульсный ток одного сегмента умножить на 8.

I разряда имп. = I сегм. имп. * 8

Для нашей схемы I разряда имп. = 3 * 8 = 24 мА.

  • сопротивление резисторов выбираем 1,1 кОм;
  • выводы микроконтроллера управления сегментами должны обеспечивать ток не менее 3 мА;
  • выводы микроконтроллера выбора разряда индикатора должны обеспечивать ток не менее 24 мА.

При таких значениях токов индикатор может быть подключен непосредственно к выводам платы Ардуино, без использования дополнительных ключей. Для ярких индикаторов, таких токов вполне достаточно.

Схемы с дополнительными ключами.

Если индикаторы требуют больший ток, то необходимо использовать дополнительные ключи, особенно для сигналов выбора разрядов. Общий ток разряда в 8 раз больше тока одного сегмента.

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

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

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

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

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

Ключи для индикаторов с повышенным напряжением питания .

Бывают индикаторы больших размеров, в которых каждый сегмент состоит из нескольких светодиодов, соединенных последовательно. Для питания таких индикаторов требуется источник с напряжением большим, чем 5 В. Ключи должны обеспечивать коммутацию повышенного напряжения с управлением от сигналов уровней микроконтроллера (обычно 5 В).

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

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

Между переключением разрядов индикатора на короткое время (1-5 мкс) должны выключаться все сегменты. Это время необходимо на завершение переходных процессов коммутации ключей.

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

В следующем уроке подключим семисегментный светодиодный индикатор к плате Ардуино, напишем библиотеку для управления им.

Рубрика: . Вы можете добавить в закладки.

В продолжение урока, рассмотрим динамическую индикацию. Если вы внимательно изучили статическую индикацию, то знаете, что сегментный индикатор это набор светодиодов. Для того, чтобы подключить индикатор, нужно 7 ножек микроконтроллера. Но, вдруг нам понадобилось использовать несколько индикаторов, например 2, 3, 4…

Тогда нам понадобится уже 14, 21, 28 ножек, а ножек итак мало… Тут нам на помощь приходит динамическая индикация. Основная задача динамической индикации — снизить количество используемых ножек микроконтроллера. Обратите внимание на схеме задействовано 9, а не 14 ножек. Ножки управления все подключены параллельно.

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

Более детально. В первый момент времени все выключено PORTB=0x00; PORTD=0xFF; так как схема с общим «+», анодом. Далее на PORTD посылается конфигурация первого числа, например «0». Из статической индикации мы помним:

case 0 : { PORTD= 0xC0 ; break ; }

case 0: { PORTD=0xC0; break; }

Но обратите внимание, «+» подключен к PORTB.1, т.е. чтобы зажечь сегмент нужно включить ножку PORTB.1=1;

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

При высоких частотах, человеческий глаз не способен разглядеть эти переключения, и кажется что индикатор горит постоянно. Рекомендуется не использовать частоты кратные 50Гц. В своем тестовом проекте я использовал 120Гц. Таймер настроен на частоту 1МГц. Код обрабатывается в прерывании таймера1. Прерывание вызывается 240 раз в секунду, потому что индикаторов два, поэтому 1000 000/240=4166 или 0x1046 пихаем в регистр сравнения. Протеус подружить с динамическим индикатором не удалось, зато на железе заработало сразу.

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

Для схемы с общим анодом

Для схемы с общим катодом

В качестве тестовой прошивки использовал таймер из предыдущего проекта.

Видео работы прошивки

Поделиться: