Код: Выделить всё
.include "tn2313def.inc"
.dseg
.cseg
.ORG 0x0000 ; (RESET) Reset Handler
rjmp Reset
.ORG 0x0001 ; (INT_0) External Interrupt0 Handler
rjmp CycleINC
.ORG 0x0002 ; (INT_1) External Interrupt1 Handler
rjmp Flag
.ORG 0x0003 ; (TIMER1_CAPT) Timer1 Capture Handler
RETI
.ORG 0x0004 ; (TIMER1_COMPA) Timer1 CompareA Handler
RETI
.ORG 0x0005 ; (TIMER1_OVF) Timer1 Overflow Handler
RETI
.ORG 0x0006 ; (TIMER0_OVF0) Timer0 Overflow Handler
RETI
.ORG 0x0007 ; (USART0_RXC) USART0 RX Complete Handler
RETI
.ORG 0x0008 ; (USART0_DRE) USART0,UDR Empty Handler
RETI
.ORG 0x0009 ; (USART0_TXC) USART0 TX Complete Handler
RETI
.ORG 0x000A ; (ANA_COMP) Analog Comparator Handler
RETI
.ORG 0x000B ; (PCINT) Pin Change Interrupt
RETI
.ORG 0x000C ; (TIMER1_COMPB) Timer1 Compare B Handler
RETI
.ORG 0x000D ; (TIMER0_COMPA) Timer0 Compare A Handler
RETI
.ORG 0x000E ; (TIMER0_COMPB) Timer0 Compare B Handler
RETI
.ORG 0x000F ; (USI_START) USI Start Handler
RETI
.ORG 0x0010 ; (USI_OVERFLOW) USI Overflow Handler
RETI
.ORG 0x0011 ; (EE_READY) EEPROM Ready Handler
RETI
.ORG 0x0012 ; (WDT_OVERFLOW) Watchdog Overflow Handler
RETI
.ORG INT_VECTORS_SIZE ; Конец таблицы прерываний
Reset:
clr r0
clr r1
clr r2
clr r3
clr r4
clr r5
clr r6
clr r7
clr r8
clr r9
clr r10
clr r11
clr r12
clr r13
clr r14
clr r15
clr r16
clr r17
clr r18
clr r19
clr r20
clr r21
clr r22
clr r23
clr r24
clr r25
clr r26
clr r27
clr r28
clr r29
clr r30
clr r31
ldi R16,0b11000000 ; настройка флагов прерываний
out GIMSK,R16
ldi R16,0b00001010
out MCUCR,R16
ldi R16,low(RamEnd) ;установка указателя стека
out SPL,R16
ldi R16,0b00000000 ;настройка порта А
out DDRA,R16
ldi R16,0b11111111 ;настройка порта B
out DDRB,R16
ldi R16,0b01110011 ;настройка порта D
out DDRD,R16
Indic: ;Цикл индикации
in R4,PinA
sbrs R4,0 ;Если установлен PinA,0
rcall EEWrite ;То уходим на запись
sbrs R4,1 ;Если установлен PinA,1
rcall EERead ;То уходим на чтение
mov R22,R23
rcall Decoder
sbrc R19,7
cbr R17,0b10000000
out PortB,R17
sbi PortD,5
rcall Delay
cbi PortD,5
mov R22,R24
rcall Decoder
out PortB,R17
sbi PortD,4
rcall Delay
cbi PortD,4
mov R22,r25
rcall Decoder
out PortB,R17
sbi PortD,1
rcall Delay
cbi PortD,1
mov R22,r26
rcall Decoder
out PortB,R17
sbi PortD,0
rcall Delay
cbi PortD,0
cbi PortD,6
inc r29 ;Задержка прерываний
cpi r29,170 ;Если равно
breq WR ;То прыгаем на WR
rjmp Indic ;Иначе на Indic
WR:
clr r29
out EIFR,r29
sei ;Разрешаем прерывания
nop
cli
rjmp Indic
Flag: ;Флаг инверсии
rcall Delay
sbrs r19,7 ;Если бит установлен, то
rjmp YU ;Пропускаем
clr r19
reti
YU:
sbr r19,0b10000000
sbi PortD,6
rcall Delay
reti
CycleINC: ;!!!ЦИКЛ УВЕЛИЧЕНИЯ!!!
sbi PortD,6 ;Включили пищалку
sbrc r19,7
rjmp CycleDec
inc r23
cpi r23,10
breq M
ret
M:
clr r23
inc r24
cpi r24,10
breq F
ret
F:
clr r24
inc r25
cpi r25,10
breq W
ret
W:
clr r25
inc r26
cpi r26,10
breq T
ret
T:
clr r26
reti
CycleDEC: ;!!!ЦИКЛ УМЕНЬШЕНИЯ!!!
dec r23
cpi r23,255
breq M1
ret
M1:
ldi r23,9
dec r24
cpi r24,255
breq F1
ret
F1:
ldi r24,9
dec r25
cpi r25,255
breq W1
ret
W1:
ldi r25,9
dec r26
cpi r26,255
breq T1
rjmp Indic
T1:
ldi r26,9
rjmp Indic
Decoder:
ldi ZL,Low(DcMatrix*2) ;инициализация массива
ldi ZH,High(DcMatrix*2)
ldi R18,0 ;прибавление переменной
add ZL,R22 ;к 0-му адресу массива
adc ZH,R18
lpm ;загрузка значения
mov R17,r0
ret
DcMatrix:
;массив - таблица истинности декодера
; hgfedcba hgfedcba
.db 0b11000000,0b11111001 ;0,1
.db 0b10100100,0b10110000 ;2,3
.db 0b10011001,0b10010010 ;4,5
.db 0b10000010,0b11111000 ;6,7
.db 0b10000000,0b10010000 ;8,9
EEWrite: ;!!!ЗАПИСЬ ПЗУ!!!
sbi PortD,6
sbi PortB,6
ldi R27,0
mov r5,r23
rcall write
inc r27
mov r5,r24
rcall write
inc r27
mov r5,r26
rcall write
inc r27
mov r5,r26
rcall write
ldi r17,0b01111111 ;Начало красотульки
out PortB,R17
sbi PortD,0
rcall Delay1
cbi PortD,0
sbi PortD,1
rcall Delay1
cbi PortD,1
cbi PortD,6 ;-
sbi PortD,4
rcall Delay1
cbi PortD,4
sbi PortD,6 ;+
sbi PortD,5
rcall Delay1 ;Конец красотульки
ldi R17,0b00000000
out PortD,R17
cbi PortD,6 ;-
ret
Write:
SBIC EECR,EEWE ; Ждем готовности памяти к записи. Крутимся в цикле
RJMP Write ; до тех пор пока не очистится флаг EEWE
OUT EEARL,R27 ; Загружаем адрес нужной ячейки
OUT EEDR,R5 ; и сами данные, которые нам нужно загрузить
SBI EECR,EEMWE ; взводим предохранитель
SBI EECR,EEWE ; записываем байт
RET ; возврат из процедуры
EERead: ;!!!ЧТЕНИЕ ПЗУ!!!
sbi PortD,6
ldi r27,0
rcall Read
mov r23,r5
inc r27
rcall Read
mov r24,r5
inc r27
rcall Read
mov r25,r5
inc r28
rcall read
mov r26,r5
ldi r17,0b01111111 ;Начало красотульки
out PortB,R17
sbi PortD,5
rcall Delay1
cbi PortD,6 ;-
cbi PortD,5
sbi PortD,4
rcall Delay1
cbi PortD,4
sbi PortD,6 ;+
sbi PortD,1
rcall Delay1
cbi PortD,1
sbi PortD,0
rcall Delay1 ;Конец красотульки
ldi R17,0b00000000
out PortD,R17
cbi PortD,6 ;-
ret
Read:
sbic EECR,EEWE ; Ждем пока будет завершена прошлая запись.
rjmp EERead ; также крутимся в цикле.
OUT EEARL,r27 ; загружаем адрес нужной ячейки
SBI EECR,EERE ; Выставляем бит чтения
IN R5, EEDR ; Забираем из регистра данных результат
ret
Delay:
ldi R20,10
ldi R21,4
d1:
dec R20
brne d1
dec R21
brne d1
ret
Delay1:
ldi R20,200
ldi R21,200
d2:
dec R20
brne d2
dec R21
brne d2
ret