Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- jmp RESET ;reset HANDLER
- jmp EXT_INT0 ; IrQ0 HANDLER
- jmp EXT_INT1 ; IrQ1 HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- jmp EMPTY_HANDLER
- RESET:
- ser r20
- out SPL, r20 ; указатель на вершину стека 255
- out DDrA,r20; настраиваем порт А на выход
- out DDrB,r20; настраиваем порт B на выход
- out DDrC,r20; настраиваем порт C на выход
- ldi r20,0xf3
- out DDrD,r20; настраиваем порт D на выход
- clr r20;очищаем регистр
- out SPH,r20; указатель на вершину стека 0
- sei;включаем прерывания
- ldi r20,0x0f
- out MCUCr, r20
- ldi r20,0xc0
- out GICr, r20
- main:
- LDI r16, 1; rA
- LDI r17, 0; rB
- LDI r18, 0; rC
- LDI r19, 1; rX
- LDI r23, 1; rN - сколько диодов
- output:
- out PORTA, r16
- out PORTB, r17
- out PORTC, r18
- mov r20, r19; Записываем значение шага в регистр
- cpi r19,0
- brsh count_step_plus
- brlo count_step_minus
- count_step_plus: ; При положительном движении считаем след. позицию 3 регистров
- ldi r21,0
- cpi r20,0
- breq light ;Если уже 0, то просто включаем систему
- dec r20; Иначе уменьшаем этот регистр и делаем сдвиги
- ;Запоминаем 7 бит порта А, заносим в регистр 21 на 0 место и сдвигаем влево оба регистра
- bst r16,7
- bld r21,0
- lsl r21
- lsl r16
- ; Запоминаем 7 бит порта B, заносим в регистр 21 на 0 место и сдвигаем влево
- bst r17, 7
- bld r21,0
- lsl r21
- lsl r17
- ; Запоминаем 7 бит порта С в 0 бит r21, сдвигаем влево порт С
- bst r18,7
- bld r21, 0
- lsl r18
- ;Теперь берем значение R21 и копируем в R22, сдвигаем R21 сразу вправо, делаем ANDI с единицей и прибавляем результат к соотв. регистру
- mov r22,r21
- lsr r21
- andi r22, 1
- add r16,r22
- ;
- mov r22,r21
- lsr r21
- andi r22, 1
- add r17, r22
- ;
- mov r22, r21
- lsr r21
- andi r22, 1
- add r17, r22
- ;Все, диоды сдвинулись на влево 1 шаг и будут двигаться так, пока не сдвинутся на значение регистра X
- jmp count_step_plus
- count_step_minus: ;Если шаг отрицательный и надо двигаться влево
- ldi r21,0
- cpi r20,0
- breq light
- inc r20
- ;porta
- bst r16,0
- bld r21,7
- lsr r21
- lsr r16
- ;portb
- bst r17,0
- bld r21,7
- lsr r21
- lsr r17
- ;portc
- bst r18,0
- bld r21,0
- lsr r18
- ;Теперь делаем andi c 128 и ставим в 7 биты портов результат
- ;portc->portb
- mov r22, r21
- lsl r21
- andi r22,128
- add r17,r22
- ;portb->porta
- mov r22, r21
- lsl r21
- andi r22,128
- add r16,r22
- ;porta->portc
- mov r22, r21
- lsl r21
- andi r22,128
- add r18,r22
- ;Все, диоды сдвинулись на один шаг вправо и будут делать так, пока не сдвинутся вправо на X
- jmp count_step_minus
- ;Тут выводим информацию о шаге и количестве горящих диодов
- light:
- cpi r19,0
- brsh info_pos
- brlo info_neg
- info_pos:
- mov r22, r19
- lsr r22
- lsr r22
- lsr r22
- lsr r22
- add r22, r23
- out PORTD, r22
- call delay
- jmp output
- info_neg:
- mov r22, r19
- lsr r22
- lsr r22
- lsr r22
- lsr r22
- add r22, r23
- sbr r22, 7
- out PORTD, r22
- call delay
- jmp output
- delay:
- ldi r29,9;z
- ldi r30,28;y
- ldi r31,50;x
- delay_1:
- dec r31
- brne delay_1
- nop
- dec r30
- brne delay_1
- dec r29
- brne delay_1
- ret
- EXT_INT0: ;Прерывание инт0, сравниваем сколько уже горит линий, если 3, то ставим регистры r23, r24 равными 0 и r2 = 1, иначе просто инкремент r2
- ;Если равен 1 то прыгаем на метку где прибавляем к RA единицу и прыгаем на output
- cpi r23,1
- breq diod
- cpi r23,2
- breq diod
- dec r23
- dec r23
- clr r17
- clr r18
- clr r16
- ldi r16, 1
- jmp INT0_end
- diod:
- inc r23
- inc r16
- jmp INT0_END
- INT0_END:
- reti
- EXT_INT1:;Прерывание инт1, сравниваем шаг с 4, если не равен, то просто инкремент, иначе ставим значение -4 и вызываем свет
- cpi r19, 4
- breq set_xmin
- inc r19
- INT1_END:
- reti
- ;Ставим -4 и выходим из прерывания
- set_xmin:
- LDI r19, -4
- jmp INT1_END
- EMPTY_HANDLER:
- reti
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement