Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 5.22 KB | None | 0 0
  1. ;-------------------------------------------------------------------------------
  2. ; MSP430 Assembler Code Template for use with TI Code Composer Studio
  3. ;
  4. ;
  5. ;-------------------------------------------------------------------------------
  6.             .cdecls C,LIST,"msp430.h"       ; Include device header file
  7.  
  8. ;-------------------------------------------------------------------------------
  9.             .def    RESET                   ; Export program entry-point to
  10.                                             ; make it known to linker.
  11. ;-------------------------------------------------------------------------------
  12.             .text                           ; Assemble into program memory.
  13.             .retain                         ; Override ELF conditional linking
  14.                                             ; and retain current section.
  15.             .retainrefs                     ; And retain any sections that have
  16.                                             ; references to current section.
  17.  
  18. ;-------------------------------------------------------------------------------
  19. RESET       mov.w   #__STACK_END,SP         ; Initialize stackpointer
  20. StopWDT     mov.w   #WDTPW|WDTHOLD,&WDTCTL  ; Stop watchdog timer
  21.  
  22.  
  23. ;-------------------------------------------------------------------------------
  24. ; Main loop here
  25. ;-------------------------------------------------------------------------------
  26.  
  27. INITALIZATION:
  28.                     BIS.B   #0FFh, &P3DIR   ;okreslamy kierunek przeplywu => port P3 jest podłączony do modułu z wyświetlaczem
  29.                     CLR.B   &P3OUT          ;wyzeruj wyjscia
  30.                    
  31.                     MOV.B   #003h, &P2IE    ;włączanie przerwań dla pinów 1 i 2 należących do portu 2
  32.                     MOV.B   #003h, &P2IES   ;flaga przerwania (xIFG) ustawiana zboczem opadajacym
  33.                     BIS.B   #000h, &P2DIR   ;port P2 ustawiony jako wejściowy => post podłączony do modułu z przyciskami
  34.                     BIS.B   #000h, &P1DIR   ;pirt P1 ustawiony jako wejsciowy => post podłączony do modułu z pokrętłami hex
  35.  
  36.                     MOV.B   &P1IN, R9       ;wczytuje wektor z hexa, rejestr R9 przechowuje liczbę którą będziemy chcieli wyświatlić
  37.                     MOV.B   R9, &P3OUT      ;inicjalizacja wyświetlacza
  38.  
  39.  
  40. MAIN:              
  41.                     MOV.B #000H , R5        ;inicjalizacja flagi mówiącej czy przerwanie nastąpiło poprzez przycisk ładowania
  42.                     MOV.B   R9, &P3OUT      ;wyświetlenie zawartości rejestu R9 na wyświetlaczu
  43.                     MOV.B   #003h, &P2IE    ;włączanie przerwań dla pinów 1 i 2 należących do portu 2
  44.                     BIS.W   #GIE+CPUOFF+OSCOFF+SCG1+SCG0,SR ; wprowadzenie procesowa w tryb energooszczędny => LPM4
  45.                     NOP
  46.  
  47.                     MOV.W   #00D00h, R15    ;inicjalizacja licznika potrzebnego do niwelacji drgań styków
  48.                     MOV.W   #00800h, R14    ;inicjalizacja drugiego z liczników potrzebnych do niwelacji drgań styków   
  49.  
  50.                     BIT.B   #001h,R5        ;sprawdzenie czy przewanie bylo spowodowanie przyciskiem ładowania
  51.                     JZ MAIN                 ;jeżeli tak, to nie musimy unikać drgań styków
  52.  
  53.  
  54. PREVENT_VIBRATIONS:
  55.                     DEC.W   R15             ;zdekrementuj zawartość R15 => licznika
  56.                     JZ      MAIN            ;jeżeli R15 == 0 skocz do MAIN
  57.                     BIT.B   #001h, &P2IN    ;sprawdz czy wciśnięty jest przycisk numer 1
  58.                     JNZ     PREVENT_VIBRATIONS   ;i jeżeli jest  != 0 to skocz do obsługi dragania styków
  59.                     DEC.W   R14             ;zdekrementuj zawartość w rejestrze R14
  60.                     JNZ     PREVENT_VIBRATIONS
  61.                     ;;;;;;;;;;;;;;;;;;;;;;;;
  62. INCREMENT:         
  63.                     BIC.W   #GIE, SR        ;nie przyjmuj przerwań
  64.                     BIT.B   #001h, R6       ;czy oba klawisze są wciśnięte na raz
  65.                     MOV.B   #000h, R6       ;wyzeruj flage
  66.                     JNZ     MAIN            ;jeśli 2 guziki są wciśnięte to nie inkrementujemy
  67.                     INC.B   R9              ;inkrementuj R9
  68.                     MOV.B   R9, &P3OUT      ;wyświetl aktualną liczbę (rejestr R9) na wyświetlacz
  69.                     JMP MAIN
  70.  
  71.  
  72. INTERRUPT:
  73.                     BIT.B   #002h, &P2IN    ;czy drugi przycik (ładowania) jest wciśnięty
  74.                     JZ      INT_LOAD        ;jeżeli tak, to rozpocznik operację ładowania
  75.                     CLR.B   &P2IFG         
  76.                     BIC.W   #CPUOFF, 0(SP)  ;jeżeli nie, to powróć z przerwania po śladzie na stosie
  77.                     RETI
  78.  
  79. INT_LOAD:
  80.                     MOV.B   #000h, R6       ;wyzeruj R6
  81.                     BIT.B   #001h, &P2IN    ;czy pierwszy przycisk jest wciśnięty
  82.                     JNZ     INT_END         ;jezeli nie to skacz do INT_END
  83.                     MOV.B   #001h, R6       ;jeżeli tak to ustaw flagę że dwa wciśnięte
  84.  
  85. INT_END:
  86.                     MOV.B   &P1IN, R9       ;wczytaj wartość z pokręteł do rejestru R9
  87.                     MOV.B   R9, &P3OUT      ;a następnie wyświetl tą wartość na wyświetlaczu
  88.                     MOV.B #001h , R5        ;ustaw flagę mówiącą, że zostało wykonane ładowanie
  89.                     CLR.B   &P2IFG         
  90.                     BIC.W   #CPUOFF+GIE, 0(SP);powróć z przerwania po śladzie na stosie
  91.                     RETI
  92.  
  93.  
  94.  
  95.  
  96. ;-------------------------------------------------------------------------------
  97. ; Stack Pointer definition
  98. ;-------------------------------------------------------------------------------
  99.             .global __STACK_END
  100.             .sect   .stack
  101.  
  102. ;-------------------------------------------------------------------------------
  103. ; Interrupt Vectors
  104. ;-------------------------------------------------------------------------------
  105.             .sect   ".reset"                ; MSP430 RESET Vector
  106.             .short  RESET
  107.             .sect   ".int01"                ;przypisanie przerwań odpowiednim portom
  108.             .short  INTERRUPT
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement