CCS PCM C Compiler, Version 2.674, 6286 Filename: G:\C\PICTEMP\PICTEMP\PICTEMP.LST ROM used: 1022 (100%) Largest free fragment is 1026 RAM used: 17 (25%) at main() level 37 (54%) worst case Stack: 3 locations 0000: MOVLW 00 0001: MOVWF 0A 0002: GOTO 272 0003: NOP 0004: NOP 0005: NOP .................... signed int atoi(char *s) * 0126: MOVF 1D,W 0127: XORWF 1E,W 0128: ANDLW 80 0129: MOVWF 1F 012A: BTFSS 1D,7 012B: GOTO 12E 012C: COMF 1D,F 012D: INCF 1D,F 012E: BTFSS 1E,7 012F: GOTO 132 0130: COMF 1E,F 0131: INCF 1E,F 0132: CLRF 0C 0133: CLRF 0D 0134: MOVF 1D,W 0135: BCF 03,0 0136: BTFSC 1E,0 0137: ADDWF 0C,F 0138: RRF 0C,F 0139: RRF 0D,F 013A: BTFSC 1E,1 013B: ADDWF 0C,F 013C: RRF 0C,F 013D: RRF 0D,F 013E: BTFSC 1E,2 013F: ADDWF 0C,F 0140: RRF 0C,F 0141: RRF 0D,F 0142: BTFSC 1E,3 0143: ADDWF 0C,F 0144: RRF 0C,F 0145: RRF 0D,F 0146: BTFSC 1E,4 0147: ADDWF 0C,F 0148: RRF 0C,F 0149: RRF 0D,F 014A: BTFSC 1E,5 014B: ADDWF 0C,F 014C: RRF 0C,F 014D: RRF 0D,F 014E: BTFSC 1E,6 014F: ADDWF 0C,F 0150: RRF 0C,F 0151: RRF 0D,F 0152: BTFSC 1E,7 0153: ADDWF 0C,F 0154: RRF 0C,F 0155: RRF 0D,F 0156: BTFSS 1F,7 0157: GOTO 15A 0158: COMF 0D,F 0159: INCF 0D,F 015A: RETLW 00 .................... signed long atol(char *s) * 00B8: MOVF 26,W 00B9: XORWF 28,W 00BA: ANDLW 80 00BB: MOVWF 2A 00BC: BTFSS 26,7 00BD: GOTO 0C3 00BE: COMF 25,F 00BF: COMF 26,F 00C0: INCF 25,F 00C1: BTFSC 03,2 00C2: INCF 26,F 00C3: BTFSS 28,7 00C4: GOTO 0CA 00C5: COMF 27,F 00C6: COMF 28,F 00C7: INCF 27,F 00C8: BTFSC 03,2 00C9: INCF 28,F 00CA: MOVLW 10 00CB: MOVWF 0C 00CC: CLRF 0F 00CD: CLRF 29 00CE: RRF 26,F 00CF: RRF 25,F 00D0: BTFSS 03,0 00D1: GOTO 0D8 00D2: MOVF 27,W 00D3: ADDWF 0F,F 00D4: BTFSC 03,0 00D5: INCF 29,F 00D6: MOVF 28,W 00D7: ADDWF 29,F 00D8: RRF 29,F 00D9: RRF 0F,F 00DA: RRF 0E,F 00DB: RRF 0D,F 00DC: DECFSZ 0C,F 00DD: GOTO 0CE 00DE: BTFSS 2A,7 00DF: GOTO 0E5 00E0: COMF 0D,F 00E1: COMF 0E,F 00E2: INCF 0D,F 00E3: BTFSC 03,2 00E4: INCF 0E,F 00E5: NOP 00E6: RETLW 00 .................... #use delay(clock=4000000) * 0078: MOVLW 24 0079: MOVWF 04 007A: MOVF 00,W 007B: BTFSC 03,2 007C: GOTO 08B 007D: MOVLW 01 007E: MOVWF 0D 007F: CLRF 0C 0080: DECFSZ 0C,F 0081: GOTO 080 0082: DECFSZ 0D,F 0083: GOTO 07F 0084: MOVLW 48 0085: MOVWF 0C 0086: DECFSZ 0C,F 0087: GOTO 086 0088: NOP 0089: DECFSZ 00,F 008A: GOTO 07D 008B: RETLW 00 .................... .................... #include "1WIRE.H" .................... short int initialise1_wire_with_error_check() .................... { .................... .................... output_low( PIN_B0 ); * 0029: BSF 03,5 002A: BCF 06,0 002B: BCF 03,5 002C: BCF 06,0 .................... delay_us( 720 ); // pull 1-wire low for 720us reset pulse 002D: MOVLW EF 002E: MOVWF 0C 002F: DECFSZ 0C,F 0030: GOTO 02F 0031: NOP 0032: NOP .................... output_float( PIN_B0 ); // float 1-wire high 0033: BSF 03,5 0034: BSF 06,0 .................... if (!input( PIN_B0 )) 0035: BSF 06,0 0036: BCF 03,5 0037: BTFSC 06,0 0038: GOTO 03C .................... return ( FALSE ); // error (1-wire leads shorted) 0039: MOVLW 00 003A: MOVWF 0D 003B: GOTO 053 .................... delay_us( 67 ); // wait for presence pulse, allowing for device variation 003C: MOVLW 16 003D: MOVWF 0C 003E: DECFSZ 0C,F 003F: GOTO 03E .................... if (input( PIN_B0 )) 0040: BSF 03,5 0041: BSF 06,0 0042: BCF 03,5 0043: BTFSS 06,0 0044: GOTO 048 .................... return ( FALSE ); // error (no 1-wire devices present) 0045: MOVLW 00 0046: MOVWF 0D 0047: GOTO 053 .................... delay_us( 450 ); // wait-out remaining initialisation window. 0048: MOVLW 95 0049: MOVWF 0C 004A: DECFSZ 0C,F 004B: GOTO 04A 004C: NOP 004D: NOP .................... output_float( PIN_B0 ); 004E: BSF 03,5 004F: BSF 06,0 .................... return ( TRUE ); // device(s) present and initialised. 0050: MOVLW 01 0051: BCF 03,5 0052: MOVWF 0D 0053: RETLW 00 .................... .................... } .................... .................... .................... initialise1_wire_without_error_check() // OK if just using a single permanently connected device .................... { .................... .................... output_low( PIN_B0 ); .................... delay_us( 720 ); // pull 1-wire low for 720us reset pulse .................... output_float( PIN_B0 ); // float 1-wire high .................... delay_us( 67 ); // wait for presence pulse, allowing for device variation .................... delay_us( 450 ); // wait-out remaining initialisation window. .................... output_float( PIN_B0 ); .................... .................... } .................... .................... .................... send1_wire(int data) .................... { .................... .................... int count; .................... for (count=0; count<8; ++count) 0054: CLRF 24 0055: MOVLW 08 0056: SUBWF 24,W 0057: BTFSC 03,0 0058: GOTO 077 .................... { .................... output_low( PIN_B0 ); 0059: BSF 03,5 005A: BCF 06,0 005B: BCF 03,5 005C: BCF 06,0 .................... delay_us( 10 ); // pull 1-wire low to initiate write time-slot. 005D: MOVLW 03 005E: MOVWF 0C 005F: DECFSZ 0C,F 0060: GOTO 05F .................... output_bit(PIN_B0, shift_right(&data,1,0)); // set output bit on 1-wire 0061: BCF 03,0 0062: RRF 23,F 0063: BTFSC 03,0 0064: GOTO 067 0065: BCF 06,0 0066: GOTO 068 0067: BSF 06,0 0068: BSF 03,5 0069: BCF 06,0 .................... delay_us( 50 ); // wait until end of write slot. 006A: MOVLW 10 006B: BCF 03,5 006C: MOVWF 0C 006D: DECFSZ 0C,F 006E: GOTO 06D 006F: NOP .................... output_float( PIN_B0 ); // set 1-wire high again, 0070: BSF 03,5 0071: BSF 06,0 .................... delay_us( 2 ); // for more than 1us minimum. 0072: NOP 0073: NOP 0074: BCF 03,5 .................... } 0075: INCF 24,F 0076: GOTO 055 0077: RETLW 00 .................... } .................... .................... int read1_wire() .................... { .................... int count, data; .................... for (count=0; count<8; ++count) * 008C: CLRF 23 008D: MOVLW 08 008E: SUBWF 23,W 008F: BTFSC 03,0 0090: GOTO 0B5 .................... { .................... output_low( PIN_B0 ); 0091: BSF 03,5 0092: BCF 06,0 0093: BCF 03,5 0094: BCF 06,0 .................... delay_us( 3 ); // pull 1-wire low to initiate read time-slot. 0095: NOP 0096: NOP 0097: NOP .................... output_float( PIN_B0 ); // now let 1-wire float high, 0098: BSF 03,5 0099: BSF 06,0 .................... delay_us( 11 ); // let device state stabilise, 009A: MOVLW 03 009B: BCF 03,5 009C: MOVWF 0C 009D: DECFSZ 0C,F 009E: GOTO 09D 009F: NOP .................... shift_right(&data,1,input( PIN_B0 )); // and load result. 00A0: BSF 03,5 00A1: BSF 06,0 00A2: BCF 03,5 00A3: BTFSC 06,0 00A4: GOTO 0A7 00A5: BCF 03,0 00A6: GOTO 0A8 00A7: BSF 03,0 00A8: RRF 24,F .................... delay_us( 50 ); // wait until end of read slot. 00A9: MOVLW 10 00AA: MOVWF 0C 00AB: DECFSZ 0C,F 00AC: GOTO 0AB 00AD: NOP .................... output_float( PIN_B0 ); // set 1-wire high again, 00AE: BSF 03,5 00AF: BSF 06,0 .................... delay_us( 2 ); // for more than 1us minimum. 00B0: NOP 00B1: NOP 00B2: BCF 03,5 .................... } 00B3: INCF 23,F 00B4: GOTO 08D .................... return( data ); 00B5: MOVF 24,W 00B6: MOVWF 0D 00B7: RETLW 00 .................... } .................... #include "MAX7219.H" .................... // Procedures to operate a Maxim 7219 LED driver. .................... // .................... // 7219 PIC .................... // .................... // DATA (pin 1) B1 .................... // CLOCK (pin 13) B2 .................... // LOAD (pin 12) B3 .................... .................... .................... clock7219() .................... { .................... .................... output_low( PIN_B2 ); * 0015: BCF 06,2 0016: BCF 03,5 0017: BCF 06,2 .................... delay_us( 1 ); 0018: NOP .................... output_high( PIN_B2 ); 0019: BSF 03,5 001A: BCF 06,2 001B: BCF 03,5 001C: BSF 06,2 .................... .................... } .................... .................... .................... load7219() .................... { .................... .................... output_low( PIN_B3 ); * 001F: BSF 03,5 0020: BCF 06,3 0021: BCF 03,5 0022: BCF 06,3 .................... delay_us( 1 ); 0023: NOP .................... output_high( PIN_B3 ); 0024: BSF 03,5 0025: BCF 06,3 0026: BCF 03,5 0027: BSF 06,3 .................... .................... } .................... .................... .................... send7219(long data) .................... { .................... .................... int count; .................... for (count=0; count<16; ++count) * 0006: CLRF 30 0007: MOVLW 10 0008: SUBWF 30,W 0009: BTFSC 03,0 000A: GOTO 01F .................... { .................... output_bit(PIN_B1, shift_left(&data,2,0)); 000B: BCF 03,0 000C: RLF 2E,F 000D: RLF 2F,F 000E: BTFSC 03,0 000F: GOTO 012 0010: BCF 06,1 0011: GOTO 013 0012: BSF 06,1 0013: BSF 03,5 0014: BCF 06,1 .................... clock7219(); .................... } * 001D: INCF 30,F 001E: GOTO 007 .................... load7219(); * 0028: RETLW 00 .................... .................... } .................... .................... #inline .................... signed long readSingleDS1820() .................... { .................... .................... int temperatureLSB, temperatureMSB, ok=0; * 0285: CLRF 1C .................... signed long temperature, countRemainLong,countDegCLong; .................... .................... ok+=initialise1_wire_with_error_check(); // initialise DS1820. 0286: CALL 029 0287: MOVF 0D,W 0288: ADDWF 1C,F .................... .................... send1_wire(0xCC); // send 'Skip ROM' command to DS1820. 0289: MOVLW CC 028A: MOVWF 23 028B: CALL 054 .................... send1_wire(0x44); // send 'Convert T' command to DS1820. 028C: MOVLW 44 028D: MOVWF 23 028E: CALL 054 .................... .................... output_high(PIN_B0); 028F: BSF 03,5 0290: BCF 06,0 0291: BCF 03,5 0292: BSF 06,0 .................... delay_ms(500); // leave 1-wire high for 500ms to provide power for temp. conversion. 0293: MOVLW 02 0294: MOVWF 23 0295: MOVLW FA 0296: MOVWF 24 0297: CALL 078 0298: DECFSZ 23,F 0299: GOTO 295 .................... .................... ok+=initialise1_wire_with_error_check(); // initialise DS1820. 029A: CALL 029 029B: MOVF 0D,W 029C: ADDWF 1C,F .................... .................... send1_wire(0xCC); // send 'Skip ROM' command to DS1820. 029D: MOVLW CC 029E: MOVWF 23 029F: CALL 054 .................... send1_wire(0xBE); // send 'Read Scratchpad' command to DS1820. 02A0: MOVLW BE 02A1: MOVWF 23 02A2: CALL 054 .................... .................... temperatureLSB = read1_wire(); 02A3: CALL 08C 02A4: MOVF 0D,W 02A5: MOVWF 1A .................... temperatureMSB = read1_wire(); 02A6: CALL 08C 02A7: MOVF 0D,W 02A8: MOVWF 1B .................... .................... read1_wire(); // skip the TH, TL and reserved bytes. 02A9: CALL 08C .................... read1_wire(); 02AA: CALL 08C .................... read1_wire(); 02AB: CALL 08C .................... read1_wire(); 02AC: CALL 08C .................... .................... countRemainLong = (signed long)read1_wire(); 02AD: CALL 08C 02AE: CLRF 20 02AF: MOVF 0D,W 02B0: MOVWF 1F .................... countDegCLong = (signed long)read1_wire(); 02B1: CALL 08C 02B2: CLRF 22 02B3: MOVF 0D,W 02B4: MOVWF 21 .................... .................... ok+=initialise1_wire_with_error_check(); // initialise DS1820. 02B5: CALL 029 02B6: MOVF 0D,W 02B7: ADDWF 1C,F .................... temperature=(long)temperatureLSB; 02B8: CLRF 1E 02B9: MOVF 1A,W 02BA: MOVWF 1D .................... .................... if (bit_test(temperatureMSB,1)) // check MSB for negative temperature. 02BB: BTFSS 1B,1 02BC: GOTO 2C8 .................... { .................... bit_set(temperature,15); 02BD: BSF 1E,7 .................... bit_set(temperature,14); 02BE: BSF 1E,6 .................... bit_set(temperature,13); 02BF: BSF 1E,5 .................... bit_set(temperature,12); 02C0: BSF 1E,4 .................... bit_set(temperature,11); 02C1: BSF 1E,3 .................... bit_set(temperature,10); 02C2: BSF 1E,2 .................... bit_set(temperature,9); 02C3: BSF 1E,1 .................... bit_set(temperature,8); 02C4: BSF 1E,0 .................... shift_right(&temperature,1,1); // discard the inaccurate last half degree. 02C5: BSF 03,0 02C6: RRF 1D,F .................... .................... } .................... else 02C7: GOTO 2CA .................... { .................... shift_right(&temperature,1,0); // discard the inaccurate last half degree. 02C8: BCF 03,0 02C9: RRF 1D,F .................... } .................... .................... .................... temperature*=10; // then multiply by ten to avoid having to use floating point numbers. 02CA: MOVF 1E,W 02CB: MOVWF 26 02CC: MOVF 1D,W 02CD: MOVWF 25 02CE: MOVLW 00 02CF: MOVWF 28 02D0: MOVLW 0A 02D1: MOVWF 27 02D2: CALL 0B8 02D3: MOVF 0E,W 02D4: MOVWF 1E 02D5: MOVF 0D,W 02D6: MOVWF 1D .................... .................... temperature+=((-25+(100*(countDegCLong-countRemainLong))/countDegCLong)/10); * 00E7: MOVF 2A,W 00E8: XORWF 2C,W 00E9: ANDLW 80 00EA: MOVWF 2E 00EB: BTFSS 2A,7 00EC: GOTO 0F2 00ED: COMF 29,F 00EE: COMF 2A,F 00EF: INCF 29,F 00F0: BTFSC 03,2 00F1: INCF 2A,F 00F2: BTFSS 2C,7 00F3: GOTO 0F9 00F4: COMF 2B,F 00F5: COMF 2C,F 00F6: INCF 2B,F 00F7: BTFSC 03,2 00F8: INCF 2C,F 00F9: CLRF 0D 00FA: CLRF 0E 00FB: CLRF 0C 00FC: CLRF 0F 00FD: MOVF 2C,W 00FE: BTFSS 03,2 00FF: GOTO 103 0100: MOVF 2B,W 0101: BTFSC 03,2 0102: GOTO 11D 0103: MOVLW 10 0104: MOVWF 2D 0105: BCF 03,0 0106: RLF 29,F 0107: RLF 2A,F 0108: RLF 0C,F 0109: RLF 0F,F 010A: MOVF 2C,W 010B: SUBWF 0F,W 010C: BTFSS 03,2 010D: GOTO 110 010E: MOVF 2B,W 010F: SUBWF 0C,W 0110: BTFSS 03,0 0111: GOTO 119 0112: MOVF 2B,W 0113: SUBWF 0C,F 0114: BTFSS 03,0 0115: DECF 0F,F 0116: MOVF 2C,W 0117: SUBWF 0F,F 0118: BSF 03,0 0119: RLF 0D,F 011A: RLF 0E,F 011B: DECFSZ 2D,F 011C: GOTO 105 011D: NOP 011E: BTFSS 2E,7 011F: GOTO 125 0120: COMF 0D,F 0121: COMF 0E,F 0122: INCF 0D,F 0123: BTFSC 03,2 0124: INCF 0E,F 0125: RETLW 00 * 02D7: MOVF 1F,W 02D8: SUBWF 21,W 02D9: MOVWF 0D 02DA: MOVF 22,W 02DB: MOVWF 0C 02DC: MOVF 20,W 02DD: BTFSS 03,0 02DE: DECF 0C,F 02DF: SUBWF 0C,W 02E0: MOVWF 0F 02E1: MOVF 0D,W 02E2: MOVWF 23 02E3: MOVF 0F,W 02E4: MOVWF 24 02E5: MOVLW 00 02E6: MOVWF 26 02E7: MOVLW 64 02E8: MOVWF 25 02E9: MOVF 24,W 02EA: MOVWF 28 02EB: MOVF 23,W 02EC: MOVWF 27 02ED: CALL 0B8 02EE: MOVF 0E,W 02EF: MOVWF 26 02F0: MOVF 0D,W 02F1: MOVWF 25 02F2: MOVF 26,W 02F3: MOVWF 2A 02F4: MOVF 25,W 02F5: MOVWF 29 02F6: MOVF 22,W 02F7: MOVWF 2C 02F8: MOVF 21,W 02F9: MOVWF 2B 02FA: CALL 0E7 02FB: MOVF 0E,W 02FC: MOVWF 0F 02FD: MOVF 0D,W 02FE: MOVWF 0C 02FF: MOVLW E7 0300: ADDWF 0C,W 0301: MOVWF 27 0302: MOVLW FF 0303: BTFSC 03,0 0304: ADDLW 01 0305: ADDWF 0F,W 0306: MOVWF 28 0307: MOVF 28,W 0308: MOVWF 2A 0309: MOVF 27,W 030A: MOVWF 29 030B: MOVLW 00 030C: MOVWF 2C 030D: MOVLW 0A 030E: MOVWF 2B 030F: CALL 0E7 0310: MOVF 0E,W 0311: MOVWF 0F 0312: MOVF 0D,W 0313: ADDWF 1D,F 0314: MOVF 0F,W 0315: BTFSC 03,0 0316: ADDLW 01 0317: ADDWF 1E,F .................... .................... if (ok==3) 0318: MOVLW 03 0319: SUBWF 1C,W 031A: BTFSS 03,2 031B: GOTO 322 .................... { .................... return( temperature ); 031C: MOVF 1D,W 031D: MOVWF 0D 031E: MOVF 1E,W 031F: MOVWF 0E 0320: GOTO 327 .................... } .................... else 0321: GOTO 327 .................... { .................... return( 10000 ); 0322: MOVLW 10 0323: MOVWF 0D 0324: MOVLW 27 0325: MOVWF 0E 0326: GOTO 327 .................... } .................... .................... } .................... .................... .................... display(int digit,int show) .................... { .................... .................... long data=0; .................... int count; * 015B: CLRF 29 015C: CLRF 2A .................... long digitLong; .................... .................... digitLong=(long) digit; 015D: CLRF 2D 015E: MOVF 27,W 015F: MOVWF 2C .................... .................... for(count=0; count<8; ++count) 0160: CLRF 2B 0161: MOVLW 08 0162: SUBWF 2B,W 0163: BTFSC 03,0 0164: GOTO 16A .................... { // form data to pass to display driver, .................... shift_left(&digitLong,2,0); // by shifting digit number 8 places left, 0165: BCF 03,0 0166: RLF 2C,F 0167: RLF 2D,F .................... } 0168: INCF 2B,F 0169: GOTO 161 .................... .................... digitLong+=show; // and adding the symbol code. 016A: MOVF 28,W 016B: ADDWF 2C,F 016C: BTFSC 03,0 016D: INCF 2D,F .................... .................... send7219( digitLong ); 016E: MOVF 2D,W 016F: MOVWF 2F 0170: MOVF 2C,W 0171: MOVWF 2E 0172: CALL 006 0173: RETLW 00 .................... .................... } .................... .................... .................... showTemp(signed long temperatureToShow, short metric, int offset) .................... { .................... .................... signed long temperatureToShowDiv10; .................... .................... int digit; .................... long decode; .................... .................... .................... temperatureToShowDiv10=temperatureToShow/10; * 0189: MOVF 1D,W 018A: MOVWF 2A 018B: MOVF 1C,W 018C: MOVWF 29 018D: MOVLW 00 018E: MOVWF 2C 018F: MOVLW 0A 0190: MOVWF 2B 0191: CALL 0E7 0192: MOVF 0E,W 0193: MOVWF 21 0194: MOVF 0D,W 0195: MOVWF 20 .................... .................... .................... send7219(0b0000110000000000); 0196: MOVLW 0C 0197: MOVWF 2F 0198: CLRF 2E 0199: CALL 006 .................... decode=0b0000100100001111; 019A: MOVLW 09 019B: MOVWF 24 019C: MOVLW 0F 019D: MOVWF 23 .................... .................... for (digit=1; digit<=4; digit++) 019E: MOVLW 01 019F: MOVWF 22 01A0: MOVLW 05 01A1: SUBWF 22,W 01A2: BTFSC 03,0 01A3: GOTO 267 .................... { .................... .................... display(digit,0b1111); 01A4: MOVF 22,W 01A5: MOVWF 27 01A6: MOVLW 0F 01A7: MOVWF 28 01A8: CALL 15B .................... .................... if (digit==offset) 01A9: MOVF 1F,W 01AA: SUBWF 22,W 01AB: BTFSS 03,2 01AC: GOTO 1E9 .................... { .................... .................... if (temperatureToShow<=-10) 01AD: MOVF 1D,W 01AE: XORLW 80 01AF: MOVWF 0C 01B0: MOVLW 7F 01B1: SUBWF 0C,W 01B2: BTFSS 03,0 01B3: GOTO 1BB 01B4: INCF 1D,W 01B5: BTFSS 03,2 01B6: GOTO 1C1 01B7: MOVLW F7 01B8: SUBWF 1C,W 01B9: BTFSC 03,0 01BA: GOTO 1C1 .................... { .................... display( digit, 0b1010); 01BB: MOVF 22,W 01BC: MOVWF 27 01BD: MOVLW 0A 01BE: MOVWF 28 01BF: CALL 15B .................... } .................... else 01C0: GOTO 1E9 .................... { .................... if (temperatureToShow>=100) 01C1: MOVF 1D,W 01C2: XORLW 80 01C3: MOVWF 0C 01C4: MOVLW 81 01C5: SUBWF 0C,W 01C6: BTFSC 03,0 01C7: GOTO 1CF 01C8: MOVF 1D,F 01C9: BTFSS 03,2 01CA: GOTO 1E9 01CB: MOVLW 64 01CC: SUBWF 1C,W 01CD: BTFSS 03,0 01CE: GOTO 1E9 .................... { .................... display( digit,(int)(temperatureToShowDiv10/10)%10); 01CF: MOVF 21,W 01D0: MOVWF 2A 01D1: MOVF 20,W 01D2: MOVWF 29 01D3: MOVLW 00 01D4: MOVWF 2C 01D5: MOVLW 0A 01D6: MOVWF 2B 01D7: CALL 0E7 01D8: MOVF 0E,W 01D9: MOVWF 2A 01DA: MOVF 0D,W 01DB: MOVWF 29 01DC: CLRF 2C 01DD: MOVLW 0A 01DE: MOVWF 2B 01DF: CALL 0E7 01E0: MOVF 0C,W 01E1: MOVWF 25 01E2: MOVF 0F,W 01E3: MOVWF 26 01E4: MOVF 22,W 01E5: MOVWF 27 01E6: MOVF 25,W 01E7: MOVWF 28 01E8: CALL 15B .................... } .................... } .................... .................... } .................... .................... if (digit==offset+1) 01E9: MOVLW 01 01EA: ADDWF 1F,W 01EB: SUBWF 22,W 01EC: BTFSS 03,2 01ED: GOTO 231 .................... { .................... if (temperatureToShow>-10 && temperatureToShow<0) 01EE: MOVF 1D,W 01EF: XORLW 80 01F0: MOVWF 0C 01F1: MOVLW 80 01F2: SUBWF 0C,W 01F3: BTFSC 03,0 01F4: GOTO 1FC 01F5: INCF 1D,W 01F6: BTFSS 03,2 01F7: GOTO 209 01F8: MOVLW F7 01F9: SUBWF 1C,W 01FA: BTFSS 03,0 01FB: GOTO 209 01FC: MOVF 1D,W 01FD: XORLW 80 01FE: MOVWF 0C 01FF: MOVLW 80 0200: SUBWF 0C,W 0201: BTFSC 03,0 0202: GOTO 209 .................... { .................... display( digit, 0b1010); 0203: MOVF 22,W 0204: MOVWF 27 0205: MOVLW 0A 0206: MOVWF 28 0207: CALL 15B .................... } .................... else 0208: GOTO 231 .................... { .................... if (temperatureToShow>=10 || temperatureToShow<=-10) 0209: MOVF 1D,W 020A: XORLW 80 020B: MOVWF 0C 020C: MOVLW 81 020D: SUBWF 0C,W 020E: BTFSC 03,0 020F: GOTO 225 0210: MOVF 1D,F 0211: BTFSS 03,2 0212: GOTO 217 0213: MOVLW 0A 0214: SUBWF 1C,W 0215: BTFSC 03,0 0216: GOTO 225 0217: MOVF 1D,W 0218: XORLW 80 0219: MOVWF 0C 021A: MOVLW 7F 021B: SUBWF 0C,W 021C: BTFSS 03,0 021D: GOTO 225 021E: INCF 1D,W 021F: BTFSS 03,2 0220: GOTO 231 0221: MOVLW F7 0222: SUBWF 1C,W 0223: BTFSC 03,0 0224: GOTO 231 .................... { .................... display( digit,(int)(temperatureToShowDiv10)%10); * 0174: MOVF 26,W 0175: CLRF 0D 0176: SUBWF 25,W 0177: BTFSC 03,0 0178: GOTO 17C 0179: MOVF 25,W 017A: MOVWF 0C 017B: GOTO 188 017C: CLRF 0C 017D: MOVLW 08 017E: MOVWF 27 017F: RLF 25,F 0180: RLF 0C,F 0181: MOVF 26,W 0182: SUBWF 0C,W 0183: BTFSC 03,0 0184: MOVWF 0C 0185: RLF 0D,F 0186: DECFSZ 27,F 0187: GOTO 17F 0188: RETLW 00 * 0225: MOVF 20,W 0226: MOVWF 25 0227: MOVLW 0A 0228: MOVWF 26 0229: CALL 174 022A: MOVF 0C,W 022B: MOVWF 25 022C: MOVF 22,W 022D: MOVWF 27 022E: MOVF 25,W 022F: MOVWF 28 0230: CALL 15B .................... } .................... } .................... } .................... .................... .................... if (digit==offset+2) 0231: MOVLW 02 0232: ADDWF 1F,W 0233: SUBWF 22,W 0234: BTFSS 03,2 0235: GOTO 242 .................... { .................... display( digit,(int)temperatureToShow%10); 0236: MOVF 1C,W 0237: MOVWF 25 0238: MOVLW 0A 0239: MOVWF 26 023A: CALL 174 023B: MOVF 0C,W 023C: MOVWF 25 023D: MOVF 22,W 023E: MOVWF 27 023F: MOVF 25,W 0240: MOVWF 28 0241: CALL 15B .................... } .................... .................... .................... if (digit==offset+3) 0242: MOVLW 03 0243: ADDWF 1F,W 0244: SUBWF 22,W 0245: BTFSS 03,2 0246: GOTO 265 .................... { .................... .................... if (digit==1) bit_clear(decode,0); 0247: MOVLW 01 0248: SUBWF 22,W 0249: BTFSC 03,2 024A: BCF 23,0 .................... if (digit==2) bit_clear(decode,1); 024B: MOVLW 02 024C: SUBWF 22,W 024D: BTFSC 03,2 024E: BCF 23,1 .................... if (digit==3) bit_clear(decode,2); 024F: MOVLW 03 0250: SUBWF 22,W 0251: BTFSC 03,2 0252: BCF 23,2 .................... if (digit==4) bit_clear(decode,3); 0253: MOVLW 04 0254: SUBWF 22,W 0255: BTFSC 03,2 0256: BCF 23,3 .................... .................... if (metric) 0257: MOVF 1E,F 0258: BTFSC 03,2 0259: GOTO 260 .................... { .................... display( digit, 0b11001110 ); // deg C on fourth. 025A: MOVF 22,W 025B: MOVWF 27 025C: MOVLW CE 025D: MOVWF 28 025E: CALL 15B .................... } .................... else 025F: GOTO 265 .................... { .................... display( digit,0b11000111); // deg F on fourth. 0260: MOVF 22,W 0261: MOVWF 27 0262: MOVLW C7 0263: MOVWF 28 0264: CALL 15B .................... } .................... } .................... } 0265: INCF 22,F 0266: GOTO 1A0 .................... .................... send7219(decode); 0267: MOVF 24,W 0268: MOVWF 2F 0269: MOVF 23,W 026A: MOVWF 2E 026B: CALL 006 .................... send7219(0b0000110000000001); 026C: MOVLW 0C 026D: MOVWF 2F 026E: MOVLW 01 026F: MOVWF 2E 0270: CALL 006 0271: RETLW 00 .................... .................... } .................... .................... .................... main() .................... { .................... .................... const int scrollDelay=60; // scroll delay in ms .................... const int displayStyle=1; // 1 for 'bouncing' display, 2 for left-scrolling display, 3 for right-scrolling display .................... .................... signed long temperature, temperatureToShow; .................... int temperatureDecimal,metricI,metricNotI; .................... signed int pos; * 0274: BCF 19,0 0275: BCF 19,1 0276: BCF 19,2 0277: BCF 19,3 .................... short int roundUpC=false, roundUpF=false, metric=false, started=false; * 0272: CLRF 04 0273: CLRF 03 .................... .................... port_b_pullups(TRUE); // set input pullups so 1-wire stays high * 0278: MOVLW 81 0279: MOVWF 04 027A: BCF 00,7 .................... send7219(0b0000101100000011); // scan 4 digits. 027B: MOVLW 0B 027C: MOVWF 2F 027D: MOVLW 03 027E: MOVWF 2E 027F: CALL 006 .................... send7219(0b0000101000001111); // full intensity. 0280: MOVLW 0A 0281: MOVWF 2F 0282: MOVLW 0F 0283: MOVWF 2E 0284: CALL 006 .................... .................... do .................... { .................... do .................... { .................... temperature = readSingleDS1820(); * 0327: MOVF 0E,W 0328: MOVWF 12 0329: MOVF 0D,W 032A: MOVWF 11 .................... } .................... while (temperature==10000); 032B: MOVLW 27 032C: SUBWF 12,W 032D: BTFSS 03,2 032E: GOTO 333 032F: MOVLW 10 0330: SUBWF 11,W 0331: BTFSC 03,2 0332: GOTO 285 .................... .................... if (started) { 0333: BTFSS 19,3 0334: GOTO 36E .................... .................... delay_ms(7000); 0335: MOVLW 1C 0336: MOVWF 1A 0337: MOVLW FA 0338: MOVWF 24 0339: CALL 078 033A: DECFSZ 1A,F 033B: GOTO 337 .................... .................... .................... .................... for (pos=1; pos>=-3; pos--) 033C: MOVLW 01 033D: MOVWF 18 033E: CLRF 0F 033F: MOVF 18,W 0340: BTFSC 18,7 0341: DECF 0F,F 0342: MOVF 18,W 0343: XORLW 80 0344: MOVWF 0C 0345: MOVLW 7D 0346: SUBWF 0C,W 0347: BTFSS 03,0 0348: GOTO 36E .................... { .................... #if (displayStyle==1) .................... showTemp(temperatureToShow,metric,(metricNotI*pos)+(metricI*(2-pos))); // for 'bouncing' display 0349: MOVLW 00 034A: BTFSC 19,2 034B: MOVLW 01 034C: MOVWF 1A 034D: MOVF 17,W 034E: MOVWF 1D 034F: MOVF 18,W 0350: MOVWF 1E 0351: CALL 126 0352: MOVF 0D,W 0353: MOVWF 1B 0354: MOVLW 02 0355: MOVWF 0C 0356: MOVF 18,W 0357: SUBWF 0C,W 0358: MOVWF 1C 0359: MOVF 16,W 035A: MOVWF 1D 035B: MOVF 1C,W 035C: MOVWF 1E 035D: CALL 126 035E: MOVF 0D,W 035F: ADDWF 1B,F 0360: MOVF 14,W 0361: MOVWF 1D 0362: MOVF 13,W 0363: MOVWF 1C 0364: MOVF 1A,W 0365: MOVWF 1E 0366: MOVF 1B,W 0367: MOVWF 1F 0368: CALL 189 .................... #endif .................... #if (displayStyle==2) .................... showTemp(temperatureToShow,metric,pos); // for left-scrolling display .................... #endif .................... #if (displayStyle==3) .................... showTemp(temperatureToShow,metric,2-pos); // for right-scrolling display .................... #endif .................... delay_ms(scrollDelay); 0369: MOVLW 3C 036A: MOVWF 24 036B: CALL 078 .................... } 036C: DECF 18,F 036D: GOTO 33E .................... .................... } .................... started=1; 036E: BSF 19,3 .................... .................... metric=!metric; 036F: MOVLW 04 0370: XORWF 19,F .................... .................... metricI=(int)metric; 0371: CLRF 16 0372: BTFSC 19,2 0373: INCF 16,F .................... metricNotI=(int)!metric; 0374: CLRF 17 0375: BTFSS 19,2 0376: INCF 17,F .................... .................... if (!metric) 0377: BTFSC 19,2 0378: GOTO 399 .................... { .................... temperature*=9; 0379: MOVF 12,W 037A: MOVWF 26 037B: MOVF 11,W 037C: MOVWF 25 037D: MOVLW 00 037E: MOVWF 28 037F: MOVLW 09 0380: MOVWF 27 0381: CALL 0B8 0382: MOVF 0E,W 0383: MOVWF 12 0384: MOVF 0D,W 0385: MOVWF 11 .................... temperature/=5; 0386: MOVF 12,W 0387: MOVWF 2A 0388: MOVF 11,W 0389: MOVWF 29 038A: MOVLW 00 038B: MOVWF 2C 038C: MOVLW 05 038D: MOVWF 2B 038E: CALL 0E7 038F: MOVF 0E,W 0390: MOVWF 12 0391: MOVF 0D,W 0392: MOVWF 11 .................... temperature+=320; 0393: MOVLW 40 0394: ADDWF 11,F 0395: MOVLW 01 0396: BTFSC 03,0 0397: ADDLW 01 0398: ADDWF 12,F .................... } .................... .................... temperatureDecimal=temperature%10; 0399: MOVF 12,W 039A: MOVWF 2A 039B: MOVF 11,W 039C: MOVWF 29 039D: MOVLW 00 039E: MOVWF 2C 039F: MOVLW 0A 03A0: MOVWF 2B 03A1: CALL 0E7 03A2: MOVF 0C,W 03A3: MOVWF 15 .................... temperatureToShow=temperature/10; 03A4: MOVF 12,W 03A5: MOVWF 2A 03A6: MOVF 11,W 03A7: MOVWF 29 03A8: MOVLW 00 03A9: MOVWF 2C 03AA: MOVLW 0A 03AB: MOVWF 2B 03AC: CALL 0E7 03AD: MOVF 0E,W 03AE: MOVWF 14 03AF: MOVF 0D,W 03B0: MOVWF 13 .................... .................... if (temperatureDecimal<4) 03B1: MOVLW 04 03B2: SUBWF 15,W 03B3: BTFSC 03,0 03B4: GOTO 3BA .................... { .................... if (metric) 03B5: BTFSS 19,2 03B6: GOTO 3B9 .................... { .................... roundUpC=false; 03B7: BCF 19,0 .................... } .................... else 03B8: GOTO 3BA .................... { .................... roundUpF=false; 03B9: BCF 19,1 .................... } .................... } .................... .................... if (temperatureDecimal>6) 03BA: MOVLW 07 03BB: SUBWF 15,W 03BC: BTFSS 03,0 03BD: GOTO 3C3 .................... { .................... if (metric) 03BE: BTFSS 19,2 03BF: GOTO 3C2 .................... { .................... roundUpC=true; 03C0: BSF 19,0 .................... } .................... else 03C1: GOTO 3C3 .................... { .................... roundUpF=true; 03C2: BSF 19,1 .................... } .................... } .................... .................... if ((roundUpC && metric) || (roundUpF && !metric)) temperatureToShow++; 03C3: BTFSS 19,0 03C4: GOTO 3C7 03C5: BTFSC 19,2 03C6: GOTO 3CB 03C7: BTFSS 19,1 03C8: GOTO 3CE 03C9: BTFSC 19,2 03CA: GOTO 3CE 03CB: INCF 13,F 03CC: BTFSC 03,2 03CD: INCF 14,F .................... .................... for (pos=5; pos>=1; pos--) 03CE: MOVLW 05 03CF: MOVWF 18 03D0: MOVF 18,W 03D1: XORLW 80 03D2: MOVWF 0C 03D3: MOVLW 81 03D4: SUBWF 0C,W 03D5: BTFSS 03,0 03D6: GOTO 3FC .................... { .................... .................... #if (displayStyle==1) .................... showTemp(temperatureToShow,metric,(metricI*pos)+(metricNotI*(2-pos))); // for 'bouncing' display 03D7: MOVLW 00 03D8: BTFSC 19,2 03D9: MOVLW 01 03DA: MOVWF 1A 03DB: MOVF 16,W 03DC: MOVWF 1D 03DD: MOVF 18,W 03DE: MOVWF 1E 03DF: CALL 126 03E0: MOVF 0D,W 03E1: MOVWF 1B 03E2: MOVLW 02 03E3: MOVWF 0C 03E4: MOVF 18,W 03E5: SUBWF 0C,W 03E6: MOVWF 1C 03E7: MOVF 17,W 03E8: MOVWF 1D 03E9: MOVF 1C,W 03EA: MOVWF 1E 03EB: CALL 126 03EC: MOVF 0D,W 03ED: ADDWF 1B,F 03EE: MOVF 14,W 03EF: MOVWF 1D 03F0: MOVF 13,W 03F1: MOVWF 1C 03F2: MOVF 1A,W 03F3: MOVWF 1E 03F4: MOVF 1B,W 03F5: MOVWF 1F 03F6: CALL 189 .................... #endif .................... #if (displayStyle==2) .................... showTemp(temperatureToShow,metric,pos); // for left-scrolling display .................... #endif .................... #if (displayStyle==3) .................... showTemp(temperatureToShow,metric,2-pos); // for right-scrolling display .................... #endif .................... delay_ms(scrollDelay); 03F7: MOVLW 3C 03F8: MOVWF 24 03F9: CALL 078 .................... } 03FA: DECF 18,F 03FB: GOTO 3D0 .................... .................... } .................... while (TRUE); 03FC: GOTO 285 .................... .................... } 03FD: SLEEP