Цель работы: изучение методов динамического отображения информации на сегментных индикаторах.
Краткий обзор
Необходимость использования динамической индикации обусловлена тем, что при увеличении числа периферийных устройств, количество свободных портов стремительно уменьшается.
Возьмём для примера микроконтроллер Atmega16, у него имеется 4 порта по 8 выводов.
Допустим нам необходимо вывести десятичное четырёхразрядное число на семи сегментные индикаторы, для этого необходимо подключить каждый индикатор к свободному порту, но тогда кроме этих индикаторов к микроконтроллеру подключить ничего не удастся.
Следовательно для того чтобы подключить допустим кнопку надо менять микроконтроллер, или использовать динамическую индикацию-это метод отображения целостной картины через быстрое последовательное отображение отдельных элементов этой картины. Причем, «целостность» восприятия получается благодаря инерционности человеческого зрения. То есть мы последовательно включаем индикаторы с частотой примерно 30 Гц(30 кадров в секунду).
Динамическая индикация на примере Attiny2313
Данный проект находится в папке с лабораторной\005lab\005.dsn
Программа:
.include "2313def.inc"
.def Temp1=R16
.def Temp2=R17
.def Temp3=R18
.def Temp4=R19
.def Temp=R20
.dseg
Digit:.byte 4
.cseg
.org 0
rjmp RESET; Reset Handler
rjmp EXT_INT0; IRQ0 Handler
rjmp EXT_INT1; IRQ1 Handler
rjmp TIM_CAPT1; Timer1 Capture Handler
rjmp TIM_COMP1; Timer1 Compare Handler
rjmp TIM_OVF1; Timer1 Overflow Handler
rjmp TIM_OVF0; Timer0 Overflow Handler
rjmp UART_RXC; UART RX Complete Handler
rjmp UART_DRE; UDR Empty Handler
rjmp UART_TXC; UART TX Complete Handler
rjmp ANA_COMP; Analog Comparator Handler
EXT_INT0: ret
EXT_INT1: ret
TIM_CAPT1: ret
TIM_OVF0: ret
TIM_OVF1: ret
UART_RXC: ret
UART_DRE: ret
UART_TXC: ret
ANA_COMP: ret
TIM_COMP1: ret
reset: ldi Temp1,RamEnd;инициализация стека
out SPL,Temp1
cli
ldi Temp,0b11111111;настройка портов
|
out ddrb,Temp
ldi Temp,0b00001111
out ddrd,Temp
ldi Temp,4
sts Digit,Temp;загрузка начальных сначений
ldi Temp,3
sts Digit+1,Temp
ldi Temp,2
sts Digit+2,Temp
ldi Temp,1
sts Digit+3,Temp
;*********************************************************
;MAIN
;*********************************************************
IndicCycle: rcall Display;цикл индикации
rjmp IndicCycle
;*********************************************************
Display:
;последовательный вывод на индикацию содержимого
;переменной Digit
lds Temp1,Digit;загружаем 0-ю ячейку
ldi Temp,0b00001110;активируем 0-й разряд
;индикации
out PortD,Temp
rcall Decoder;вызываем 7-сегм. декодер
out PortB,Temp1;выводим значение в порт
rcall Delay1;ждем
lds Temp1,Digit+1;и.т.д
ldi Temp,0b00001101
out PortD,Temp
rcall Decoder
out PortB,Temp1
rcall Delay1
lds Temp1,Digit+2
ldi Temp,0b00001011
out PortD,Temp
rcall Decoder
out PortB,Temp1
rcall Delay1
lds Temp1,Digit+3
ldi Temp,0b00000111
out PortD,Temp
rcall Decoder
out PortB,Temp1
rcall Delay1
ret
;*********************************************************
Decoder:
;преобразование двоичного числа
;в код 7-сегментного индикатора
ldi ZL,Low(DcMatrix*2);инициализация массива
ldi ZH,High(DcMatrix*2)
ldi Temp2,0;прибавление переменной
add ZL,Temp1;к 0-му адресу массива
adc ZH,Temp2
lpm;загрузка значения
mov Temp1,r0
ret
DcMatrix:
;массив - таблица истинности декодера
; hgfedcba hgfedcba
.db 0b00111111,0b00000110;0,1
.db 0b01011011,0b01001111;2,3
.db 0b01100110,0b01101101;4,5
.db 0b01111101,0b00000111;6,7
.db 0b01111111,0b01101111;8,9
;*********************************************************
Delay1:
;цикл задержки
push Temp1
push Temp2
ldi Temp1,0
ldi Temp2,50
d11: dec Temp1
brne d11
dec Temp2
brne d11
pop Temp2
pop Temp1
ret
Данный проект находится в папке с лабораторной\005lab\005.aps
Лабораторное задание
Используя пример вывести на индикатор число соответствующее вашему варианту
Вариант | Число |
Разводка индикатора:
|