Главная страница  Комбинированное использование портов 

1 2 3 4 5 6 7 8 [ 9 ] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

InitTimers

clrf

MsdTime

Сброс счетчика времени.

clrf

LsdTime

STATUS,RPO

Выбираем банк 1.

movlw

B-10000100-

Назначаем прескаллеру таймер RTCC.

fnovwf

OptionReg

Назначаем коэффициент деления 32.

STATUS,RPO

Банк 0.

movlw

В 00100000

Разрешаем прерывание таймера.

movwf

INTCON

movlw

Установка модуля счета таймера.

movwf

RTCC

Начало счета.

retfie

Servicelnterrupts btfsc goto movlw movwf retfie

INTCON,RTIF ServiceRTCC В00100000 INTCON

Проверка флага прерывания таймера. Да, переход к подпрограмме обработки. Нет, сброс.

ServiceRTCC

Инициализация RTCC.

movlw .96

movwf RTCC

bcf INTCON, RTIF

call IncTimer

call UpdateDisplay ; Индикация, retfie

Стирание флага прерывания таймера. Приращение счетчика времени.

Значение счетчика увеличивается один раз в секунду.

IncTimer

DoIncTime

incf

Count,w

Инкрементирование счетчика.

xorlw

.200

= 200?

btfsc

STATUS. Z

Нет, тогда переход.

goto

DoIncTime

Да, приращение счетчика.

incf

Count

Инкрементируем счетчик.

return

clrf

Count

Сброс счетчика.

incf

LsdTime r,w

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

младших цифр.

andlw

OxOF

Маскирование старшего полубайта

xorlw

OxOa

= 10?

btfsc

STATUS,Z

Нет, тогда переход.

goto

IncSecondLsd

Приращение второй цифры.

incf

LsdTime

Приращение первой цифры.

return

IncSecondLsd

incThirdLsd

IncMsd

UpdateDisplay

JpdateLsd

swapf

LsdTime,w

andlw

OxOf

addlw

movwf

LsdTime

swapf

LsdTime

xorlw

OxOa

btfsc

STATUS,Z

goto

IncThirdLsd

return

clrf

LsdTime

incf

MsdTime.w

andlw

OxOF

xorlw

OxOa

btfsc

STATUS,Z

goto

IncMsd

incf

MsdTime

return

swapf

MsdTime, w

andlw

OxOF

addlw

movwf

MsdTime

swapf

MsdTime

xorlw

OxOa

btfsc

STATUS,Z

clrf

MsdTime

return

movf

PORT A,w

clrf

PORT A

andlw

OxOf

movwf

TempC

TempC, 4

TempC

btfss

STATUS,CARRY

TempC,3

btfsc

TempC,0

goto

UpdateMsd

btfsc

TempC.1

goto

Update3rdLSd

btfsc

TempC,2

goto

Update2ndLsd

movf

LsdTime,w

andlw

OxOf

goto

DisplayOut

Меняем местами полубайты. Маскирование старшего полубайта. Инкрементируем значение.

Снова меняем местами полубайты. = 10?

Нет, тогда переход. Приращение третьей цифры.

Пробное приращение байта старших цифр. Маскирование старшего полубайта. = 10?

Нет, тогда переход.

Да, приращение четвертой цифры.

Приращение третьей цифры.

Маскирование старшего полубайта. Инкрементируем значение.

= 10?

Нет, тогда выход.

Сброс байта старших цифр.

Выключение всех цифр.

Сохранение номера цифры в TempC Подготовка индикации. Определяем следующую цифру с = 1?

Нет, тогда сброс Lsd.

Пересылка Lsd в регистр W. Маскирование старшего байта. Переход к индикации.



Update2nciLsc!

Updates rdLsd

UpdateHsd

DisplayOut

Ledtable

Chk2LsdZero

call

Chk2LsdZero ;

Старшая (Hsd) и вторая цифры равны 0?

btfss

STATUS,Z ;

Да, тогда переход.

swapf

LsdTiine,w ;

Меняем местами полубайты в W.

andlw

OxOf ;

Маскируем старший полубайт.

goto

DisplayOut ;

Переход к индикации.

call

ChkMsdZero ;

Msd = 0?

btfss

STATUS.Z ;

Да. тогда переход.

movf

HsdTime.w ;

Пересылка 3-й цифры в W.

andlw

OxOf ;

Маскируем старший полубайт.

goto

DisplayOut ;

Переход к индикации.

swapf

HsdTime.w ;

Пересылка Hsd в W.

andlw

OxOf :

Маскируем младший полубайт.

btfsc

STATUS,Z ;

Msd! =0. тогда переход

movlw

OxOa

call

LedTable ;

Чтение цифр.

movwf

PORTJ ;

Управление LED.

movf

TempC, w

ITOVWf

PORT A

return

addwf

5555

Модифицируем программный счетчик.

retlw

B001111ir

Цифра 0.

retlw

В00000110

Цифра 1.

retlw

В-0101101Г

Цифра 2.

retlw

ВОЮОШГ

Цифра 3.

retlw

В0110О110-

Цифра 4.

retlw

В-0110110Г

Цифра 5.

retlw

BOIIIHOr

Цифра 6.

retlw

BOOOOOIir

Цифра 7.

retlw

BOlllllir

Цифра 8.

retlw

В-0110011Г

Цифра 9.

retlw

в00000000

Цифра выключена (пробел).

call

ChkMsdZero

; Hsd = 0?

btfss

STATUS, Z

; Да, тогда продолжаем.

return

; в противном случае возврат.

swapf

LsdTime,w

; Пересылка 2-й цифры Lsd в W.

andlw

OxOf

; Маскируем младший полубайт.

btfss

STATUS.Z

; = 0? Тогда продолжаем.

ChkNsdZero

retlw

movf

HsdTime.w

btfss

STATUS.Z

return

retlw

В противном случае возвращаем 10.

Пересылка Msd в W. = О? Тогда продолжаем. В противном случае возврат. Возвращаем 10.

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

В первом случае применяют схему, представленную на рис. 3.11.

Микроконтроллеру не нужно формировать и передавать семи-сегментный код на индикатор, что требовало бы семи или восьми выводов, достаточно передать только двоично-десятичный код (BCD) цифры, для чего хватает всего четырех выводов. Поскольку

Декодер дбоично-десятичново (BCD) коде Ь семисегментньО


2N2907A

return

Испо

пьзование внешнего декодера



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

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

Это решение использует микросхему специализированного контроллера индикации, который осуществляет не только декодирование двоично-десятичного кода в семисегментный, но и реализует циклограммы необходимых при динамической индикации переключений. На рынке представлено множество микросхем контроллеров для светодиодных индикаторов. Мы выбрали в качестве примера контроллер МС14499 фирмы Motorola, достаточно распространенный и недорогой.

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

Микросхема реализует принцип динамического управления индикаторами, что предполагает матричный дост\т1 к каждому сегменту: Это сокращает общее число необходимых линий и соответственно выводов микросхемы, используемых для управления индикатором. Упрощается и программное обеспечение микроконтроллера: его задача, в части поддержки индикации, сводится к посылке на микросхему последовательности цифр, которые надо вывести на индикатор.

Если приложение требует более четырех индикаторов, можно использовать несколько ИС МС14499, как это показано на рис. 3.13.

Рис. 3.12

i i i I I Точко i

I Ццфро IV j Ццфро III I Цифра II I Цифро I j (DP) j

20-разряднаС регистр сдбига

Заиделка

Генератор

j Буферный I У регистр I

4> <4>

<4>

Мультиплексора

Декодер Vl сегментов

Vcujiume/iu сегментоб


Декодер иифр

Усилители цифр


Суктурная аема контроллера динамической индикации МС14499



1 2 3 4 5 6 7 8 [ 9 ] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

© 2000 - 2022 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.