; PIC16F917 ; RTC : DS1305 (MAXIM) ; TEMP.& HUMID.: SHT-11 (SENSIRION) ; INTERNAL OSC : 4MHz ; RTC TIME IN 12H FORMAT ; LCD TIME IN 24H FORMAT ; LED TIME IN 12H FORMAT list p=pic16f917 include p16f917.inc __CONFIG _CP_OFF & _CPD_OFF & _BOD_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _FCMEN_OFF & _IESO_OFF errorlevel -302 ;Eliminate bank warning cblock 0x020 DATO, cnt01, cnt1, cnt100, cnt1s, cnt300, cntwr, BitCount, wdata, rdata, led, flag cntwd, cntlcd, cntrd, cntrda, rdataM, rdataL, year, month, date, day, hour, min, sec cntsht, combt, calcd, calcd1, calcd2, calcrh2, calcrh21, calcrh22, rhb, rhbx, mund TEMP0, TEMP1, TEMP2, TEMP3, rhb0, rhb1, rhb2, rhb3, rha0, rha1, temhumL, temhumM tenK, tho, hun, ten, one, dayM, dayML, dayL, ahM, ahML, ahL, ahM1, ahML1, ahL1 Product, Product1, Product2, Product3, Product4, Product5, tempM, tempL endc #DEFINE sw PORTA, 3 ; IN BUTTON SEC=30 #DEFINE line PORTA, 1 ; IN/OUT SHT-11 data #DEFINE clkS PORTA, 0 ; OUT SHT-11 clock #DEFINE cs PORTA, 6 ; OUT DS1305 CE #DEFINE clk PORTA, 7 ; OUT DS1305 CLOCK #DEFINE din PORTE, 2 ; OUT DS1305 DATA INPUT #DEFINE dout PORTE, 1 ; IN DS1305 DATA OUTPUT #DEFINE e PORTE, 0 ; OUT LCD E #DEFINE rs PORTA, 2 ; OUT LCD RS #DEFINE clk164 PORTA, 5 ; OUT IN SN74LS164 #DEFINE in164 PORTA, 4 ; OUT CLOCK SN74LS164 ;**************** Program Start *********************** org 0 ;Reset Vector goto init org 4 ;Interrupt Vector goto init org 5 ;Interrupt Vector goto init ;**************** Initial Process ********************* inter retfie init call bank1 movlw .0 movwf ANSEL ; ALL PORTS DIGITAL movlw .7 movwf CMCON0 call bank2 bcf LCDCON, VLCDEN call bank0 clrf PORTA clrf PORTB clrf PORTC clrf PORTD clrf PORTE call bank1 clrf TRISA clrf TRISB clrf TRISC clrf TRISD clrf TRISE bsf TRISE, 3 ; RE3 = MCLR bsf TRISE, 1 bsf TRISA, 3 call bank0 clrf PORTA clrf PORTB clrf PORTC clrf PORTD clrf PORTE start call c1sec call initlcd call initlcd call initlcd clrf flag ; flag,0 = temp,hum flag,1 = DST call c1sec goto rdtime setDS bcf clk bsf cs movlw 0x8F ; WRITE TO CONTROL REGISTER (C.R.) movwf wdata call Wdata movlw .0 ; WRITE .0 TO C.R. movwf wdata call Wdata bcf cs call c1sec bcf clk bsf cs movlw 0x91 ; WRITE TO TRICKLE CHARGER REGISTER (T.C.R.) movwf wdata call Wdata movlw b'10101001' ; 2 diode, 2KŮ (~1.8mA) movwf wdata call Wdata bcf cs call c1sec settime bcf clk bsf cs movlw 0x80 ; WRITE TO SECONDS movwf wdata call Wdata movlw .64 ; SEC = 40 movwf wdata ; for sec=0-9 wdata=0-9, sec=10-19 wdata=16-25, sec=20-29 wdata=32-41 call Wdata ; sec=30-39 wdata=48-57, sec=40-49 wdata=64-73, sec=50-59 wdata=80-89 bcf cs bcf clk bsf cs movlw 0x81 ; WRITE TO MINUTES movwf wdata call Wdata movlw b'00000001' ; MIN = 01 movwf wdata ; same as SEC call Wdata bcf cs bcf clk bsf cs movlw 0x82 ; WRITE TO HOURS movwf wdata call Wdata movlw b'01100111' ; HOUR = 7 PM movwf wdata ; bit7=0, bit6 1=12H 0=24H, bit5 in 12H 1=PM 0=AM call Wdata ; same as SEC, UP TO 12 or 24 bcf cs bcf clk bsf cs movlw 0x83 ; WRITE TO DAY movwf wdata call Wdata movlw .7 ; DAY = SUNDAY movwf wdata ; same as SEC, UP TO 7 call Wdata bcf cs bcf clk bsf cs movlw 0x84 ; WRITE TO DATE movwf wdata call Wdata movlw b'00100100' ; DATE = 24 movwf wdata ; same as SEC, UP TO 31 call Wdata bcf cs bcf clk bsf cs movlw 0x85 ; WRITE TO MONTH movwf wdata call Wdata movlw b'00010000' ; MONTH = 10 movwf wdata ; same as SEC, UP TO 12 call Wdata bcf cs bcf clk bsf cs movlw 0x86 ; WRITE TO YEAR movwf wdata call Wdata movlw b'00010000' ; YEAR = 10 movwf wdata ; same as SEC, UP TO 99 call Wdata bcf cs rdtime bcf rs ; LCD 1st LINE movlw .128 movwf DATO call write_DATA bsf rs bcf clk bsf cs movlw 0x02 ; READ HOURS movwf wdata call Wdata call Rdata bcf cs movf rdataM, w ; SAVE HOURS IN "hour" movwf hour swapf hour, f movf rdataL, w addwf hour, f movf hour, w movwf led rlf led, w movwf PORTB movlw .32 movwf DATO call write_DATA btfsc rdataM, 1 ; DISPLAY TIME IN LCD IN 24H FORMAT goto lpDST ; DISPLAY TIME IN LED IN 12H FORMAT btfss rdataM, 0 ; RTC IN 12H FORMAT goto lpDST ; when time is 12am, display 24:00 btfss rdataL, 1 ; when time is 12pm, display 12:00 goto lpDST movlw .2 movwf rdataM movlw .4 movwf rdataL goto lpDST1 lpDST bcf rdataM, 2 btfsc rdataM, 1 call PM lpDST1 movf rdataM, w addlw .48 movwf DATO call write_DATA movf rdataL, 0 addlw .48 movwf DATO call write_DATA movlw .58 movwf DATO call write_DATA bcf clk bsf cs movlw 0x01 ; READ MINUTES movwf wdata call Wdata call Rdata bcf cs movf rdataM, w ; SAVE MINUTES IN "min" movwf min swapf min, f movf rdataL, w addwf min, f movf min, w movwf led rlf led, w movwf PORTD movf rdataM, 0 addlw .48 movwf DATO call write_DATA movf rdataL, 0 addlw .48 movwf DATO call write_DATA movlw .58 movwf DATO call write_DATA bcf clk bsf cs movlw 0x00 ; READ SECONDS movwf wdata call Wdata call Rdata bcf cs movf rdataM, w ; SAVE SECONDS IN "sec" movwf sec swapf sec, f movf rdataL, w addwf sec, f movf sec, w movwf led rlf led, w movwf PORTC btfsc sec, 0 ; CHK FLAG FOR TEMP, HUM bcf flag, 0 movf rdataM, 0 addlw .48 movwf DATO call write_DATA movf rdataL, 0 addlw .48 movwf DATO call write_DATA movlw .32 movwf DATO call write_DATA movlw .32 movwf DATO call write_DATA bcf clk bsf cs movlw 0x03 ; READ DAY movwf wdata call Wdata call Rdata bcf cs movf rdataM, w ; SAVE DAY IN "day" movwf day swapf day, f movf rdataL, w addwf day, f btfss day, 0 ; CHK FLAG FOR DST bcf flag, 1 call chkday rdtl movf dayM, 0 movwf DATO call write_DATA movf dayML, 0 movwf DATO call write_DATA movf dayL, 0 movwf DATO call write_DATA movlw .32 movwf DATO call write_DATA bcf clk bsf cs movlw 0x04 ; READ DATE movwf wdata call Wdata call Rdata bcf cs movf rdataM, w ; SAVE DATE IN "date" movwf date swapf date, f movf rdataL, w addwf date, f bcf rdataM, 6 movf rdataM, 0 addlw .48 movwf DATO call write_DATA movf rdataL, 0 addlw .48 movwf DATO call write_DATA movlw .47 movwf DATO call write_DATA bcf clk bsf cs movlw 0x05 ; READ MONTH movwf wdata call Wdata call Rdata bcf cs movf rdataM, w ; SAVE MONTH IN "month" movwf month swapf month, f movf rdataL, w addwf month, f bcf rdataM, 5 bcf rdataM, 6 movf rdataM, 0 addlw .48 movwf DATO call write_DATA movf rdataL, 0 addlw .48 movwf DATO call write_DATA movlw .47 movwf DATO call write_DATA bcf clk bsf cs movlw 0x06 ; READ YEAR movwf wdata call Wdata call Rdata bcf cs movf rdataM, w ; SAVE YEAR IN "year" movwf year swapf year, f movf rdataL, w addwf year, f movf rdataM, 0 addlw .48 movwf DATO call write_DATA movf rdataL, 0 addlw .48 movwf DATO call write_DATA btfsc flag, 1 ; CHK DST Daylight Saving Time goto skipDST bcf hour, 7 bcf hour, 6 movlw .2 ; CHK IF time = 02 subwf hour, w btfss STATUS, Z goto skipDST movlw .7 ; CHK IF day = 7 SUNDAY subwf day, w btfss STATUS, Z goto skipDST movlw .37 ; CHK IF date => 25 subwf date, w btfss STATUS, C goto skipDST movlw .3 ; CHK IF month = 03 subwf month, w btfsc STATUS, Z goto dst3 movlw .16 ; CHK IF month = 10 subwf month, w btfss STATUS, Z goto skipDST call DST10 goto skipDST dst3 call DST3 skipDST btfsc flag, 0 goto skipTR btfsc sec, 0 ; CHK IF sec = 00 or 10 or 20 or 30 or 40 or 50 goto skipTR ; FOR TEMP or RH MEASURE btfsc sec, 1 ; 00,20,40 MEASURE TEMPERATURE goto skipTR ; 10,30,50 MEASURE HUMIDITY btfsc sec, 2 goto skipTR btfsc sec, 3 goto skipTR btfsc sec, 4 goto measRH measTEMP bcf rs ; LCD 2nd LINE movlw .192 movwf DATO call write_DATA bsf rs call lineout movlw .3 movwf combt call measure call calcTEMP movf rha0, w movwf tempM movf rha1, w movwf tempL call BCD14 movlw .32 movwf DATO call write_DATA movf tho, w movwf DATO call write_DATA movf hun, w movwf DATO call write_DATA movlw .46 movwf DATO call write_DATA movf ten, w movwf DATO call write_DATA movlw .176 movwf DATO call write_DATA movlw .67 movwf DATO call write_DATA measAH bcf rs ; LCD 2nd LINE 15 row movlw .206 movwf DATO call write_DATA bsf rs call calcAH call BCD14 movf tho, w movwf DATO call write_DATA movf hun, w movwf DATO call write_DATA movlw .46 movwf DATO call write_DATA movf ten, w movwf DATO call write_DATA movf one, w movwf DATO call write_DATA ; movlw .32 ; movwf DATO ; call write_DATA movlw .103 movwf DATO call write_DATA movlw .114 movwf DATO call write_DATA movlw .47 movwf DATO call write_DATA movlw .109 movwf DATO call write_DATA movlw .179 movwf DATO call write_DATA goto skipTR measRH bcf rs ; LCD NEXT LINE movlw .200 movwf DATO call write_DATA bsf rs call lineout movlw .5 movwf combt call measure call calcRH movf rha0, w movwf humM movf rha1, w movwf humL call BCD14 movf hun, w movwf DATO call write_DATA movf ten, w movwf DATO call write_DATA movlw .46 movwf DATO call write_DATA movf one, w movwf DATO call write_DATA movlw .37 movwf DATO call write_DATA skipTR btfss sw ; CHK BUTTON SEC = 30 call sec30 goto rdtime PM btfss rdataM, 0 goto lpPM2 btfss rdataL, 1 goto lpPM2 movlw .1 movwf rdataM movlw .2 movwf rdataL goto lpPM1 lpPM2 bcf rdataM, 1 bcf rdataM, 2 incf rdataM, f btfsc rdataL, 3 goto lpPM incf rdataL, f incf rdataL, f goto lpPM1 lpPM bcf rdataL, 3 incf rdataM, f lpPM1 nop return measure bsf flag, 0 bcf clkS ; TRANSMISSION bsf line ; START. bsf clkS bcf line bcf clkS nop bsf clkS bsf line bcf clkS movlw .5 ; COMMAND = combt movwf cntsht ; MEASURE TEMPERATURE = .3 bcf line ; MEASURE HUMIDITY = .5. lpcom1 bsf clkS nop bcf clkS decfsz cntsht, 1 goto lpcom1 movlw .3 movwf cntsht lpcom2 btfsc combt, 2 bsf line btfss combt, 2 bcf line bsf clkS nop bcf clkS rlf combt, 1 decfsz cntsht, 1 goto lpcom2 call linein ; SHT11 act. bsf clkS nop bcf clkS call c300ms clrf temhumM clrf temhumL bsf cntsht, 3 ; READ TEMPERATURE or HUMIDITY lpcom3 rlf temhumM, 1 ; MSB, RIGHT JUSTIFIED bsf clkS ; TEMP. = 14bit btfsc line ; HUMID. = 12bit bsf temhumM, 0 ; DATA OUT: temhumM, temhumL bcf clkS decfsz cntsht, 1 goto lpcom3 call lineout bcf line bsf clkS nop bcf clkS call linein bsf cntsht, 3 ; temhumL lpcom4 rlf temhumL, 1 bsf clkS btfsc line bsf temhumL, 0 bcf clkS decfsz cntsht, 1 goto lpcom4 call lineout bcf line bsf clkS nop bcf clkS call linein bsf cntsht, 3 ; CRC lpcom5 bsf clkS nop bcf clkS decfsz cntsht, 1 goto lpcom5 call lineout bsf line bsf clkS nop bcf clkS call linein return linein call bank1 bsf TRISA, 1 call bank0 bcf PORTA, 1 return lineout call bank1 bcf TRISA, 1 call bank0 bcf PORTA, 1 return calcRH ; RH = -4 + 0.0405*RH + -2.8*10^-6*RH^2 ; RH^2 ; Input: temhumM temhumL (calcd x calcr) ; output: rhb0-MSB ... rhb2-LSB calcr EQU rhb0 calcr1 EQU rhb1 calcr2 EQU rhb2 MULTIPLY_24x24 movlw .0 movwf calcd movwf calcr movf temhumM, w movwf calcd1 movwf calcr1 movf temhumL, w movwf calcd2 movwf calcr2 clrf calcrh2 clrf calcrh21 clrf calcrh22 movlw D'24' movwf BitCount rrf rhb0,F rrf rhb1,F rrf rhb2,F ADD_LOOP_24x24 btfss STATUS,C goto SKIP_LOOP_24x24 movf calcd2,W addwf calcrh22,F movf calcd1,W btfsc STATUS,C incfsz calcd1,W addwf calcrh21,F movf calcd,W btfsc STATUS,C incfsz calcd,W addwf calcrh2,F SKIP_LOOP_24x24 rrf calcrh2,F rrf calcrh21,F rrf calcrh22,F rrf rhb0,F rrf rhb1,F rrf rhb2,F decfsz BitCount,F goto ADD_LOOP_24x24 movf rhb2, w movwf calcrh2 movf rhb1, w movwf calcrh21 movf rhb0, w movwf calcrh22 ; 0.000028 x RH^2 ; Input: rhb0 ... rhb2 ; output: rhb0-MSB rhb1-LSB movf rhb0, w movwf TEMP0 movf rhb1, w movwf TEMP1 movf rhb2, w movwf TEMP2 clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f rrf rhb0, f rrf rhb1, f rrf rhb2, f clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w subwf rhb2, f movf TEMP1, w skpc incfsz TEMP1, w subwf rhb1, f movf TEMP0, w skpc incfsz TEMP0, w subwf rhb0, f movf rhb2, w movwf rhb3 movf rhb1, w movwf rhb2 movf rhb0, w movwf rhb1 clrf rhb0 skpc comf rhb0, f rlf rhb3, f rlf rhb2, f rlf rhb1, f rlf rhb0, f rlf rhb3, f rlf rhb2, f rlf rhb1, f rlf rhb0, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f rrf rhb0, f rrf rhb1, f rrf rhb2, f clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w subwf rhb2, f movf TEMP1, w skpc incfsz TEMP1, w subwf rhb1, f movf TEMP0, w skpc incfsz TEMP0, w subwf rhb0, f swapf rhb2, w andlw .15 movwf rhb2 swapf rhb1, w movwf rhb1 andlw .240 iorwf rhb2, f xorwf rhb1, f swapf rhb0, w movwf rhb0 andlw .240 iorwf rhb1, f xorwf rhb0, f movlw .240 skpc iorwf rhb0, f rlf rhb0, w rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f rrf rhb0, f rrf rhb1, f rrf rhb2, f clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f rrf rhb0, f rrf rhb1, f rrf rhb2, f clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f rrf rhb0, f rrf rhb1, f rrf rhb2, f clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f swapf rhb2, w andlw .15 movwf rhb2 swapf rhb1, w movwf rhb1 andlw .240 iorwf rhb2, f xorwf rhb1, f swapf rhb0, w movwf rhb0 andlw .240 iorwf rhb1, f xorwf rhb0, f skpnc bsf rhb0, 4 movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f swapf rhb2, w andlw .15 movwf rhb2 swapf rhb1, w movwf rhb1 andlw .240 iorwf rhb2, f xorwf rhb1, f swapf rhb0, w movwf rhb0 andlw .240 iorwf rhb1, f xorwf rhb0, f skpnc bsf rhb0, 4 clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w subwf rhb2, f movf TEMP1, w skpc incfsz TEMP1, w subwf rhb1, f movf TEMP0, w skpc incfsz TEMP0, w subwf rhb0, f rrf rhb0, f movlw .128 xorwf rhb0, f ;invert bit shifted from carry rrf rhb1, f rrf rhb2, f rlf rhb0, w rrf rhb0, f rrf rhb1, f rrf rhb2, f rlf rhb0, w rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f rrf rhb0, f rrf rhb1, f rrf rhb2, f clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f rrf rhb0, f rrf rhb1, f rrf rhb2, f clrc rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w subwf rhb2, f movf TEMP1, w skpc incfsz TEMP1, w subwf rhb1, f movf TEMP0, w skpc incfsz TEMP0, w subwf rhb0, f rrf rhb0, f movlw .128 xorwf rhb0, f ;invert bit shifted from carry rrf rhb1, f rrf rhb2, f rlf rhb0, w rrf rhb0, f rrf rhb1, f rrf rhb2, f rlf rhb0, w rrf rhb0, f rrf rhb1, f rrf rhb2, f movf TEMP2, w addwf rhb2, f movf TEMP1, w skpnc incfsz TEMP1, w addwf rhb1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rhb0, f rlf rhb1, f rlf rhb0, w movwf rhb1 clrf rhb0 rlf rhb0, f ; 0.405 x RH ; Input: temhumM temhumL ; Output: rha0-MSB rha1-LSB movfw temhumM movwf rha0 movfw temhumL movwf rha1 movf rha0, w movwf TEMP0 movf rha1, w movwf TEMP1 clrc rrf rha0, f rrf rha1, f addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f rrf rha0, f rrf rha1, f clrc rrf rha0, f rrf rha1, f movf TEMP1, w subwf rha1, f movf TEMP0, w skpc incfsz TEMP0, w subwf rha0, f swapf rha1, w andlw .15 movwf rha1 swapf rha0, w movwf rha0 andlw .240 iorwf rha1, f xorwf rha0, f movlw .240 skpc iorwf rha0, f movf TEMP1, w addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f clrc rrf rha0, f rrf rha1, f clrc rrf rha0, f rrf rha1, f clrc rrf rha0, f rrf rha1, f movf TEMP1, w addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f rrf rha0, f rrf rha1, f clrc rrf rha0, f rrf rha1, f movf TEMP1, w addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f swapf rha1, w andlw .15 movwf rha1 swapf rha0, w movwf rha0 andlw .240 iorwf rha1, f xorwf rha0, f skpnc bsf rha0, 4 clrc rrf rha0, f rrf rha1, f movf TEMP1, w subwf rha1, f movf TEMP0, w skpc incfsz TEMP0, w subwf rha0, f rrf rha0, f movlw .128 xorwf rha0, f ;invert bit shifted from carry rrf rha1, f rlf rha0, w rrf rha0, f rrf rha1, f rlf rha0, w rrf rha0, f rrf rha1, f movf TEMP1, w addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f clrc rrf rha0, f rrf rha1, f movf TEMP1, w addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f rrf rha0, f rrf rha1, f clrc rrf rha0, f rrf rha1, f movf TEMP1, w subwf rha1, f movf TEMP0, w skpc incfsz TEMP0, w subwf rha0, f swapf rha1, w andlw .15 movwf rha1 swapf rha0, w movwf rha0 andlw .240 iorwf rha1, f xorwf rha0, f movlw .240 skpc iorwf rha0, f movf TEMP1, w addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f clrc rrf rha0, f rrf rha1, f clrc rrf rha0, f rrf rha1, f clrc rrf rha0, f rrf rha1, f movf TEMP1, w addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f rrf rha0, f rrf rha1, f clrc rrf rha0, f rrf rha1, f movf TEMP1, w addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f swapf rha1, w andlw .15 movwf rha1 swapf rha0, w movwf rha0 andlw .240 iorwf rha1, f xorwf rha0, f skpnc bsf rha0, 4 clrc rrf rha0, f rrf rha1, f movf TEMP1, w subwf rha1, f movf TEMP0, w skpc incfsz TEMP0, w subwf rha0, f rrf rha0, f movlw .128 xorwf rha0, f ;invert bit shifted from carry rrf rha1, f rlf rha0, w rrf rha0, f rrf rha1, f rlf rha0, w rrf rha0, f rrf rha1, f movf TEMP1, w addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f clrc rrf rha0, f rrf rha1, f movf TEMP1, w addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f rrf rha0, f rrf rha1, f clrc rrf rha0, f rrf rha1, f movf TEMP1, w subwf rha1, f movf TEMP0, w skpc incfsz TEMP0, w subwf rha0, f swapf rha1, w andlw .15 movwf rha1 swapf rha0, w movwf rha0 andlw .240 iorwf rha1, f xorwf rha0, f movlw .240 skpc iorwf rha0, f movf TEMP1, w addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f clrc rrf rha0, f rrf rha1, f clrc rrf rha0, f rrf rha1, f movf TEMP1, w addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f rrf rha0, f rrf rha1, f movf TEMP1, w addwf rha1, f movf TEMP0, w skpnc incfsz TEMP0, w addwf rha0, f rrf rha0, f rrf rha1, f clrc rrf rha0, f rrf rha1, f ; 40 + 0.000028*RH^2 ; Input/Output : rhb0-MSB rhb1-LSB movlw .40 addwf rhb1,f movlw .0 movwf TEMP1 btfsc STATUS,C incfsz TEMP1,w addwf rhb0,f movlw .0 movwf TEMP2 btfsc STATUS,C incfsz TEMP2,w addwf rhb,f movlw .0 btfsc STATUS,C incfsz TEMP3,w addwf rhbx,f ; RH*405.000 - 0.000028*RH^2+40 ; Input: rha0-MSB rha1-LSB - rhb0-MSB rhb1-LSB ; Output: rha0-MSB rha1-LSB movf rhb1,w subwf rha1,f movf rhb0,w skpc incfsz rhb0,w subwf rha0,f movf TEMP2,w skpc incfsz TEMP2,w subwf rhb2,f movf TEMP3,w skpc incfsz TEMP3,w subwf rhb3,f return calcAH ; temp x hum = ah Muer EQU ahM humM EQU ahML humL EQU ahL clrf mund clrf Muer clrf Product clrf Product1 clrf Product2 movlw .24 movwf BitCount rrf ahM, f rrf ahML, f rrf ahL, f ADDLOOP24x24 btfss STATUS, C goto SKIPLOOP24x24 movf tempL, w addwf Product2, f movf tempM, w btfsc STATUS, C incfsz tempM, w addwf Product1, f movf mund, w btfsc STATUS, C incfsz mund, w addwf Product, f SKIPLOOP24x24 rrf Product, f rrf Product1, f rrf Product2, f rrf ahM, f rrf ahML, f rrf ahL, f decfsz BitCount, f goto ADDLOOP24x24 ; ah/1000 = ah movlw .3 movwf calcd movlw .232 movwf calcd1 clrf TEMP0 clrf TEMP1 movlw .24 movwf BitCount LU2416 rlf ahL, w rlf ahML, f rlf ahM, f rlf TEMP1, f rlf TEMP0, f rlf ahL, f movf calcd1, w subwf TEMP1, f movf calcd, w btfss STATUS, C incfsz calcd, w subwf TEMP0, f skpnc bsf ahL, 0 btfsc ahL, 0 goto UOK46 addwf TEMP0, f movf calcd1, w addwf TEMP1, f UOK46 decfsz BitCount, f goto LU2416 ; temp/100 = temp clrf calcd movlw .100 movwf calcd1 clrf TEMP0 clrf TEMP1 movlw .24 movwf BitCount L2416 rlf tempL, w rlf tempM, f rlf TEMP2, f rlf TEMP1, f rlf TEMP0, f rlf tempL, f movf calcd1, w subwf TEMP1, f movf calcd, w btfss STATUS, C incfsz calcd, w subwf TEMP0, f skpnc bsf tempL, 0 btfsc tempL, 0 goto UK46 addwf TEMP0, f movf calcd1, w addwf TEMP1, f UK46 decfsz BitCount, f goto L2416 movlw .27 subwf tempL, w btfsc STATUS, C goto tup27 ; temp = 0 - 26.9oC movf ahM, w movwf ahM1 movf ahML, w movwf ahML1 movf ahL, w movwf ahL1 clrf calcd movlw .10 movwf calcd1 clrf TEMP0 clrf TEMP1 movlw .24 movwf BitCount LU24 rlf ahL1, w rlf ahML1, f rlf ahM1, f rlf TEMP1, f rlf TEMP0, f rlf ahL1, f movf calcd1, w subwf TEMP1, f movf calcd, w btfss STATUS, C incfsz calcd, w subwf TEMP0, f skpnc bsf ahL1, 0 btfsc ahL1, 0 goto UK4 addwf TEMP0, f movf calcd1, w addwf TEMP1, f UK4 decfsz BitCount, f goto LU24 sub32 movf ahL1, w subwf ahL, f movf ahML1, w skpc incfsz ahML1, w subwf ahML, f movf ahM1, w skpc incfsz ahM1, w subwf ahM, f movf TEMP1, w skpc incfsz TEMP1, w subwf TEMP2, f goto AH tup27 movlw .32 subwf tempL, w btfsc STATUS, C goto tup32 goto AH tup32 movlw .38 subwf tempL, w btfsc STATUS, C goto tup38 ; temp = 32 - 37.9oC movf ahM, w movwf ahM1 movf ahML, w movwf ahML1 movf ahL, w movwf ahL1 clrf calcd movlw .5 movwf calcd1 clrf TEMP0 clrf TEMP1 movlw .24 movwf BitCount LU24x rlf ahL1, w rlf ahML1, f rlf ahM1, f rlf TEMP1, f rlf TEMP0, f rlf ahL1, f movf calcd1, w subwf TEMP1, f movf calcd, w btfss STATUS, C incfsz calcd, w subwf TEMP0, f skpnc bsf ahL1, 0 btfsc ahL1, 0 goto UK4x addwf TEMP0, f movf calcd1, w addwf TEMP1, f UK4x decfsz BitCount, f goto LU24x movfw ahL1 addwf ahL, f movfw ahML1 skpnc incfsz ahML1, w addwf ahML, f movfw ahM1 skpnc incfsz ahM1, w addwf ahM, f goto AH tup38 ; temp = 38 - oC movf ahM, w movwf ahM1 movf ahML, w movwf ahML1 movf ahL, w movwf ahL1 clrf calcd movlw .4 movwf calcd1 clrf TEMP0 clrf TEMP1 movlw .24 movwf BitCount LU24y rlf ahL1, w rlf ahML1, f rlf ahM1, f rlf TEMP1, f rlf TEMP0, f rlf ahL1, f movf calcd1, w subwf TEMP1, f movf calcd, w btfss STATUS, C incfsz calcd, w subwf TEMP0, f skpnc bsf ahL1, 0 btfsc ahL1, 0 goto UK4y addwf TEMP0, f movf calcd1, w addwf TEMP1, f UK4y decfsz BitCount, f goto LU24y movfw ahL1 addwf ahL, f movfw ahML1 skpnc incfsz ahML1, w addwf ahML, f movfw ahM1 skpnc incfsz ahM1, w addwf ahM, f AH movf ahML, w movwf rha0 movf ahL, w movwf rha1 return BCD14 ; 14bit - 5digit ASCII ; Input: rha0-MSB rha1-LSB ; Output: (tenK, tho) hun, ten, one swapf rha0, w andlw .15 addlw .240 movwf tho addwf tho, f addlw .226 movwf hun addlw .50 movwf one movf rha0,w andlw .15 addwf hun, f addwf hun, f addwf one, f addlw .233 movwf ten addwf ten, f addwf ten, f swapf rha1, w andlw .15 addwf ten, f addwf one, f rlf ten, f rlf one, f comf one, f rlf one, f movf rha1, w andlw .15 addwf one, f rlf tho, f movlw .7 movwf tenK movlw .10 Lb1 addwf one, f decf ten, f btfss 3, 0 goto Lb1 Lb2 addwf ten, f decf hun, f btfss 3, 0 goto Lb2 Lb3 addwf hun, f decf tho, f btfss 3, 0 goto Lb3 Lb4 addwf tho, f decf tenK, f btfss 3,0 goto Lb4 movlw .48 addwf tenK, f addwf tho, f addwf hun, f addwf ten, f addwf one, f return calcTEMP ; TEMO = 0.01*TEMP - 40 ; Input: rha0-MSB rha1-LSB - rhb0-MSB rhb1-LSB ; Output: rha0-MSB rha1-LSB movlw .15 movwf rhb0 movlw .160 movwf rhb1 movf temhumM, w movwf rha0 movf temhumL, w movwf rha1 movf rhb1,w subwf rha1,f movf rhb0,w skpc incfsz rhb0,w subwf rha0,f movf TEMP2,w skpc incfsz TEMP2,w subwf rhb2,f movf TEMP3,w skpc incfsz TEMP3,w subwf rhb3,f return DST3 bcf clk bsf cs movlw 0x82 ; WRITE TO HOUR movwf wdata call Wdata movlw .67 ; HOUR = 03 movwf wdata call Wdata bcf cs bsf flag, 1 return DST10 bcf clk bsf cs movlw 0x82 ; WRITE TO HOUR movwf wdata call Wdata movlw .65 ; HOUR = 01 movwf wdata call Wdata bcf cs bsf flag, 1 return sec30 bcf clk bsf cs movlw 0x80 ; WRITE TO SECOND movwf wdata call Wdata movlw .48 ; SEC = 30 movwf wdata call Wdata bcf cs return Wdata movlw .8 movwf cntwd lpwd btfsc wdata, 7 bsf din bsf clk rlf wdata, 1 bcf clk bcf din decfsz cntwd, 1 goto lpwd return Rdata movlw .2 movwf cntrda lprd0 clrf rdata movlw .4 movwf cntrd lprd bsf clk rlf rdata, 1 btfsc dout bsf rdata, 0 bcf clk decfsz cntrd, 1 goto lprd movf rdata, 0 decfsz cntrda, 1 goto $ + 2 goto $ + 3 movwf rdataM goto lprd0 movwf rdataL bcf rdataM, 3 return chkday btfsc rdata, 2 goto da4 btfsc rdata, 1 goto da2 btfsc rdata, 0 call day1 goto rdtime da4 btfsc rdata, 1 goto da6 btfsc rdata, 0 call day5 call day4 da6 btfsc rdata, 0 call day7 call day6 da2 btfsc rdata, 0 call day3 call day2 return day1 movlw .77 movwf dayM movlw .79 movwf dayML movlw .78 movwf dayL goto rdtl return day2 movlw .84 movwf dayM movlw .85 movwf dayML movlw .69 movwf dayL goto rdtl return day3 movlw .87 movwf dayM movlw .69 movwf dayML movlw .68 movwf dayL goto rdtl return day4 movlw .84 movwf dayM movlw .72 movwf dayML movlw .85 movwf dayL goto rdtl return day5 movlw .70 movwf dayM movlw .82 movwf dayML movlw .73 movwf dayL goto rdtl return day6 movlw .83 movwf dayM movlw .65 movwf dayML movlw .84 movwf dayL goto rdtl return day7 movlw .83 movwf dayM movlw .85 movwf dayML movlw .78 movwf dayL goto rdtl return write_DATA movlw .8 movwf cntlcd lpwl btfsc DATO, 7 call write_1 btfss DATO, 7 call write_0 rlf DATO, 1 decfsz cntlcd, 1 goto lpwl call c1ms call c1ms call setE bcf STATUS, C return write_1 bsf in164 bsf clk164 bcf clk164 return write_0 bcf in164 bsf clk164 bcf clk164 return setE bsf e call c0ms1 bcf e call c0ms1 return initlcd bcf rs call c0ms1 movlw .56 movwf DATO call write_DATA movlw .12 movwf DATO call write_DATA movlw .1 movwf DATO call write_DATA movlw .2 movwf DATO call write_DATA bsf rs return c0ms1 movlw d'31' ; 98us movwf cnt01 decfsz cnt01, f goto $ - 1 return c1ms movlw d'249' ; 1.001us movwf cnt1 nop decfsz cnt1, f goto $ - 2 return c100ms movlw d'100' ; 100.405us movwf cnt100 call c1ms decfsz cnt100, f goto $ - 2 return c300ms movlw .3 movwf cnt300 call c100ms decfsz cnt300, f goto $ - 2 return c1sec movlw d'9' ; 1.000.063us movwf cnt1s call c100ms decfsz cnt1s, f goto $ - 2 movlw d'96' movwf cnt1s call c1ms decfsz cnt1s, f goto $ - 2 return bank0 bcf STATUS, RP0 bcf STATUS, RP1 return bank1 bsf STATUS, RP0 bcf STATUS, RP1 return bank2 bsf STATUS, IRP bsf STATUS, RP1 bcf STATUS, RP0 return end