Advertisement
Guest User

Untitled

a guest
Apr 28th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .cseg
  2. .ORG $000 rjmp init
  3. .ORG $002 rjmp SUB_INT0
  4. .ORG $004 rjmp SUB_INT1
  5. .ORG $006 reti
  6. .ORG $008 rjmp TIMER2_delay
  7. .ORG $00A reti
  8. .ORG $00C reti
  9. .ORG $00E reti
  10. .ORG $010 reti
  11. .ORG $012 reti
  12. .ORG $014 rjmp TIMER0_COMP
  13. .ORG $016 reti
  14. .ORG $018 reti
  15. .ORG $01A reti
  16. .ORG $01C reti
  17. .ORG $01E reti
  18. .ORG $020 reti
  19. .ORG $022 reti
  20. .ORG $024 reti
  21. .ORG $026 reti
  22. .ORG $028 reti
  23.  
  24. .def    num_of_mode = R21
  25. .def    kol_in_timer = r1
  26. .def    flag_200ms = r2
  27. .def    flag_100ms = r3
  28. .def    _200_ms = r4
  29. .def    _100_ms = r5
  30. .def    sreg1 = r6
  31. .def    sreg2 = r7
  32. .def    flag_minus = r8
  33. .def    hb = r9
  34. .def    ba = R10
  35. .def    pa = R11
  36. .def    dc = R12
  37. .def    inc_or_dec = R13
  38. .def    port_b = R14
  39. .def    port_c = R15
  40.  
  41.  
  42. .equ    first_mode = 0x01
  43. .equ    second_mode = 0x02
  44. .equ    b = 0x7C
  45. .equ    h = 0x74
  46. .equ    d = 0x5E
  47. .equ    p = 0x73
  48.  
  49.  
  50. mass:
  51.     .db 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71  ; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, C, d, E, F
  52.  
  53. freq:
  54.     .db 0x64, 0x32, 0x21, 0x19, 0x14, 0x10, 0x0e, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x00  ; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 раз в 2 сек
  55.  
  56. init:
  57.  
  58.     ser r16
  59.     out DDRA, r16
  60.     out DDRB, r16
  61.     out DDRC, r16
  62.     com r16
  63.     out DDRD, r16
  64.  
  65.     ldi r16, high(RAMEND)
  66.     out SPH, r16
  67.     ldi r16, low(RAMEND)
  68.     out SPL, r16
  69.  
  70.     ldi r16, 0x0A
  71.     out MCUCR, r16
  72.     ldi r16, 0xC0
  73.     out GICR, r16
  74.  
  75.     ldi r17, b //b
  76.     ldi r18, 0xF7 //a
  77.     clr ba
  78.     inc ba
  79.     mov r19, ba
  80.     clr hb
  81.     inc hb
  82.     clr pa
  83.     inc pa
  84.     clr dc
  85.     clr port_b
  86.     inc port_b
  87.     clr port_c
  88.     inc port_c
  89.     clr inc_or_dec
  90.  
  91.     clr flag_minus
  92.    
  93.     ldi r20, 0x01 // bb = bc = 1
  94.     ldi num_of_mode, first_mode //Номер режима
  95.  
  96.     ldi r26, 0x7f
  97.  
  98.     sei
  99.  
  100. /*-------------------main-----------------------------------*/
  101. main:
  102.    
  103.     mov r19, ba
  104.     mov r22, port_c
  105.     mov r18, port_b
  106.    
  107.     in r16, SREG
  108.     andi r16, 0xFE
  109.  
  110.     mov sreg1, r16
  111.     mov sreg2, r16
  112.     mov _100_ms, r16
  113.  
  114.     cpi num_of_mode, first_mode
  115.  
  116.     breq mode_1_a
  117.  
  118.     ldi r17, b // b
  119.     ldi r18, 0xF7 //a
  120.     rjmp mode_2_a
  121.  
  122. rjmp main
  123.  
  124. /*-------------------------------mode 1---------------------*/
  125. mode_1_a:
  126.     clr r2
  127.     clr r3
  128.     call timer_delay_ini
  129.     ldi r25, 0x0f
  130.     out TCCR2, r25
  131. mode_1:
  132.     mov r24, kol_in_timer
  133.     cpi r24, 0x0b
  134.     breq qwer
  135. asd:
  136.     call get_r24_for_b
  137.     cp r24, r2
  138.     breq qwerty
  139. asd_2:
  140.     cpi num_of_mode, second_mode
  141.     breq main
  142.  
  143. rjmp mode_1
  144.  
  145. main_1:
  146.     rjmp main
  147.  
  148. /*-------------------------------mode 2---------------------*/
  149. mode_2_a:
  150.     clr r2
  151.     call timer_delay_ini
  152.     ldi r25, 0x0f
  153.     out TCCR2, r25
  154. mode_2:
  155.  
  156.     call get_r22
  157.     call get_r19
  158.  
  159.     mov r25, r2
  160.     cpi r25, 0x0f
  161.     brge print
  162.    
  163. hah:
  164.     ldi r24, 0x01
  165.     ldi r16, 0x01
  166.     out PORTA, r16
  167.     out PORTC, r22
  168.     call delay
  169.     lsl r16
  170.  
  171.     out PORTA, r16
  172.     out PORTC, r19
  173.     call delay
  174.     lsl r16
  175.  
  176.     ldi r24, 0x01
  177.     out PORTA, r16
  178.     lsl r16
  179.     out PORTC, r18
  180.     call delay
  181.  
  182.     out PORTA, r16
  183.     out PORTC, r17
  184.     call delay
  185.  
  186.     cpi num_of_mode, first_mode
  187.     breq main_1
  188.  
  189.     sbis PIND, 0
  190.     rjmp next2
  191.     inc inc_or_dec
  192.     rjmp next_my
  193.  
  194.     next2:
  195.     sbis PIND, 1
  196.     rjmp next3
  197.     inc inc_or_dec
  198.     inc inc_or_dec
  199.  
  200. next_my:
  201.     call incr_decr
  202. next3:
  203.  
  204. rjmp mode_2
  205.  
  206.  
  207. qwerty:
  208.     out PORTA, r19
  209.     out SREG, sreg2
  210.     ror r19
  211.     in r16, SREG
  212.     mov sreg2, r16
  213.     clr r2
  214. rjmp asd_2
  215.  
  216.    
  217. qwer:
  218.     out PORTB, r18
  219.     out PORTC, r22
  220.     clr kol_in_timer
  221.     call sreg_and_ror
  222.     call left_or_right
  223. rjmp asd
  224.  
  225. print:
  226.     ldi r22, 0x00
  227.     ldi r19, 0x00
  228.     mov r25, r2
  229.     cpi r25, 0x1e
  230.     brge print_2
  231. rjmp hah
  232.  
  233. print_2:
  234.     clr r2
  235. rjmp hah
  236.  
  237.  
  238. /*-----------------------delay--------------------------------*/
  239. delay:
  240.     call timer_delay_ini
  241.     ldi r25, 0x0d
  242.     out TCCR2, r25
  243. while:
  244.    mov r28, kol_in_timer
  245.  
  246.    cp r28, r24
  247.    breq hi
  248. rjmp while
  249. hi:
  250.  clr r25
  251.  out TCCR2, r25
  252.  out TIMSK, r25
  253. ret
  254.  
  255. /*-----------------------delay_1--------------------------------*
  256. delay_1:
  257.  
  258.     call timer_delay_ini
  259. while:
  260.    mov r28, kol_in_timer
  261.  
  262.    cp r28, r24
  263.    breq hi
  264. rjmp while
  265. hi:
  266.  clr r25
  267.  out TCCR2, r25
  268.  out TIMSK, r25
  269. ret */
  270.  
  271. /*---------------------------timer for button------------------------------*/
  272. TIMER0_COMP:
  273.  
  274.   inc kol_in_timer
  275.   mov r20, kol_in_timer
  276.  
  277.   cpi r20, 0x64
  278.   breq each_200_ms
  279.  
  280.   cpi r20, 0xC8
  281.   breq each_100_ms
  282.  
  283.   mov r20, flag_200ms
  284.   cpi r20, 0x01
  285.   breq each_200_ms
  286.  
  287.   mov r20, flag_100ms
  288.   cpi r20, 0x01
  289.   breq each_100_ms
  290.   rjmp end_itr
  291.  
  292.   each_200_ms:
  293.    
  294.      inc _200_ms
  295.      ldi r20, 0x01
  296.      mov flag_200ms, r20
  297.      clr r20
  298.      mov flag_100ms, r20
  299.      mov r20, _200_ms
  300.      cpi r20, 0x0A
  301.      breq obnul_200
  302.  
  303.   rjmp end_itr
  304.  
  305.    each_100_ms:
  306.    
  307.      inc _100_ms
  308.      ldi r20, 0x01
  309.      mov flag_100ms, r20
  310.      clr r20
  311.      mov flag_200ms, r20
  312.      mov r20, _100_ms
  313.      cpi r20, 0x05
  314.      breq obnul_100
  315.   rjmp end_itr
  316.  
  317.   obnul_200:
  318.     clr r20
  319.     mov _200_ms, r20
  320.     cpi r17, b
  321.     breq _1
  322.  
  323.     cpi r17, h
  324.     breq _2
  325.  
  326.     cpi r17, p
  327.     breq _4
  328.  
  329.     _1:
  330.        mov r20, inc_or_dec
  331.        cpi r20, 0x02
  332.        breq the_dec
  333.          inc ba
  334.     rjmp end_itr
  335.  
  336.        the_dec:
  337.        dec ba
  338.  
  339.     rjmp end_itr
  340.  
  341.     _2:
  342.          call smth_hb
  343.     rjmp end_itr
  344.  
  345.     _4:
  346.         call smth_pa
  347.     rjmp end_itr
  348.    
  349.   obnul_100:
  350.     clr r20
  351.     mov _100_ms, r20
  352.     cpi r17, b
  353.     breq _1
  354.  
  355.     cpi r17, h
  356.     breq _2
  357.  
  358.     cpi r17, p
  359.     breq _4
  360.  
  361.     end_itr:
  362.  
  363. reti
  364.  
  365. /*---------------------------timer for delay------------------------------*/
  366. TIMER2_delay:
  367.  
  368. inc kol_in_timer
  369. inc r2
  370.  
  371. reti
  372.  
  373. /*---------------------------Modes--------------------------------------*/
  374.  
  375. Mode__1:
  376. ldi r17, b //b
  377. ldi r18, 0xF7 //a
  378. mov r19, ba
  379. rjmp end
  380.  
  381. Mode__2:
  382. ldi r17, h //h
  383. ldi r18, 0xFC //b
  384. mov r19, hb
  385. rjmp end
  386.  
  387. Mode__3:
  388. ldi r17, d //d
  389. ldi r18, 0xB9 //c
  390. mov r19, dc
  391. rjmp end
  392.  
  393. Mode__4:
  394. ldi r17, p //p
  395. ldi r18, 0xF7 //a
  396. mov r19, pa
  397. rjmp end
  398.  
  399. /*-----------------------------------int0-------------------------*/
  400. SUB_INT0:
  401.  
  402.     cpi num_of_mode, first_mode
  403.     breq tw
  404.  
  405.     ldi num_of_mode, first_mode
  406.     rjmp ed
  407.  
  408.     tw:
  409.     ldi num_of_mode, second_mode
  410.  
  411.     ed:
  412. reti
  413.  
  414. /*----------------------------------int1---------------------------*/
  415. SUB_INT1:
  416.  
  417.     cpi r17, b
  418.     breq Mode__2
  419.  
  420.     cpi r17, h
  421.     breq Mode__3
  422.  
  423.     cpi r17, d
  424.     breq Mode__4
  425.  
  426.     cpi r17, p
  427.     breq Mode__1
  428.  
  429.     end:
  430. reti
  431.  
  432. /*----------------------------Извлечение из массива нужного символа для последнего индикатора---------------------*/
  433. get_r22:
  434.  
  435. ldi zl, low(mass<<1) ; загрузка в регистр ZL low адреса массива mass
  436. ldi zh, high(mass<<1) ; загрузка в регистр ZH high адреса массива mass
  437.  
  438. call what_parametr
  439.  mov r22, r19
  440.  andi r22, 0x0F
  441.  
  442.  ldi r20, 0x00
  443.  cycle:
  444.    cp r20, r22
  445.    breq get_elem
  446.    adiw Z, 1
  447.    inc r20
  448.  rjmp cycle
  449.  
  450.  get_elem:
  451.  lpm r0, Z ; загрузка данных в регистр r0
  452.  mov r22, r0 ; чтение данных из регистра r0 в r16
  453.  
  454.  
  455. ret
  456.  
  457. /*----------------------------Извлечение из массива нужного символа для предпоследнего индикатора---------------------*/
  458. get_r19:
  459.  
  460. call what_parametr
  461.  lsr r19
  462.  lsr r19
  463.  lsr r19
  464.  lsr r19
  465.  
  466.  cpi r17, h
  467.  breq check_minus
  468.  
  469.  rjmp without
  470.  
  471. check_minus:
  472.  mov r20, flag_minus
  473.  cpi r20, 0x01
  474.  breq minus
  475.  
  476.  without:
  477.  
  478. ldi zl, low(mass<<1) ; загрузка в регистр ZL low адреса массива mass
  479. ldi zh, high(mass<<1) ; загрузка в регистр ZH high адреса массива mass
  480.  
  481.  ldi r20, 0x00
  482.  cycle2:
  483.    cp r20, r19
  484.    breq get_elem2
  485.    adiw Z, 1
  486.    inc r20
  487.  rjmp cycle2
  488.  
  489.  get_elem2:
  490.  lpm r0, z ; загрузка данных в регистр r0
  491.  mov r19, r0 ; чтение данных из регистра r0 в r16
  492.  rjmp to_end
  493.  
  494.  minus:
  495.    ldi r19, 0x40
  496.  
  497. to_end:
  498.  
  499. ldi r24, 0x14
  500. ret
  501.  
  502. /*----------------------------Иниациализация таймеров---------------------*/
  503. timer_ini:
  504.  
  505. ldi r20, 0x00
  506. mov kol_in_timer, r20
  507. mov flag_200ms, r20
  508. mov flag_100ms, r20
  509. mov _200_ms, r20
  510. mov _100_ms, r20
  511. clr r16
  512. out TCNT0, r16
  513. ldi r16, 0x08
  514. out TCCR0, r16
  515. ldi r16, 0x9b
  516. out OCR0, r16
  517. ldi r16, 0x02
  518. out TIMSK, r16
  519. out TIFR, r16
  520. ldi r16, 0x0D
  521. out TCCR0, r16
  522. ret
  523.  
  524. timer_delay_ini:
  525.  
  526. clr kol_in_timer
  527. clr r25
  528. out TCNT2, r25/*
  529. ldi r25, 0x08
  530. out TCCR2, r25*/
  531. ldi r25, 0x9b
  532. out OCR2, r25
  533. ldi r25, 0x80
  534. out TIMSK, r25
  535. out TIFR, r25/*
  536. ldi r25, 0x0f
  537. out TCCR2, r25*/
  538. ret
  539. /*-------------------------------------------------------------------------------------------*/
  540.  
  541. inc_ba:
  542.  
  543.  mov r20, inc_or_dec
  544.  cpi r20, 0x02
  545.  breq decr
  546.     inc ba
  547.     call timer_ini
  548.  
  549.     wait2:          ;Цикл ожидания, пока нажата кнопка
  550.          sbic PIND, 0 ;Если РВ2=1 (кнопка SB2 отпущена), пропустить след. строку
  551.     rjmp wait2
  552.     rjmp nul1
  553.  
  554. decr:
  555.     dec ba
  556.     call timer_ini
  557.    
  558.      wait7:          ;Цикл ожидания, пока нажата кнопка
  559.          sbic PIND, 1 ;Если РВ2=1 (кнопка SB2 отпущена), пропустить след. строку
  560.     rjmp wait7
  561.  
  562. nul1:
  563.     clr r20
  564.     out TCCR0, r20
  565.     clr inc_or_dec
  566.     out TIMSK, r20
  567.     mov r19, ba
  568. ret
  569.  
  570.  
  571. inc_hb:
  572.  
  573. call smth_hb
  574.  
  575.   mov r20, inc_or_dec
  576.  cpi r20, 0x02
  577.  breq decr3
  578. call timer_ini
  579.  
  580.  wait3:          ;Цикл ожидания, пока нажата кнопка
  581.     sbic PIND, 0 ;Если РВ2=1 (кнопка SB2 отпущена), пропустить след. строку
  582. rjmp wait3
  583. rjmp stop
  584.  
  585. decr3:
  586.  call timer_ini
  587.  
  588.  wait8:          ;Цикл ожидания, пока нажата кнопка
  589.     sbic PIND, 1 ;Если РВ2=1 (кнопка SB2 отпущена), пропустить след. строку
  590. rjmp wait8
  591.  
  592. stop:
  593. clr r20
  594. out TCCR0, r20
  595. out TIMSK, r20
  596. clr inc_or_dec
  597. mov r19, hb
  598.  
  599. ret
  600.  
  601. inc_pa:
  602.  
  603. call smth_pa
  604.  
  605.   mov r20, inc_or_dec
  606.  cpi r20, 0x02
  607.  breq decr9
  608. call timer_ini
  609.  
  610.  wait4:          ;Цикл ожидания, пока нажата кнопка
  611.     sbic PIND, 0 ;Если РВ2=1 (кнопка SB2 отпущена), пропустить след. строку
  612. rjmp wait4
  613. rjmp stop2
  614.  
  615. decr9:
  616.  call timer_ini
  617.  
  618.  wait10:          ;Цикл ожидания, пока нажата кнопка
  619.     sbic PIND, 1 ;Если РВ2=1 (кнопка SB2 отпущена), пропустить след. строку
  620. rjmp wait10
  621.  
  622. stop2:
  623. clr r20
  624. out TCCR0, r20
  625. out TIMSK, r20
  626. clr inc_or_dec
  627. mov r19, pa
  628.  
  629. ret
  630.  
  631. /*-------------------какие числа выводим на индикаторы--------------------------*/
  632. what_parametr:
  633.  
  634. cpi r17, b
  635. breq Mode_one
  636.  
  637. cpi r17, h
  638. breq Mode_two
  639.  
  640. cpi r17, d
  641. breq Mode_three
  642.  
  643. cpi r17, p
  644. breq Mode_four
  645.  
  646. Mode_one:
  647.   mov r19, ba
  648. rjmp bye
  649.  
  650. Mode_two:
  651.   mov r19, hb
  652. rjmp bye
  653.  
  654. Mode_three:
  655.   mov r19, dc
  656. rjmp bye
  657.  
  658. Mode_four:
  659.   mov r19, pa
  660. rjmp bye
  661.  
  662. bye:  
  663. ret
  664.  
  665. smth_hb:
  666.  mov r20, inc_or_dec
  667.  cpi r20, 0x02
  668.  breq decr2
  669.  
  670.     mov r20, flag_minus
  671.     cpi r20, 0x01
  672.     breq minus_or_not
  673.  
  674.     mov r20, hb
  675.     cpi r20, 0x04
  676.     breq set_minus
  677.  
  678.     inc hb
  679.     rjmp okeey
  680.  
  681.     minus_or_not:
  682.         dec hb
  683.         mov r20, hb
  684.         cpi r20, 0x00
  685.         breq nul_flag
  686.     rjmp okeey
  687.  
  688.     set_minus:
  689.         ldi r20, 0x01
  690.         mov flag_minus, r20
  691.     rjmp okeey
  692.  
  693.     nul_flag:
  694.         clr flag_minus
  695.     rjmp okeey
  696.  
  697. decr2:
  698.    mov r20, flag_minus
  699.     cpi r20, 0x01
  700.     breq minus_or_not2
  701.  
  702.     mov r20, hb
  703.     cpi r20, 0x00
  704.     breq set_minus2
  705.  
  706.     dec hb
  707.     rjmp okeey
  708.  
  709.     minus_or_not2:
  710.         mov r20, hb
  711.         cpi r20, 0x04
  712.         breq nul_flag2
  713.         inc hb
  714.         mov r20, hb
  715.     rjmp okeey
  716.  
  717.     set_minus2:
  718.         ldi r20, 0x01
  719.         inc hb
  720.         mov flag_minus, r20
  721.     rjmp okeey
  722.  
  723.     nul_flag2:
  724.         clr flag_minus
  725.  
  726.    okeey:
  727.  
  728. ret
  729.  
  730. smth_pa:
  731.   mov r20, inc_or_dec
  732.  cpi r20, 0x02
  733.  breq decr5
  734.  
  735.     mov r20, pa
  736.     cpi r20, 0x0F
  737.     breq get_one
  738.     inc pa
  739.     rjmp next_step
  740.     get_one:
  741.         clr pa
  742.         inc pa
  743.     rjmp next_step
  744.  
  745. decr5:
  746.  
  747.     mov r20, pa
  748.     cpi r20, 0x00
  749.     breq get_one2
  750.     dec pa
  751.     rjmp next_step
  752.     get_one2:
  753.         ldi r20, 0x0F
  754.         mov pa, r20
  755.     rjmp next_step
  756.  
  757.    next_step:
  758.  
  759. ret
  760.  
  761. incr_decr:
  762.  
  763.     cpi r17, b
  764.     breq mode_ba
  765.  
  766.     cpi r17, h
  767.     breq mode_hb
  768.  
  769.     cpi r17, p
  770.     breq mode_pa
  771.  
  772.     mode_ba:
  773.     call inc_ba
  774.     rjmp next
  775.  
  776.     mode_hb:
  777.     call inc_hb
  778.     rjmp next
  779.  
  780.     mode_pa:
  781.     call inc_pa
  782.     rjmp next
  783. next:
  784.  
  785. ret
  786.  
  787. left_or_right:
  788.  
  789.     mov r23, flag_minus
  790.     cpi r23, 0x01
  791.     breq left
  792.  
  793.     ldi r23, 0x00
  794.     while_right:
  795.          cp r23, hb
  796.          breq exitt
  797.          out SREG, _100_ms
  798.          ror r18
  799.          in r16, SREG
  800.          mov _100_ms, r16
  801.          inc r23
  802.     rjmp while_right
  803.  
  804.     left:
  805.       ldi r23, 0x00
  806.       while_left:
  807.          cp r23, hb
  808.          breq exitt
  809.          out SREG, _100_ms
  810.          rol r18
  811.          in r16, SREG
  812.          mov _100_ms, r16
  813.          inc r23
  814.       rjmp while_left
  815.    exitt:
  816.  
  817. ret
  818.  
  819. get_r24_for_b:
  820.  
  821. ldi zl, low(freq<<1) ; загрузка в регистр ZL low адреса массива mass
  822. ldi zh, high(freq<<1) ; загрузка в регистр ZH high адреса массива mass
  823.  
  824.     mov r28, pa
  825.     dec r28
  826.     ldi r24, 0x00
  827.     cycle72:
  828.       cp r24, r28
  829.       breq get_elem72
  830.       adiw Z, 1
  831.       inc r24
  832.     rjmp cycle72
  833.  
  834.     get_elem72:
  835.     lpm r0, z ; загрузка данных в регистр r0
  836.     mov r24, r0 ;
  837.  
  838. ret
  839.  
  840. sreg_and_ror:
  841.  
  842. out SREG, sreg1
  843.     ror r22
  844.     in r16, SREG
  845.     mov sreg1, r16
  846.  
  847. /*  out SREG, sreg2
  848.     ror r19
  849.     in r16, SREG
  850.     mov sreg2, r16*/
  851.  
  852. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement