Схема стендаРис.1. Принципиальная схема статической индикации
Блок схема алгоритма:
Программа на языке ассемблер, реализующая поставленную задачу: .include "m8515def.inc"; Подключаем библиотеку ATMEGA8515
.equ INDL = 0xa000; // Левая часть .equ INDR = 0xa001; // Правая часть .equ ind = 0xa004;Управление десятичными точками,и гашение или включение разрядов индикатора .equ k1=0x9006; адресация первого столбца клавиатуры
;--- .dseg .org $065; начальный адрес внутреннего ОЗУ(EEPROM в мое случае) для размещения данных индикации indDataR:.BYTE 1 indDataL:.BYTE 1
.cseg;начало сегмента кода .org $000;Выделение начальной области памяти rjmp reset;и переход на начало программы .org $18; следующий код будет размещён в памяти программ начиная с адреса 0х0018 (FLASH) reset:; вектор сброса контроллера ;--- .def tmp =R16;| .def tmp1 =R17;| .def tmp2 =R18;| .def tmp3 =R19;| .def tmp4 =R20;| .def tmp5 =R21;| .def tmp6 =R22;| .def tmp7 =R23;| ; инициализация стека ldi tmp, HIGH(RAMEND) out SPH, tmp ldi tmp, LOW (RAMEND) out SPL, tmp
; разрешить использование внешней памяти ldi tmp, (1 << SRW10) | (1 << SRE) out MCUCR, tmp ; Разрешить задержку (данных) на портах микроконтр. с внешним ОЗУ. ldi tmp, (1 << XMBK) out SFIOR, tmp main:; -=-=-=-=-=-=- основной цикл программы =-=-=-=-=-=-=-=-=- ldi r17, 0b00000000;Перезапустить индикацию разрядов (вкл)после аварийного сброса sts ind, r17
; запись данных в ОЗУ ldi tmp1, 0x04 sts indDataR, tmp1; запись первого числа
ldi tmp1, 0x89 sts indDataL, tmp1; запись второго числа
; вывод значений на индикатор lds tmp2, indDataR sts INDR, tmp2; вывод правой части
lds tmp3, indDataL sts INDL, tmp3; вывод левой части
; обработка клавиатуры (1 столбец) lds tmp,k1 ldi r18,0x01
mov r19,tmp andi tmp,0b00001111 cpi tmp,0b00001111 brne click rjmp main ; ======= ; программа обработки нажатия на кнопку ; ========== click: mov tmp,r19 andi tmp,0b00000010; обработка нажатия первой клавиши (S1) cpi tmp,0 brne main; если нажата другая клавиша
ldi tmp4, 5; 5 миганий mg: dec tmp4
rcall delay; задержка
ldi r17, 0b00000001 sts ind, r17
rcall delay; задержка
ldi r17, 0b00000000 sts ind, r17
cpi tmp4, 0 brne mg
rjmp main ; цикл задержки delay: ldi tmp5, 0x20 ldi tmp6, 0xFF ldi tmp7, 0xFF Loop2: Loop1: Loop: dec tmp7 cpi tmp7, 0 brne Loop
dec tmp6 cpi tmp6, 0 brne Loop1
dec tmp5 cpi tmp5, 0 brne Loop2
ret Вывод: в результате выполнения лабораторной работы была создана программа вывода информации на индикатор и обработки нажатия кнопки с последующим миганием нужного сегмента.
|