Код: Выделить всё
; ******************************
; Автор: ххх *
; Дата: 11.06.2012 *
; Версия: 0.1 *
; Имя файла: Indicator *
; Для AVR: ATmega8L-8PU *
; Тактовая частота: 4 МГц *
; ******************************
; Выполняемые функции: Управление семисегментным ЖК-индикатором, функция подавления дребезга контактов
; ============
.device ATmega8
.nolist
.include "C:\Program Files\Atmel\AVR Studio 5.0\avrassembler\include\m8def.inc"
.list
; ============
; Блок объявлений
.def temp = r16
.def counter = r17
.def delay1 = r16 ; так надо
.def delay2 = r18
.def delay3 = r19
; ============
; Начало программы
rjmp Init
; ============
; Подпрограммы
Debounce: ; инициализируем регистры счетчика числом 0x13880 (для четности добавляем 0: 0х013880)
ldi delay1, 0x80 ;
ldi delay2, 0x38 ;
ldi delay3, 0x01 ;
Loop: ; формируем задержку
subi delay1, 1 ;
subi delay2, 0 ;
subi delay3, 0 ;
brcc Loop ;
ret
; ============
Init:
; Тело программы
; ==========
; Подблок инициализации стека
ldi temp, low(ramend) ;
out spl, temp ;
ldi temp, high(ramend) ;
out sph, temp ;
; ==========
ser temp ;
out DDRD, temp ; выходы
ldi temp, 0b11111110 ;
out DDRB, temp ; PB0 - вход, остальные не используются
ldi r20, 0b01111110 ; код для цифры "0"
out PortD, temp ; показать цифру "0"
ldi temp, 0b00000001 ;
out PortB, temp ; PB0 - подтяжка, остальные не используются
ldi r21, 0b00110000 ; коды цифр индикатора
ldi r22, 0b01101101 ;
ldi r23, 0b01111001 ;
ldi r24, 0b00110011 ;
ldi r25, 0b01011011 ;
ldi r26, 0b01011111 ;
ldi r27, 0b01110000 ;
ldi r28, 0b01111111 ;
ldi r29, 0b01111011 ;
clr counter ;
; ============
Start:
sbic PinB, 0 ;
rjmp Start ; если нет
inc counter ;
cpi counter, 10 ;
brne PC + 2 ; если нет
clr counter ;
ldi ZL, 20 ;
add ZL, counter ;
ld temp, Z ;
out PortD, temp ;
rcall Debounce ; задержка
ReleaseWait:
sbis PinB, 0 ;
rjmp ReleaseWait ; если нет
rcall Debounce ; задержка
rjmp Start ;
; ============


