processor 16c84 include<16c84a.h> b_wys equ 0x0c ;poczatek bufora wyswietlacza nw equ 0x0f ;numer wyswietlacza pom_wys equ 0x10 ;pomocniczy wyswietlacza w_temp equ 0x11 ;rejest zachowania W st_temp equ 0x12 ;rejestr zachowania status poz equ 0x13 ;pozycja w tablicy cyfw pom equ 0x14 ;zmienna pomocnicza lhex equ 0x15 ;liczba hex dzies equ 0x16 ;dziesiatki jedn equ 0x17 ;jednostki temp equ 0x18 C1cnt equ 0x19 ;zmienne pomocnicze procedury konwersji C2tmp equ 0x1a ;hex->bcd C3rem equ 0x1b msek equ 0x1c ;licznik milisekund sek equ 0x1d ;licznik sekund min equ 0x1e ;licznik minut zbit equ 0x1f ;zmienne bitowe cporta equ 0x20 ;rejestr pomocniczy portu A msekczas equ 0x21 ;licznik milisekund dla opoznien start equ 0 ;bit start timera startcz equ 1 ;bit startu zliczenia opoznien led equ 3 ;bit sygnalizacji czasu buzz equ 4 ;bit buzzera org 0x2100 de 0x01 org 0x2007 de 0x11 ;bezpieczniki org 0000 goto _inic org 0004 _int movwf w_temp ;w_temp <- w movf STATUS,w ;w <-status movwf st_temp ;st_temp <-w bcf STATUS,RP0 ;bank0 bcf INTCON,T0IF ;zeruj flage przerwania od t0 movlw 0xb1 ;laduj t0 movwf TMR0 call _timer ;obsluga timera call _czas ;obsluga odliczania opoznien call _wyswietlacz;obsluga wyswietlacza movf st_temp,w ;w <- st_temp movwf STATUS ;status <- w movf w_temp,w ;w <- w_temp retfie _czas btfss zbit,startcz return decf msekczas,f;licznik *5msek movf msekczas,w ;msekczas->w btfss STATUS,Z return bcf zbit,startcz;koniec odliczania czasu return _timer btfss zbit,start return decf msek,f ;zmniejsz licznik *5msek movf msek,w ;msek->w btfss STATUS,Z return ;wykonaj gdy z=0 movlw d'200' movwf msek ;laduj licznik milisekund call _migled ;miganie led co 1sek decf sek,f movf sek,w btfss STATUS,Z return movlw d'59' movwf sek ;laduj licznik sekund decf min,f call _wysczas ;wyswietl minuty movf min,w btfss STATUS,Z return bcf zbit,start return _migled btfsc cporta,led ;led=!led goto zer bsf cporta,led return zer bcf cporta,led return _wysczas movf min,w movwf lhex call _konw movlw b_wys movwf FSR movlw 0x0f ;wygaszanie najstarszego wyswietlacza movwf INDF incf FSR,f movf dzies,w ;wpisanie dziesiatek movwf INDF incf FSR,f movf jedn,w ;wpisanie jednostek movwf INDF return _wyswietlacz incf nw,f ;nast. cyfra movf nw,w ;nw do W xorlw 0x03 ;czy rowne 3 btfsc STATUS,Z ;pomin zerowanie gdy z=0 clrf nw ;zeruj nw movlw b_wys addwf nw,w ;W=b_wys+nw movwf FSR ;pointer movf INDF,w ;czytaj ram (do W) movwf pom_wys ;kod wyswietlacza movf cporta,w ;wyzerowanie b0-b2 andlw 0xf8 movwf cporta movf nw,w call _poz andlw 0x07 iorwf cporta,f ;w=w or cporta movf cporta,w movwf PORTA movf pom_wys,w movwf PORTB ;wyslij na portb return _poz addwf PCL,f dt 6,5,3 _opoznienie movwf msekczas ;licznik *5msek bsf zbit,startcz etopoz btfsc zbit,startcz goto etopoz return _inic bcf STATUS,RP0;bank0 clrf PORTA clrf PORTB bsf STATUS,RP0 ;bank1 bcf OPTION_REG,T0CS;t0 fxtal/4 bcf OPTION_REG,PSA;preskaler do t0 bcf OPTION_REG,PS0 ;preskaler 1/32 bcf OPTION_REG,PS1 bsf OPTION_REG,PS2 movlw 0xf0 movwf TRISB ;portb wyjsciowy clrf TRISA ;porta wejsciowy bcf STATUS,RP0 ;bank0 movlw 0xff ;wartosc poczatkowa porta i portb movwf PORTA movwf PORTB movwf cporta clrf nw movlw d'200' movwf msek movlw d'60' movwf sek clrf INTCON movlw 0xb1 ;ladowanie licznika movwf TMR0 bsf INTCON,T0IE ;odblokuj przerwanie od t0 bsf INTCON,GIE ;odblokowanie przerwan _pocz bcf zbit,start ;stop zliczania bsf cporta,led ;led zgaszony call _rdeeprom ;czytaj wartosc min z eeprom _petlagl call _wysczas ;wyswietl wartosc poczatkowa call _klawiatura;czytaj klawiature movf pom,w ;kod klawisza do w xorlw 0x02 ;czy plus btfsc STATUS,Z goto _plus ;plus min movf pom,w xorlw 0x04 ;czy minus btfsc STATUS,Z goto _minus ;minus min movf pom,w xorlw 0x08 ;czy start btfsc STATUS,Z goto _start ;start zliczania goto _petlagl ;klawisz stop - nic nie rob _plus incf min,f ;zwieksz liczbe minut movf min,w xorlw d'61' ;czy poza zakresem btfss STATUS,Z goto _petlagl decf min,f ;korekcja goto _petlagl _minus decf min,f ;zmniejsz liczbe minut movf min,w xorlw 0x00 ;czy poza zakresem btfss STATUS,Z goto _petlagl incf min,f ;korekcja goto _petlagl _start bsf zbit,start call _wreeprom movlw d'50' call _opoznienie etstart btfss zbit,start;czekaj na koniec zliczania goto etstart1 ;start=0 koniec zliczania movf PORTB,w andlw 0xf0 xorlw 0xf0 btfsc STATUS,Z goto etstart ;klawisz nie wcisniety goto _pocz ;stop zliczania etstart1 bcf cporta,buzz call _pipi bsf cporta,buzz goto _pocz _pipi btfsc cporta,buzz ;buzz=!buzz goto zerb bsf cporta,buzz goto etpipi zerb bcf cporta,buzz etpipi movlw d'50' ;opoznienie 250 msek call _opoznienie movf PORTB,w andlw 0xf0 xorlw 0xf0 btfss STATUS,Z return ;dowolny klawisz wcisniety goto _pipi _klawiatura movf PORTB,w ;czekaj na puszczenie klawisza andlw 0xf0 xorlw 0xf0 btfss STATUS,Z goto _klawiatura p_klawisz movf PORTB,w ;czekaj na przycisniecie klawisza andlw 0xf0 xorlw 0xf0 btfsc STATUS,Z goto p_klawisz p_klawisz1 movlw 4 ;opoznienie 20 msek call _opoznienie movf PORTB,w ;ponowne sprawdzenie andlw 0xf0 xorlw 0xf0 btfsc STATUS,Z goto p_klawisz1 movf PORTB,w movwf pom rrf pom,f rrf pom,f rrf pom,f rrf pom,f comf pom,w ;aktywna jedynka andlw 0x0f movwf pom _kla movf PORTB,w ;czekaj na puszczenie klawisza andlw 0xf0 xorlw 0xf0 btfss STATUS,Z goto _kla movf pom,w return _konw movf lhex,W ; dzies=lhex/10; movwf C2tmp clrf C3rem movlw .8 movwf C1cnt k01 rlf C2tmp,1 rlf C3rem,1 movlw .10 subwf C3rem,W btfss STATUS,C goto k02 movlw .10 subwf C3rem,1 bsf STATUS,C btfss STATUS,C k02 bcf STATUS,C rlf dzies,1 decfsz C1cnt,1 goto k01 ; temp=dzies*10; movlw .10 movwf C1cnt clrf temp k03 movf dzies,W addwf temp,1 decfsz C1cnt,1 goto k03 ; jedn=lhex-temp; movf temp,W subwf lhex,W movwf jedn return _rdeeprom movlw 0x00 ;adres min movwf EEADR ;adres eeprom bsf STATUS,RP0 ;bank1 bsf EECON1,RD ;inicjuj odczyt bcf STATUS,RP0 ;bank0 movf EEDATA,w ;w <- eedata movwf min ;nnap <- w _wreeprom movlw 0x00 ;adres min movwf EEADR ;adres eeprom movf min,w ;w <- min movwf EEDATA ;dane call _inicwr bsf STATUS,RP0 _wrnnap1 btfsc EECON1,WR ;spr bitu wr goto _wrnnap1 ;wpis nie skonczony wr=1 bcf EECON1,WREN bcf STATUS,RP0 return _inicwr bsf STATUS,RP0 ;bank 1 bcf INTCON,GIE ;blokuj przerwania bsf EECON1,WREN ;pozwolenie na wpis movlw 0x55 movwf EECON2 movlw 0xaa movwf EECON2 bsf EECON1,WR ;start wpisu wr=1 bsf INTCON,GIE ;odblokuj przerwania bcf STATUS,RP0 ;bank 0 return end