Advertisement
Guest User

Untitled

a guest
May 9th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .CSEG
  2. .ORG 0x00
  3.     rjmp prg
  4.  
  5. .ORG 0x32
  6. sevenseg: .DB 0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71
  7.             //0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   A,   B,   C,   D,   E,   F
  8.  
  9.  
  10. .DSEG
  11. .ORG 0x120
  12. high_counter: .BYTE 1
  13. low_counter: .BYTE 1
  14.  
  15.  
  16.  
  17. .CSEG
  18. .ORG 0x100
  19. prg:
  20. //Inicjalizacja stosu
  21. ldi r16, high(ramend)
  22. out sph, r16
  23. ldi r16, low(ramend)
  24. out spl, r16
  25. ///////////
  26.  
  27. ldi r16, 0xff  
  28. out ddrd, r16   ;Ustawienie portu D na wyjście
  29.  
  30.  
  31. ldi r16, 0x00
  32. ldi r17, 0x00
  33.     main:
  34.     sts low_counter,r16     ;Zapisanie wartości licznika przed wysłaniem do display
  35.     sts high_counter,r17
  36.  
  37.     ldi r18, 0x15   ;Wielokrotne wywołanie display, by licznik działał z częstotliwością ok. 1 --- 85 * 4 * 0.0029296875s = 1s ---- r19 = 0x55
  38.     inner:
  39.         call display
  40.         dec r18
  41.         brne inner
  42.  
  43.  
  44.     ldi r18, 0x01   ;Inkrementowanie bitów mniej znaczących
  45.     add r16, r18
  46.     ldi r18, 0x00   ;Inkrementowanie bitów bardziej znaczących (dodawanie reszty)
  47.     adc r17, r18
  48.  
  49.     rjmp main
  50.  
  51.  
  52.  
  53. //Wyświetl wartość licznika
  54. display:
  55.     push r16
  56.     push r17
  57.     push r18
  58.     push r19
  59.  
  60.     lds r16,low_counter ;Załaduj wartość licznika
  61.     lds r17,high_counter
  62.  
  63.     ///////////////
  64.     ldi r18, 0x01   ;Uaktywnij pierwszą cyfrę
  65.     out ddrb, r18
  66.  
  67.     ldi ZL,low(2*sevenseg)
  68.     ldi ZH,high(2*sevenseg)
  69.  
  70.     mov r18,r16     ;Kopiuj wartość low licznika
  71.     andi r18,0x0f   ;Weź mniej znaczący bit
  72.     ldi r19,0x01
  73.     add r18,r19     ;Dodaj jeden, by pętla się nie zjebała (dla r19 = 0 będzie dec 1)
  74.     choose_1:
  75.         lpm r19, Z+ ;Pobieranie zawartości rejestru Z (kody kolejnych cyfr wyświetlacza) tak długo, aż dostanie wymaganą
  76.         dec r18
  77.         brne choose_1
  78.     out portd, r19
  79.     call wait
  80.     ///////////////
  81.     ldi r18, 0x02   ;Uaktywnij drugą cyfrę
  82.     out ddrb, r18
  83.  
  84.     ldi ZL,low(2*sevenseg)
  85.     ldi ZH,high(2*sevenseg)
  86.  
  87.     mov r18,r16     ;Kopiuj wartość low licznika
  88.     swap r18
  89.     andi r18,0x0f   ;Weź bardziej znaczący bit
  90.     ldi r19,0x01
  91.     add r18,r19     ;Dodaj jeden, by pętla się nie zjebała (dla r19 = 0 będzie dec 1)
  92.     choose_2:
  93.         lpm r19, Z+ ;Pobieranie zawartości rejestru Z (kody kolejnych cyfr wyświetlacza) tak długo, aż dostanie wymaganą
  94.         dec r18
  95.         brne choose_2
  96.     out portd, r19
  97.     call wait
  98.     //////////////
  99.     ldi r18, 0x04   ;Uaktywnij trzecią cyfrę
  100.     out ddrb, r18
  101.  
  102.     ldi ZL,low(2*sevenseg)
  103.     ldi ZH,high(2*sevenseg)
  104.  
  105.     mov r18,r17     ;JW tylko z wartościa high licznika
  106.     andi r18,0x0f
  107.     ldi r19,0x01
  108.     add r18,r19
  109.     choose_3:
  110.         lpm r19, Z+
  111.         dec r18
  112.         brne choose_3
  113.     out portd, r19
  114.     call wait
  115.     //////////////
  116.     ldi r18, 0x08   ;Uaktywnij czwartą cyfrę
  117.     out ddrb, r18
  118.  
  119.     ldi ZL,low(2*sevenseg)
  120.     ldi ZH,high(2*sevenseg)
  121.  
  122.     mov r18,r17
  123.     swap r18
  124.     andi r18,0x0f
  125.     ldi r19,0x01
  126.     add r18,r19
  127.     choose_4:
  128.         lpm r19, Z+
  129.         dec r18
  130.         brne choose_4
  131.     out portd, r19
  132.     call wait
  133.     //////////////
  134.  
  135.  
  136.     pop r19
  137.     pop r18
  138.     pop r17
  139.     pop r16
  140.     ret
  141.  
  142.  
  143.  
  144. //256*256*80 --- ok. 1s
  145. //Czekaj 0.0029296875s
  146. wait:
  147.     push r16
  148.     push r17
  149.     /******************/
  150.     ldi r16,0xff
  151.     loop_1:
  152.         ldi r17,0x3C
  153.         loop_2:
  154.             dec r17
  155.         brne loop_2
  156.         dec r16
  157.     brne loop_1
  158.     /******************/
  159.     pop r17
  160.     pop r16
  161.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement