.include "m8535def.inc" ; Подключить файл описаний, имён регистров портов ввода/вывода
.cseg
.org 0
rjmp reset
.org $00E
rjmp inADC_0 ;Вектор прерывания АЦП
.org $080
.org $100 ;Адрес начала программы
reset:
;Установка стека
ldi r16,low(RAMEND)
out spl,r16
ldi r16,high(RAMEND)
out sph,r16
;Установка портов: А на вход, С,D на выход
clr r16
out DDRA,r16
out PORTA,r16 ;подтягивающие резисторы порта А
ldi r16,0xFF
out DDRD,r16
out DDRC,r16
;Установка регистров
ldi r17,0b00100000 ;R17-Выравниваение по левому краю,ADC0
ldi r18,0b00100111 ;R18-Выравниваение по левому краю,ADC7
ldi r24,0x00
clr r25
ldi r31,0x02 ;R31-для флеш памяти
;Инициализация АЦП
out ADMUX,r17
ldi r16,0b11001111 ;Инициализация АЦП:разрешение и запуск
out ADCSRA,r16 ;циклического преобразования с предделителем 16
sei ;Общее разрешение прерываний
main:
rjmp main
inADC_0: ;Прерывание АЦП
ldi r16,0b11001111
out ADCSRA,r16 ;с предделителем 16
cpi r24,0x01 ;Поочередно считываем показания то с ADC0(*),
breq inADC_7 ;Перейти, если равно
inc r24 ;Счетчик
out ADMUX,r17 ;из регистра r17 - в первый канал АЦП
in r19,ADCL
in r19,ADCH ;Записываем показания с 1 потенциометра в R19
lsr r19 ;сдвигаем вправо на 3, чтобы получить 5 разрядов
lsr r19
lsr r19
andi r19,0b00011111
; mov r21,r19
;rjmp m1
reti ;Возврат из прерывания
inADC_7: ;(*)то с ADC7
clr r24 ;обнуляем cчетчик
out ADMUX,r18 ;из регистра r18 - вo второй канал АЦП
in r20,ADCL
in r20,ADCH ;Записываем показания со 2 потенциометра в R20
lsr r20 ;сдвигаем вправо на 3, чтобы получить 5 разрядов
lsr r20
lsr r20
andi r20,0b00011111
rjmp m1
m1:
mov r22,r19 ;Содержимое r19-и r22
add r22,r20 ;Считаем сумму показаний, результат записываем в R22
andi r22,0b00011111
odin:
mov r26,r22 ; перемещаем результат вычисления в r26
cpi r25,0x00 ; счетчик равен 0?
brne dva ; если нет, переходим на индикацию второй цифры
andi r26,0x07 ; маска (оставляем 3 младших бита)
mov r30,r26 ; перемещаем результат в r30
lpm ; берем значение цифры
out PORTD,r0 ;выводим его
ldi r23,0x01
out PORTC,r23 ;на первый индикатор
inc r25 ; инкрементируем счетчик
clr r26
clr r30
reti
dva:
cpi r25,0x01 ;счетчик равен 1?
mov r26,r22 ;перемещаем результат вычисления в r26
lsr r26 ;сдвигаем результат на 3 бита вправо
lsr r26 ;тем самым делим его на 8
lsr r26
andi r26,0x07 ;оставляем только 3 младших бита
mov r30,r26 ;перемещаем результат в r30
lpm ;берем значение цифры
out PORTD,r0 ;выводим его
ldi r23,0x02
out PORTC,r23 ;на второй индикатор
clr r25 ;обнуляем счетчик
reti
.db 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07 ;заполняем флеш (0...7)



