Advertisement
Guest User

morse

a guest
May 4th, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2.  
  3. rjmp    INIT
  4.  
  5. BTAB:
  6.     .db     $60,$88,$A8,$90,$40,$28,$D0,$08,$20,$78,$B0,$48,$E0,$A0,$F0,$68,$D8,$50,$10,$C0,$30,$18,$70,$98,$B8,$C8 ;dessa ska ASCI tecknet omvandlas till, ska ligga i microkomtrollensprogramminne hur skriver vi detta? (nuflach)
  7.    
  8.  
  9. MESSAGE:
  10.     .db     "MESSAGE", $00                  ;ord vi vill skriva ut följt av nollor för att markera slutet av ordet /sista bokstaven
  11.  
  12.     .def    r20 = char
  13. ;---------------------------------------------------------------------------------------------------------------------------------
  14. INIT:
  15.     ldi r24, HIGH(RAMEND)                   ;sätter stacken och stackpekarna
  16.     out SPH,r24
  17.     ldi r24, LOW(RAMEND)
  18.     out SPL,r24
  19.  
  20.     clr     r18
  21.     out     DDRA,r18                        ;sätter vilka utsignaler och in signale vi ska ha
  22.     ldi     r18, $8F
  23.     out     DDRB, r18
  24.  
  25. START:
  26.     call    MORSE                           ;
  27.     jmp     START
  28.  
  29. ;--------------------------------------------------------------------------------------------------------------------------------
  30. MORSE:                                      ;Huvudprogrammet som sänder hela strängen.
  31.     ldi     ZH,HIGH(MESSAGE * 2)            ;Sätter stack pekarna     
  32.     ldi     ZL,LOW(MESSAGE * 2)
  33.     rcall   GET_CHAR                        ;hämtar bokstäver tills NUL. dvs finns inga fler  
  34.  
  35. MORSE_BACK:
  36.     call    LOOKUP
  37.     call    SEND
  38.     call    NOBEEP(2N)                      ;2N tystnad
  39.     call    GET_CHAR
  40.     cpi     char, 0                         ;jämför char med noll, if 0 -> slut på bokstäver
  41.     brne    MORSE_BACK
  42.     ret                                     ; hoppar tillbaka till START som gör att porgrammet körs igen
  43. ;-------------------------------------------------------------------------------------------------------------
  44. GET_CHAR:                                   ;Hamtar nästa ascii-tecken ur stangen.
  45.     lpm     char, Z+                        ;load from program memory, laddar in i r20, Z+ medför att vi fortsätter att peka på nästa bokstav tills noll
  46.     ret
  47. ;-------------------------------------------------------------------------------------------------------------
  48. CYCLE:
  49.     brts    JMPING                          ;om t flaggan är satt hoppa till 'JUMPING' falggan sätts i NOBEEP
  50.     sbi     PORTB,0                         ;genererar ljud, tyst /eller inte
  51. JMPING:
  52.     call    DELAY
  53.     cbi     PORTB,0                         ;medför inget ljud
  54.     call    DELAY
  55.     ret
  56.  
  57. ;-----------------------------------------------------------------------------------------------------------------------------------------------
  58. LOOKUP: ;översatter ascii-tecken till binärkod. hämta tabell ta det vi läser in från r 20 minu $41 för att få fram rätt index för rätt bokstav i tabellen "BTAB"
  59.     ;ldi        r21,$41 ; z pekaren anänvs för att peka ut rätt bokstav
  60.     push    ZH                              ;sprar undan värdena i ZH / ZL till stacken
  61.     push    ZL
  62.     ldi     ZH,HIGH(BTAB * 2)               ;sätter nya stackpekare som pekar på tabellen BTAB
  63.     ldi     ZL,LOW(BTAB * 2)
  64.     subi    char,$41                        ;char minus $41 motsvarande A i tabell fr att få rätt index
  65.     add     ZL,char                         ; adderar till Z Low
  66.     lpm     char,Z                          ; laddar in i r20= char
  67.     pop     ZL                              ;pop:ar stacken så vi får tillbka värdena på pekarna
  68.     pop     ZH
  69.     ret
  70. ;------------------------------------------------------------------------------------------------------------------------------------------------
  71. SEND: ;Skickar iväg ett tecken ska vänsterskifta tills hela byten blir 0 och en etta i carry flaggan
  72.                            
  73.     lsl     char                            ; vänsterb shift
  74.     brcs    BEEP(3N)                        ; carry satt      -> BEEP 3N
  75.     brcc    BEEP(N)                         ; carry INTE satt -> BEEP  N
  76.     brne    SEND                            ; loopar så länge char =! 0
  77.     ret
  78. ;------------------------------------------------------------------------------------------------------------------------------------------------
  79.                
  80. BEEP(N):     ;Piper i hogtalaren tiden N.
  81.     ldi     r22,$1
  82.     call    CYCLE
  83.     dec     r16
  84.     brne    BEEP(N)
  85.     ret
  86.  
  87. BEEP(3N):    ;Piper i hogtalaren tiden N.
  88.     ldi     r22,$3
  89.     call    CYCLE
  90.     dec     r16
  91.     brne    BEEP(3N)
  92.     ret
  93.  
  94. NOBEEP(2N):;Piper inte i hogtalaren tiden N.
  95.     ldi     r24,$2
  96.     set                                     ;sätter T-flaggan "tempoary flag"
  97.     call    CYCLE              
  98.     clt                                     ;clear t flaggan
  99.     dec     r24
  100.     brne    NOBEEP(2N)
  101.     ret
  102. ;------------------------------------------------------------------------------------------------------------------------------------------------
  103. DELAY:
  104.     sbi     PORTB,7
  105.     ldi     r16, 6
  106.  
  107. delayYttreLoop:
  108.     ldi     r17,$1F
  109.  
  110. delayInreLoop:
  111.     dec     r17
  112.     brne    delayInreLoop
  113.     dec     r16
  114.     brne    delayYttreLoop
  115.     cbi     PORTB,7  
  116.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement