Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<p16f1517.inc>
- #define LE_L PORTC,4
- #define LE_H PORTC,5 ;definicja pomocniczych nazw
- #define BL PORTC,2
- #define DP PORTC,6
- WL equ 0x31
- WH equ 0x30 ;definicja pomocniczych nazw
- NL equ 0x41
- NH equ 0x40
- TEMP equ 0x50
- org 0x00
- goto ustawienia
- org 0x04
- goto przerwanie
- ustawienia
- __CONFIG _CONFIG1 ,_FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _BOREN_OFF &_CLKOUTEN_OFF
- __CONFIG _CONFIG2 , _WRT_OFF & _VCAPEN_OFF & _LVP_OFF
- BANKSEL PORTA
- CLRF PORTA
- CLRF PORTB
- CLRF PORTC
- CLRF PORTD
- BANKSEL LATA
- CLRF LATA
- CLRF LATB
- CLRF LATC
- CLRF LATD
- BANKSEL ANSELA
- CLRF ANSELA
- CLRF ANSELB ;wstępna konfiguracja procesora
- CLRF ANSELC ;i używanych portów
- CLRF ANSELD
- BANKSEL TRISA
- CLRF TRISA
- CLRF TRISC
- CLRF TRISD
- MOVLW 0XFF
- MOVWF TRISB
- BANKSEL PORTA
- BSF DP
- CLRF WL
- CLRF WH
- CLRF TEMP
- BSF LE_L
- BSF LE_H
- BSF BL
- BSF TEMP,1
- BSF TEMP,2
- BSF TEMP,4
- BSF TEMP,5
- start
- BANKSEL PORTB
- BSF PORTA,4 ;dioda kontrolna
- BTFSC TEMP,1
- goto checkLeft ;wykona się przy nie wciśniętym OK
- BTFSC TEMP,4
- goto okDown ;wykona się jeśli nie jest trzymany
- goto checkLeft
- okDown
- BSF PORTA,5 ;dioda kontrolna
- BTFSS TEMP,0
- goto initiate ;wykona się jeśli to pierwsze wciśnięcie OK
- call okTriggered
- checkLeft
- BANKSEL PORTB
- BTFSC TEMP,2
- goto updateTemp ;wykona się przy nie wciśniętym LEFT
- BTFSS TEMP,0
- goto updateTemp ;przy niezainicjalizowanym programie
- BTFSC TEMP,5 ;ignoruje wciśnięcie
- call leftTriggered ;wywołanie po spełnieniu w.w. warunków
- updateTemp
- BTFSC TEMP,1
- BSF TEMP,4
- BTFSS TEMP,1
- BCF TEMP,4
- BTFSC TEMP,2 ;przepisanie stanu przycisków z ostatniego
- BSF TEMP,5 ;przejścia pętli do odpowiednich bitów rejestru
- BTFSS TEMP,2 ;pomocniczego oraz zaktualizowanie stanu przycisków
- BCF TEMP,5
- BTFSC PORTB,0
- BSF TEMP,1
- BTFSS PORTB,0
- BCF TEMP,1
- BTFSC PORTB,5
- BSF TEMP,2
- BTFSS PORTB,5
- BCF TEMP,2
- goto start
- przerwanie
- BCF INTCON,TMR0IF ;czyszczenie flagi wystąpienia przerwania
- BCF STATUS,Z
- MOVF WH,w
- SUBWF NH,w
- BTFSS STATUS,Z
- goto forward
- MOVF WL,w
- SUBWF NL,w
- BTFSS STATUS,Z
- goto forward
- MOVLW 0x00 ;jeśli na licznik miała zostać podana wartość
- MOVWF WL ;większa od aktualnego N, zerowany jest licznik
- MOVWF WH
- goto updLeave
- forward ;jeśli nie przekroczono N, zwiększana jest
- BCF STATUS,Z ;wyświetlana liczba, obsługiwany jest problem
- INCF WL,f ;inkrementacji z 0x09 do 0x0A
- MOVF WL,w
- ANDLW 0x0F
- XORLW 0x0A
- BTFSS STATUS,Z
- goto updLeave
- BCF STATUS,Z
- MOVF WL,w
- ANDLW 0xF0
- MOVWF WL
- MOVLW 0x10
- ADDWF WL,w
- MOVWF WL
- ANDLW 0xF0
- XORLW 0xA0
- BTFSS STATUS,Z
- goto updLeave
- BCF STATUS,Z
- CLRF WL
- INCF WH,f
- MOVF WH,w
- ANDLW 0x0F
- XORLW 0x0A
- BTFSS STATUS,Z
- goto updLeave
- BCF STATUS,Z
- MOVF WH,w
- ANDLW 0xF0
- MOVWF WH
- MOVLW 0x10
- ADDWF WH,w
- MOVWF WH
- updLeave
- call updateDisplay ;przerwanie kończy się wywołaniem funkcji
- RETFIE ;która aktualizuje stan wyświetlacza
- okTriggered
- BTFSC TEMP,3 ;po pierwszym wciśnięciu OK, każde kolejne
- goto p2 ;zmienia tryb odliczania
- goto p3
- p2
- BCF PORTA,7 ;dioda kontrolna (pkt. 2 – dioda niebieska wył.)
- BCF TEMP,3
- MOVLW 0x99 ;odliczanie do liczby 9999
- MOVWF NL
- MOVWF NH
- RETURN
- p3
- BSF PORTA,7 ;dioda kontrolna (pkt. 3 – dioda niebieska wł.)
- BSF TEMP,3
- MOVF WL,w ;odliczanie do liczby aktualnie wyświetlanej
- MOVWF NL
- MOVF WH,w
- MOVWF NH
- RETURN
- leftTriggered
- SWAPF WH
- MOVF WH,w
- ANDLW 0xF0
- MOVWF WH
- MOVF WL,w
- ANDLW 0xF0 ;przesunięcie cyfr na wyświetlaczu o jedną pozycję
- SWAPF WREG ;w lewo
- ADDWF WH,w
- MOVWF WH
- SWAPF WL
- MOVF WL,w
- ANDLW 0xF0
- MOVWF WL
- MOVF WH,w
- SUBWF NH,w ;nh-wreg(wh)
- BTFSC STATUS,Z
- goto checkYounger
- BTFSS STATUS,DC
- goto UPnLEAVE
- MOVLW 0x00 ;jeśli po przesunięciu otrzymano za dużą liczbę,
- MOVWF WL ;odliczanie rozpoczyna się od zera
- MOVWF WH
- goto UPnLEAVE
- checkYounger
- MOVF WL,w
- SUBWF NL,w ;nl-wreg(wl)
- BTFSS STATUS,DC
- goto UPnLEAVE
- MOVLW 0x00 ;jeśli po przesunięciu otrzymano za dużą liczbę,
- MOVWF WL ;odliczanie rozpoczyna się od zera
- MOVWF WH
- UPnLEAVE
- call updateDisplay ;po obsłużeniu zmiany stanu przycisku
- RETURN ;aktualizowany jest stan wyświetlacza
- initiate
- BSF PORTA,6
- BSF TEMP,6
- BCF DP
- BSF TEMP,0
- BCF TEMP,1
- MOVLW 0x99 ;po pierwszym wciśnięciu przycisku OK wywoływana
- MOVWF NL ;jest funkcja, która włącza system przerwań i
- MOVWF NH ;konfiguruje parametry układu TMR0
- BANKSEL INTCON
- BSF INTCON,GIE
- BSF INTCON,TMR0IE
- BANKSEL OPTION_REG
- ANDWF 0xF1,w
- MOVWF OPTION_REG
- BANKSEL PORTA
- goto checkLeft
- updateDisplay
- MOVF WL,w
- MOVWF PORTD
- BCF LE_L ;funkcja aktualizująca stan wyświetlacza
- BSF LE_L ;na podstawie wartości w pomocniczych rejestrach
- MOVF WH,w
- MOVWF PORTD
- BCF LE_H
- BSF LE_H
- RETURN
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement