Advertisement
Guest User

Untitled

a guest
Jan 13th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 5.46 KB | None | 0 0
  1. #include<p16f1517.inc>
  2. #define LE_L PORTC,4
  3. #define LE_H PORTC,5            ;definicja pomocniczych nazw
  4. #define BL PORTC,2
  5. #define DP PORTC,6
  6.    
  7. WL equ 0x31
  8. WH equ 0x30                 ;definicja pomocniczych nazw
  9. NL equ 0x41
  10. NH equ 0x40
  11. TEMP equ 0x50
  12.  
  13.     org 0x00
  14.     goto ustawienia
  15.     org 0x04
  16.     goto przerwanie
  17.    
  18. ustawienia
  19.     __CONFIG _CONFIG1 ,_FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _BOREN_OFF &_CLKOUTEN_OFF
  20.     __CONFIG _CONFIG2 , _WRT_OFF & _VCAPEN_OFF & _LVP_OFF
  21.     BANKSEL PORTA
  22.     CLRF PORTA
  23.     CLRF PORTB
  24.     CLRF PORTC
  25.     CLRF PORTD
  26.     BANKSEL LATA
  27.     CLRF LATA
  28.     CLRF LATB
  29.     CLRF LATC
  30.     CLRF LATD
  31.     BANKSEL ANSELA
  32.     CLRF ANSELA
  33.     CLRF ANSELB             ;wstępna konfiguracja procesora
  34.     CLRF ANSELC             ;i używanych portów
  35.     CLRF ANSELD
  36.     BANKSEL TRISA
  37.     CLRF TRISA
  38.     CLRF TRISC
  39.     CLRF TRISD
  40.     MOVLW 0XFF
  41.     MOVWF TRISB
  42.     BANKSEL PORTA
  43.     BSF DP
  44.     CLRF WL
  45.     CLRF WH
  46.     CLRF TEMP
  47.     BSF LE_L
  48.     BSF LE_H
  49.     BSF BL
  50.     BSF TEMP,1
  51.     BSF TEMP,2
  52.     BSF TEMP,4
  53.     BSF TEMP,5
  54.  
  55. start  
  56.     BANKSEL PORTB
  57.     BSF PORTA,4     ;dioda kontrolna
  58.     BTFSC TEMP,1
  59.     goto checkLeft  ;wykona się przy nie wciśniętym OK
  60.     BTFSC TEMP,4
  61.     goto okDown     ;wykona się jeśli nie jest trzymany
  62.     goto checkLeft
  63. okDown
  64.     BSF PORTA,5     ;dioda kontrolna
  65.     BTFSS TEMP,0
  66.     goto initiate       ;wykona się jeśli to pierwsze wciśnięcie OK
  67.     call okTriggered
  68. checkLeft
  69.     BANKSEL PORTB
  70.     BTFSC TEMP,2
  71.     goto updateTemp ;wykona się przy nie wciśniętym LEFT
  72.     BTFSS TEMP,0
  73.     goto updateTemp ;przy niezainicjalizowanym programie
  74.     BTFSC TEMP,5        ;ignoruje wciśnięcie
  75.     call leftTriggered  ;wywołanie po spełnieniu w.w. warunków
  76. updateTemp
  77.     BTFSC TEMP,1
  78.     BSF TEMP,4
  79.     BTFSS TEMP,1
  80.     BCF TEMP,4
  81.     BTFSC TEMP,2        ;przepisanie stanu przycisków z ostatniego
  82.     BSF TEMP,5      ;przejścia pętli do odpowiednich bitów rejestru
  83.     BTFSS TEMP,2        ;pomocniczego oraz zaktualizowanie stanu przycisków
  84.     BCF TEMP,5
  85.     BTFSC PORTB,0
  86.     BSF TEMP,1
  87.     BTFSS PORTB,0
  88.     BCF TEMP,1
  89.     BTFSC PORTB,5
  90.     BSF TEMP,2
  91.     BTFSS PORTB,5
  92.     BCF TEMP,2
  93.     goto start
  94. przerwanie
  95.     BCF INTCON,TMR0IF   ;czyszczenie flagi wystąpienia przerwania
  96.     BCF STATUS,Z
  97.     MOVF WH,w
  98.     SUBWF NH,w
  99.     BTFSS STATUS,Z
  100.     goto forward
  101.     MOVF WL,w
  102.     SUBWF NL,w
  103.     BTFSS STATUS,Z
  104.     goto forward
  105.     MOVLW 0x00      ;jeśli na licznik miała zostać podana wartość
  106.     MOVWF WL        ;większa od aktualnego N, zerowany jest licznik
  107.     MOVWF WH
  108.     goto updLeave
  109. forward         ;jeśli nie przekroczono N, zwiększana jest
  110.     BCF STATUS,Z        ;wyświetlana liczba, obsługiwany jest problem
  111.     INCF WL,f       ;inkrementacji z 0x09 do 0x0A
  112.     MOVF WL,w
  113.     ANDLW 0x0F
  114.     XORLW 0x0A
  115.     BTFSS STATUS,Z
  116.     goto updLeave
  117.     BCF STATUS,Z
  118.     MOVF WL,w
  119.     ANDLW 0xF0
  120.     MOVWF WL
  121.     MOVLW 0x10
  122.     ADDWF WL,w
  123.     MOVWF WL
  124.     ANDLW 0xF0
  125.     XORLW 0xA0
  126.     BTFSS STATUS,Z
  127.     goto updLeave
  128.     BCF STATUS,Z
  129.     CLRF WL
  130.     INCF WH,f
  131.     MOVF WH,w
  132.     ANDLW 0x0F
  133.     XORLW 0x0A
  134.     BTFSS STATUS,Z
  135.     goto updLeave
  136.     BCF STATUS,Z
  137.     MOVF WH,w
  138.     ANDLW 0xF0
  139.     MOVWF WH
  140.     MOVLW 0x10
  141.     ADDWF WH,w
  142.     MOVWF WH
  143. updLeave
  144.     call updateDisplay      ;przerwanie kończy się wywołaniem funkcji
  145.     RETFIE              ;która aktualizuje stan wyświetlacza 
  146. okTriggered
  147.     BTFSC TEMP,3        ;po pierwszym wciśnięciu OK, każde kolejne
  148.     goto p2         ;zmienia tryb odliczania
  149.     goto p3
  150. p2
  151.     BCF PORTA,7     ;dioda kontrolna (pkt. 2 – dioda niebieska wył.)
  152.     BCF TEMP,3
  153.     MOVLW 0x99      ;odliczanie do liczby 9999
  154.     MOVWF NL
  155.     MOVWF NH
  156.     RETURN
  157. p3
  158.     BSF PORTA,7     ;dioda kontrolna (pkt. 3 – dioda niebieska wł.)
  159.     BSF TEMP,3
  160.     MOVF WL,w       ;odliczanie do liczby aktualnie wyświetlanej
  161.     MOVWF NL
  162.     MOVF WH,w
  163.     MOVWF NH
  164.     RETURN
  165.    
  166. leftTriggered
  167.     SWAPF WH
  168.     MOVF WH,w
  169.     ANDLW 0xF0
  170.     MOVWF WH
  171.     MOVF WL,w
  172.     ANDLW 0xF0      ;przesunięcie cyfr na wyświetlaczu o jedną pozycję
  173.     SWAPF WREG      ;w lewo
  174.     ADDWF WH,w
  175.     MOVWF WH
  176.     SWAPF WL
  177.     MOVF WL,w
  178.     ANDLW 0xF0
  179.     MOVWF WL
  180.     MOVF WH,w
  181.     SUBWF NH,w      ;nh-wreg(wh)
  182.     BTFSC STATUS,Z
  183.     goto checkYounger
  184.     BTFSS STATUS,DC
  185.     goto UPnLEAVE
  186.     MOVLW 0x00      ;jeśli po przesunięciu otrzymano za dużą liczbę,
  187.     MOVWF WL        ;odliczanie rozpoczyna się od zera
  188.     MOVWF WH
  189.     goto UPnLEAVE
  190. checkYounger
  191.     MOVF WL,w
  192.     SUBWF NL,w      ;nl-wreg(wl)
  193.     BTFSS STATUS,DC
  194.     goto UPnLEAVE
  195.     MOVLW 0x00      ;jeśli po przesunięciu otrzymano za dużą liczbę,
  196.     MOVWF WL        ;odliczanie rozpoczyna się od zera
  197.     MOVWF WH
  198. UPnLEAVE    
  199.     call updateDisplay  ;po obsłużeniu zmiany stanu przycisku
  200.     RETURN          ;aktualizowany jest stan wyświetlacza 
  201. initiate
  202.     BSF PORTA,6
  203.     BSF TEMP,6
  204.     BCF DP
  205.     BSF TEMP,0
  206.     BCF TEMP,1
  207.     MOVLW 0x99      ;po pierwszym wciśnięciu przycisku OK wywoływana
  208.     MOVWF NL        ;jest funkcja, która włącza system przerwań i
  209.     MOVWF NH        ;konfiguruje parametry układu TMR0
  210.     BANKSEL INTCON
  211.     BSF INTCON,GIE
  212.     BSF INTCON,TMR0IE
  213.     BANKSEL OPTION_REG
  214.     ANDWF 0xF1,w
  215.     MOVWF OPTION_REG
  216.     BANKSEL PORTA
  217.     goto checkLeft
  218.    
  219. updateDisplay
  220.     MOVF WL,w
  221.     MOVWF PORTD
  222.     BCF LE_L        ;funkcja aktualizująca stan wyświetlacza
  223.     BSF LE_L        ;na podstawie wartości w pomocniczych rejestrach
  224.     MOVF WH,w
  225.     MOVWF PORTD
  226.     BCF LE_H
  227.     BSF LE_H
  228.     RETURN
  229.    
  230.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement