Advertisement
Guest User

Untitled

a guest
Apr 26th, 2018
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. jmp RESET ;reset HANDLER
  2. jmp EXT_INT0 ; IrQ0 HANDLER
  3. jmp EXT_INT1 ; IrQ1 HANDLER
  4. jmp EMPTY_HANDLER
  5. jmp EMPTY_HANDLER
  6. jmp EMPTY_HANDLER
  7. jmp EMPTY_HANDLER
  8. jmp EMPTY_HANDLER
  9. jmp EMPTY_HANDLER
  10. jmp EMPTY_HANDLER
  11. jmp EMPTY_HANDLER
  12. jmp EMPTY_HANDLER
  13. jmp EMPTY_HANDLER
  14. jmp EMPTY_HANDLER
  15. jmp EMPTY_HANDLER
  16. jmp EMPTY_HANDLER
  17. jmp EMPTY_HANDLER
  18. jmp EMPTY_HANDLER
  19. jmp EMPTY_HANDLER
  20. jmp EMPTY_HANDLER
  21. jmp EMPTY_HANDLER
  22.  
  23. RESET:
  24. ser r20
  25. out SPL, r20 ; указатель на вершину стека 255
  26. out DDrA,r20; настраиваем порт А на выход
  27. out DDrB,r20; настраиваем порт B на выход
  28. out DDrC,r20; настраиваем порт C на выход
  29. ldi r20,0xf3
  30. out DDrD,r20; настраиваем порт D на выход
  31. clr r20;очищаем регистр
  32. out SPH,r20; указатель на вершину стека 0
  33. sei;включаем прерывания
  34. ldi r20,0x0f
  35. out MCUCr, r20
  36. ldi r20,0xc0
  37. out GICr, r20
  38.  
  39. main:
  40.     LDI r16, 1; rA
  41.     LDI r17, 0; rB
  42.     LDI r18, 0; rC
  43.     LDI r19, 1; rX
  44.     LDI r23, 1; rN - сколько диодов
  45.  
  46. output:
  47.     out PORTA, r16
  48.     out PORTB, r17
  49.     out PORTC, r18
  50.     mov r20, r19; Записываем значение шага в регистр
  51.     cpi r19,0
  52.     brsh count_step_plus
  53.     brlo count_step_minus
  54.  
  55. count_step_plus: ; При положительном движении считаем след. позицию 3 регистров
  56.     ldi r21,0
  57.     cpi r20,0
  58.     breq light ;Если уже 0, то просто включаем систему
  59.     dec r20; Иначе уменьшаем этот регистр и делаем сдвиги
  60.     ;Запоминаем 7 бит порта А, заносим в регистр 21 на 0 место и сдвигаем влево оба регистра
  61.     bst r16,7
  62.     bld r21,0
  63.     lsl r21
  64.     lsl r16
  65.     ; Запоминаем 7 бит порта B, заносим в регистр 21 на 0 место и сдвигаем влево
  66.     bst r17, 7
  67.     bld r21,0
  68.     lsl r21
  69.     lsl r17
  70.     ; Запоминаем 7 бит порта С в 0 бит r21, сдвигаем влево порт С
  71.     bst r18,7
  72.     bld r21, 0
  73.     lsl r18
  74.     ;Теперь берем значение R21 и копируем в R22, сдвигаем R21 сразу вправо, делаем ANDI с единицей и прибавляем результат к соотв. регистру
  75.     mov r22,r21
  76.     lsr r21
  77.     andi r22, 1
  78.     add r16,r22
  79.     ;
  80.     mov r22,r21
  81.     lsr r21
  82.     andi r22, 1
  83.     add r17, r22
  84.     ;
  85.     mov r22, r21
  86.     lsr r21
  87.     andi r22, 1
  88.     add r17, r22
  89.     ;Все, диоды сдвинулись на влево 1 шаг и будут двигаться так, пока не сдвинутся на значение регистра X
  90.     jmp count_step_plus
  91.  
  92. count_step_minus: ;Если шаг отрицательный и надо двигаться влево
  93.     ldi r21,0
  94.     cpi r20,0
  95.     breq light
  96.     inc r20
  97.     ;porta
  98.     bst r16,0
  99.     bld r21,7
  100.     lsr r21
  101.     lsr r16
  102.     ;portb
  103.     bst r17,0
  104.     bld r21,7
  105.     lsr r21
  106.     lsr r17
  107.     ;portc
  108.     bst r18,0
  109.     bld r21,0
  110.     lsr r18
  111.     ;Теперь делаем andi c 128 и ставим в 7 биты портов результат
  112.     ;portc->portb
  113.     mov r22, r21
  114.     lsl r21
  115.     andi r22,128
  116.     add r17,r22
  117.     ;portb->porta
  118.     mov r22, r21
  119.     lsl r21
  120.     andi r22,128
  121.     add r16,r22
  122.     ;porta->portc
  123.     mov r22, r21
  124.     lsl r21
  125.     andi r22,128
  126.     add r18,r22
  127.     ;Все, диоды сдвинулись на один шаг вправо и будут делать так, пока не сдвинутся вправо на X
  128.     jmp count_step_minus
  129. ;Тут выводим информацию о шаге и количестве горящих диодов
  130. light:
  131.     cpi r19,0
  132.     brsh info_pos
  133.     brlo info_neg
  134.  
  135. info_pos:
  136.     mov r22, r19
  137.     lsr r22
  138.     lsr r22
  139.     lsr r22
  140.     lsr r22
  141.     add r22, r23
  142.     out PORTD, r22
  143.     call delay
  144.     jmp output
  145.  
  146. info_neg:
  147.     mov r22, r19
  148.     lsr r22
  149.     lsr r22
  150.     lsr r22
  151.     lsr r22
  152.     add r22, r23
  153.     sbr r22, 7
  154.     out PORTD, r22
  155.     call delay
  156.     jmp output
  157.  
  158. delay:
  159. ldi r29,9;z
  160. ldi r30,28;y
  161. ldi r31,50;x
  162. delay_1:
  163. dec r31
  164. brne delay_1
  165. nop
  166. dec r30
  167. brne delay_1
  168. dec r29
  169. brne delay_1
  170. ret
  171.  
  172.  
  173. EXT_INT0: ;Прерывание инт0, сравниваем сколько уже горит линий, если 3, то ставим регистры r23, r24 равными 0 и r2 = 1, иначе просто  инкремент r2
  174. ;Если равен 1 то прыгаем на метку где прибавляем к RA единицу и прыгаем на output
  175.     cpi r23,1
  176.     breq diod
  177.     cpi r23,2
  178.     breq diod
  179.     dec r23
  180.     dec r23
  181.     clr r17
  182.     clr r18
  183.     clr r16
  184.     ldi r16, 1
  185.     jmp INT0_end
  186.  
  187. diod:
  188.     inc r23
  189.     inc r16
  190.     jmp INT0_END
  191.    
  192. INT0_END:
  193.     reti
  194.  
  195. EXT_INT1:;Прерывание инт1, сравниваем шаг с 4, если не равен, то просто инкремент, иначе ставим значение -4 и вызываем свет
  196.     cpi r19, 4
  197.     breq set_xmin
  198.     inc r19
  199. INT1_END:
  200.     reti
  201. ;Ставим -4 и выходим из прерывания
  202. set_xmin:
  203.     LDI r19, -4
  204.     jmp INT1_END
  205.  
  206. EMPTY_HANDLER:
  207.     reti
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement