.include "D:\Program Files\Atmel\AVR Studio\Appnotes\tn15def.inc" .def tmp = r16 .def coc = r17 .def vih = r18 .def tempo = r19 .def pir = r22 .def pur = r23 .def par = r20 .def Y = r29 .def X = r21 .def W = r26 .def prg1 = r24 .def prg2 = r25 .def adr2 = r27 .def aur = r15 .def adr = r0 ;начало сегмента программы .cseg .org 0 ;Вектор прерывания rjmp RESET nop ;rjmp EXT_INT0 прерывание не используется nop ;rjmp EXT_PIN прерывание не используется nop ;rjmp LOW_LEVEL rjmp TIME_1 ;прерывание от таймера1 rjmp TIME_0 ;прерывание от таймера0 nop ;rjmp EE_RDY прерывание от таймера nop ;rjmp ANA_COMP прерывание не используется ;начало всей программы с подпрограммами .org 20 ;настройка порта В RESET: clr tmp out DDRB, tmp out PORTB, tmp ;обнулить порт В wdr ;Настройка таймера time0 clr coc ldi coc, $06 out TIMSK, coc ldi coc, $06 out TIFR, coc ldi coc, 3 ;Источник счетчик/64 out TCCR0, coc ldi coc, $ff-35 out TCNT0, coc ;Настройка таймера time1 clr coc ldi coc, $0E ;Источник счетчик/512 out TCCR1, coc ldi coc, $00 out TCNT1, coc ;Начало основной логической программы ;сброс всех значений nStart: nop ;начало программы clr coc ldi coc, $0F ;PB0,PB1,РВ2,РВ3-выходы out DDRB, coc nop ldi par, $0F clr tmp clr pir clr pur clr prg1 clr prg2 clr r14 sei rec: nop ;Проверка прерывания таймера0 mov prg1, r14 cpi prg1, $7B brne jup clr r14 ;Индикация в случае прерывания rcall TIMEW rjmp jup ;Проверка прерывания таймера1 mov prg1, r13 cpi prg1, $9B brne jup clr r13 ;Индикация в случае прерывания rcall DUP jup: nop sei rjmp rec ;Подпрограмма опроса клавиши Dup: clr vih rcall zader nop rcall zader nop nop clz ;Чтение порта inc tempo in vih, PORTB andi vih, $10 cpi vih, $00 brne Dup inc tmp cpi tmp, $05 ;совпадение 5 раза подряд brbs 1, prod ;проверка результата накопления, не более 50 раз cpi tempo, $0A brbc 1, kon clr tmp clr tempo rjmp dup nop kon: nop ret ;Кнопка нажата и проверена prod: nop clz clr tempo clr tmp inc pir nop ;проверка на более 9 нажатий кнопки cpi pir, $09 ;совпадение 9 brbs 1, razr rjmp kon razr: nop clz inc pur ;проверка на более 99 нажатий кнопки cpi pur, $09 ;совпадение 9 brbs 1, sbr rjmp kon sbr: nop clz clr pir clr pur rjmp kon ;Начало подпрограмм. ;Подпрограмма задержки включения светодиодов zader: nop wdr nop clr X nop clr Y nop ldi X, $0A dv: nop wdr mov Y, par dx: dec Y brne dx dec X brne dv ret ;Подпрограмма вывода семисегментного кода ;Начало вектора прерывания от таймера TIME_0: wdr cli clr prg1 ldi prg1, $7B mov r14, prg1 reti TIME_1: wdr cli clr prg1 ldi prg1, $9B mov r13, prg1 reti TIMEW: nop wdr cli mov r9, tempo mov r1, tmp mov r2, pir mov r3, pur mov r4, adr mov r5, x mov r6, y mov r8, par mov par, r2 ;первая цифра clr prg2 ldi adr2, $37 ;первый индикатор rcall opros rcall zader ldi coc, $00 out TCNT0, coc clr prg2 mov par, r3 ;вторая цифра ldi adr2, $3F ;второй индикатор rcall opros rcall zader ldi adr2, $37 rcall sbros mov tempo, r9 mov tmp, r1 mov pir, r2 mov pur, r3 mov adr, r4 mov x, r5 mov y, r6 mov par, r8 ldi coc, $ff-45 out TCNT0, coc sei ret ;Подпрограмма опроса сегментов opros: cli ;общее запрещение прерываний nop clz mov r7, par ;сохранение par ldi prg2, $00 ldi r31, high(2*cod) ldi r30, Low(2*cod) mov W, par cpi W, 0 ;для индикации 0 brbs 1, hod ;проверка по 0 результату ist: nop brbs 1, hod ;проверка по отрицательному результату ldi tmp, $0A add r30, tmp ;увеличение адреса dec par ;par номер цифры адреса rjmp ist hod: clz mov r12, r30 xod: mov r30, r12 cpi prg2, $09 ;вывод на индикатор количества breq nasv ;9 знаков выводятся add r30, prg2 ;увеличение адреса сложением LPM ;загрузка в регистр R0 данных по адр Z and adr, adr2 ;adr2-второй сегмент clr aur inc aur cpi adr2, $3F brne kv mov r10, tmp mov tmp, aur ori tmp, $08 mov aur, tmp mov tmp, r10 kv: nop out PORTB, aur nop nop out PORTB, adr nop nop nop nop nop nop nop nop out PORTB, aur nop nop inc prg2 ;увеличение шага адреса rjmp xod nasv: mov par, r7 ;восстановление par clr pir clr adr ret ;сброс знаков индикатора, перевод регистра в высокое состояние sbros: cli ;общее запрещение прерываний nop clz mov r7, par ;сохранение par ldi par, $0A ldi prg2, $00 ldi r31, high(2*cod) ldi r30, Low(2*cod) mov W, par cpi W, 0 ;для индикации 0 brbs 1, hod1 ;проверка по 0 результату ist1: nop brbs 1, hod1 ;проверка по отрицательному результату ldi tmp, $0A add r30, tmp ;увеличение адреса dec par ;par номер цифры адреса rjmp ist1 hod1: clz mov r12, r30 dd: nop mov r30, r12 cpi prg2, $09 ;вывод на индикатор количества breq nasvt ;9 знаков выводятся add r30, prg2 ;увеличение адреса сложением LPM ;загрузка в регистр R0 данных по адр Z and adr, adr2 ;adr2-второй сегмент clr aur ;регистр обнуления inc aur out PORTB, aur nop nop out PORTB, adr nop nop nop nop nop nop nop nop out PORTB, aur nop nop inc prg2 ;увеличение шага адреса rjmp dd nasvt: mov par, r7 ;восстановление par clr pir clr adr ret ;начало таблицы кодировки .org $190 cod: .DB $3A, $3B, $3B, $3B, $3B, $3B, $3B, $3F .DB $3F cod1: .DB $3A, $3F, $3B, $3B, $3F, $3F, $3F, $3F .DB $3F cod2: .DB $3A, $3B, $3B, $3F, $3B, $3B, $3F, $3B .DB $3F cod3: .DB $3A, $3B, $3B, $3B, $3B, $3F, $3F, $3B .DB $3F cod4: .DB $3A, $3F, $3B, $3B, $3F, $3F, $3B, $3B .DB $3F cod5: .DB $3A, $3B, $3F, $3B, $3B, $3F, $3B, $3B .DB $3F cod6: .DB $3A, $3B, $3F, $3B, $3B, $3B, $3B, $3B .DB $3F cod7: .DB $3A, $3B, $3B, $3B, $3F, $3F, $3F, $3F .DB $3F cod8: .DB $3A, $3B, $3B, $3B, $3B, $3B, $3B, $3B .DB $3F cod9: .DB $3A, $3B, $3B, $3B, $3B, $3F, $3B, $3B .DB $3F codR: .DB $3A, $3F, $3F, $3F, $3F, $3F, $3F, $3F .DB $3F .EXIT