PIC Clock List
Jump to navigation
Jump to search
PIC Software - clock.lst
CCS PCM C Compiler, Version 3.023, 11997 Filename: D:\PIC\CLOCK3\CLOCK.LST ROM used: 1103 (27%) Largest free fragment is 2048 RAM used: 90 (47%) at main() level 147 (77%) worst case Stack: 4 locations * 0000: NOP 0001: MOVLW 00 0002: MOVWF 0A 0003: GOTO 240 .................... /* Device header and CCS compiler directives */ .................... #include <16f873.h> .................... //////// Standard Header file for the PIC16F873 device //////////////// .................... #device PIC16F873 .................... #list .................... .................... .................... #device ICD=TRUE /* Incase we use the ICD */ .................... #device ADC=8 /* Only use the 8 MSBs */ .................... #use delay( clock=4000000 ) /* Set for a 4MHz Clock */ 0004: MOVLW D0 0005: MOVWF 04 0006: MOVF 00,W 0007: BTFSC 03,2 0008: GOTO 018 0009: MOVLW 01 000A: MOVWF 21 000B: CLRF 20 000C: DECFSZ 20,F 000D: GOTO 00C 000E: DECFSZ 21,F 000F: GOTO 00B 0010: MOVLW 4A 0011: MOVWF 20 0012: DECFSZ 20,F 0013: GOTO 012 0014: NOP 0015: NOP 0016: DECFSZ 00,F 0017: GOTO 009 0018: RETLW 00 .................... .................... /* Include the code for the LCD display */ .................... #include "lcd.c" .................... /* Define the hardware connections */ .................... const int LCD_EN_LINE = PIN_B1; /* Enable device, high-low to clock data */ .................... const int LCD_RW_LINE = PIN_B2; /* Read / Write line */ .................... const int LCD_RS_LINE = PIN_B3; /* Register Select line command or character */ .................... const int LCD_BUSY_PIN = PIN_C7; /* DB7 (connected to C7 shows busy flag */ .................... .................... /* Define some commands */ .................... const int LCD_CLEAR = 0x01; /* Clear the display and send cursor to Home */ .................... const int LCD_CUR_HOME = 0x02; /* Send the cursor to Home but keep display */ .................... .................... const int LCD_CUR_DEC = 0x04; /* Set cursor to move left after character */ .................... const int LCD_CUR_INC = 0x06; /* Set cursor to move right after character */ .................... const int LCD_CUR_SCR_R = 0x05; /* Set display to move right after character */ .................... const int LCD_CUR_SCR_L = 0x07; /* Set display to move left after character */ .................... .................... const int LCD_DISP_OFF = 0x08; /* Turn off the LCD display */ .................... const int LCD_DISP_ON = 0x0C; /* Turn on display, no cursor */ .................... const int LCD_DISP_CUR = 0x0E; /* Turn on display, with cursor */ .................... const int LCD_DISP_BLINK = 0x0F; /* Turn on display, with blinking cursor */ .................... .................... const int LCD_SHFT_CUR_L = 0x10; /* Decrement the cursor (move left) */ .................... const int LCD_SHFT_CUR_R = 0x14; /* Increment the cursor (move right) */ .................... const int LCD_SHFT_SCR_L = 0x18; /* Shift the display (scroll) to the left */ .................... const int LCD_SHFT_SCR_R = 0x1C; /* Shift the display (scroll) to the right */ .................... .................... const int LCD_SIZE_LARGE = 0x34; /* Large cursor, one line, 8 bit interface */ .................... const int LCD_SIZE_SMALL = 0x38; /* Small cursor, two lines, 8 bit interface */ .................... .................... /* Address is added to the following two values, up to 0F for each line */ .................... const int LCD_DD_ADD_L1 = 0x80; /* First Display RAM address on Line 1 */ .................... const int LCD_DD_ADD_L2 = 0xC0; /* First Display RAM address on Line 2 */ .................... .................... /* Line number for dots is added to each of the following addresses, up to 07 */ .................... const int LCD_CG_ADD_C0 = 0x40; /* First Character Generator RAM address */ .................... const int LCD_CG_ADD_C1 = 0x48; /* Second Character Generator RAM address */ .................... const int LCD_CG_ADD_C2 = 0x50; /* Third Character Generator RAM address */ .................... const int LCD_CG_ADD_C3 = 0x58; /* Fourth Character Generator RAM address */ .................... const int LCD_CG_ADD_C4 = 0x60; /* Fifth Character Generator RAM address */ .................... const int LCD_CG_ADD_C5 = 0x68; /* Sixth Character Generator RAM address */ .................... const int LCD_CG_ADD_C6 = 0x70; /* Seventh Character Generator RAM address */ .................... const int LCD_CG_ADD_C7 = 0x78; /* Eighth Character Generator RAM address */ .................... .................... .................... /* Functions */ .................... void lcd_command( char command ); .................... void lcd_character( char character ); .................... void lcd_number( int number ); .................... void lcd_initialise( int size ); .................... .................... .................... void lcd_command( char command ) .................... /* Sends the given command to the LCD display. Most of the commands are */ .................... /* defined in the header. This function will wait for the busy flag on the */ .................... /* display to clear before sending the command and returning. */ .................... { .................... output_low( LCD_RS_LINE ); 0019: BSF 03,5 001A: BCF 06,3 001B: BCF 03,5 001C: BCF 06,3 .................... output_high( LCD_RW_LINE ); 001D: BSF 03,5 001E: BCF 06,2 001F: BCF 03,5 0020: BSF 06,2 .................... .................... /* Wait for busy flag */ .................... while( input( LCD_BUSY_PIN ) ); 0021: BSF 25,7 0022: MOVF 25,W 0023: BSF 03,5 0024: MOVWF 07 0025: BCF 03,5 0026: BTFSC 07,7 0027: GOTO 021 0028: GOTO 029 .................... .................... output_low( LCD_RW_LINE ); 0029: BSF 03,5 002A: BCF 06,2 002B: BCF 03,5 002C: BCF 06,2 .................... .................... /* Send the command */ .................... output_c( command ); 002D: MOVLW 00 002E: MOVWF 25 002F: BSF 03,5 0030: MOVWF 07 0031: MOVF 4F,W 0032: BCF 03,5 0033: MOVWF 07 .................... output_low( LCD_EN_LINE ); 0034: BSF 03,5 0035: BCF 06,1 0036: BCF 03,5 0037: BCF 06,1 .................... delay_us( 200 ); 0038: MOVLW 42 0039: MOVWF 20 003A: DECFSZ 20,F 003B: GOTO 03A 003C: NOP .................... output_high( LCD_EN_LINE ); 003D: BSF 03,5 003E: BCF 06,1 003F: BCF 03,5 0040: BSF 06,1 .................... .................... /* Impose a 5ms delay while the command is processed */ .................... delay_ms( 5 ); 0041: MOVLW 05 0042: BSF 03,5 0043: MOVWF 50 0044: BCF 03,5 0045: CALL 004 0046: RETLW 00 .................... } .................... .................... .................... void lcd_character( char character ) .................... /* Sends the given character to the LCD display. ASCII Numbers and letters */ .................... /* are valid, and punctuation below 0x7F. Characters 0x00 to 0x0F are the */ .................... /* Generated Characters, which will be blank initially. Other useful symbols */ .................... /* and Greek characters may be found in the range 0x80 to 0xFF */ .................... { .................... output_low( LCD_RS_LINE ); * 0093: BSF 03,5 0094: BCF 06,3 0095: BCF 03,5 0096: BCF 06,3 .................... output_high( LCD_RW_LINE ); 0097: BSF 03,5 0098: BCF 06,2 0099: BCF 03,5 009A: BSF 06,2 .................... .................... /* Wait for busy flag */ .................... while( input( LCD_BUSY_PIN ) ); 009B: BSF 25,7 009C: MOVF 25,W 009D: BSF 03,5 009E: MOVWF 07 009F: BCF 03,5 00A0: BTFSC 07,7 00A1: GOTO 09B 00A2: GOTO 0A3 .................... .................... output_low( LCD_RW_LINE ); 00A3: BSF 03,5 00A4: BCF 06,2 00A5: BCF 03,5 00A6: BCF 06,2 .................... output_high( LCD_RS_LINE ); 00A7: BSF 03,5 00A8: BCF 06,3 00A9: BCF 03,5 00AA: BSF 06,3 .................... .................... /* Send the command */ .................... output_c( character ); 00AB: MOVLW 00 00AC: MOVWF 25 00AD: BSF 03,5 00AE: MOVWF 07 00AF: MOVF 53,W 00B0: BCF 03,5 00B1: MOVWF 07 .................... output_low( LCD_EN_LINE ); 00B2: BSF 03,5 00B3: BCF 06,1 00B4: BCF 03,5 00B5: BCF 06,1 .................... delay_us( 200 ); 00B6: MOVLW 42 00B7: MOVWF 20 00B8: DECFSZ 20,F 00B9: GOTO 0B8 00BA: NOP .................... output_high( LCD_EN_LINE ); 00BB: BSF 03,5 00BC: BCF 06,1 00BD: BCF 03,5 00BE: BSF 06,1 00BF: RETLW 00 .................... } .................... .................... .................... void lcd_number( int number ) .................... /* Sends the given number to the LCD display, with up to 2 characters. This */ .................... /* limits number to 100 */ .................... { .................... int tens = 0; * 00EF: CLRF 50 00F0: CLRF 51 00F1: BCF 03,5 .................... int units = 0; .................... .................... while( number > 9 ) 00F2: BSF 03,5 00F3: MOVF 4F,W 00F4: SUBLW 09 00F5: BTFSS 03,0 00F6: GOTO 0F9 00F7: BCF 03,5 00F8: GOTO 100 00F9: BCF 03,5 .................... { .................... tens++; 00FA: BSF 03,5 00FB: INCF 50,F .................... number -= 10; 00FC: MOVLW 0A 00FD: SUBWF 4F,F .................... } 00FE: BCF 03,5 00FF: GOTO 0F2 .................... units = number; 0100: BSF 03,5 0101: MOVF 4F,W 0102: MOVWF 51 .................... .................... lcd_character( '0' + tens ); 0103: MOVLW 30 0104: ADDWF 50,W 0105: MOVWF 52 0106: MOVWF 53 0107: BCF 03,5 0108: CALL 093 .................... lcd_character( '0' + units ); 0109: MOVLW 30 010A: BSF 03,5 010B: ADDWF 51,W 010C: MOVWF 52 010D: MOVWF 53 010E: BCF 03,5 010F: CALL 093 .................... } .................... .................... .................... void lcd_initialise( int size ) .................... /* Initialises the display incase the initialisation at startup failed or the */ .................... /* cursor size is to be changed. 'size' is LCD_SIZE_SMALL or LCD_SIZE_LARGE */ .................... { .................... int i; .................... .................... delay_ms( 15 ); * 0047: MOVLW 0F 0048: BSF 03,5 0049: MOVWF 50 004A: BCF 03,5 004B: CALL 004 .................... output_low( LCD_RS_LINE ); 004C: BSF 03,5 004D: BCF 06,3 004E: BCF 03,5 004F: BCF 06,3 .................... .................... for( i = 0; i < 3; i++ ) 0050: BSF 03,5 0051: CLRF 49 0052: BCF 03,5 0053: BSF 03,5 0054: MOVF 49,W 0055: SUBLW 02 0056: BTFSC 03,0 0057: GOTO 05A 0058: BCF 03,5 0059: GOTO 078 005A: BCF 03,5 .................... { .................... output_c( size ); 005B: MOVLW 00 005C: MOVWF 25 005D: BSF 03,5 005E: MOVWF 07 005F: MOVF 48,W 0060: BCF 03,5 0061: MOVWF 07 .................... .................... output_low( LCD_EN_LINE ); 0062: BSF 03,5 0063: BCF 06,1 0064: BCF 03,5 0065: BCF 06,1 .................... delay_us( 200 ); 0066: MOVLW 42 0067: MOVWF 20 0068: DECFSZ 20,F 0069: GOTO 068 006A: NOP .................... output_high( LCD_EN_LINE ); 006B: BSF 03,5 006C: BCF 06,1 006D: BCF 03,5 006E: BSF 06,1 .................... .................... delay_ms( 5 ); 006F: MOVLW 05 0070: BSF 03,5 0071: MOVWF 50 0072: BCF 03,5 0073: CALL 004 .................... } 0074: BSF 03,5 0075: INCF 49,F 0076: BCF 03,5 0077: GOTO 053 .................... .................... lcd_command( size ); 0078: BSF 03,5 0079: MOVF 48,W 007A: MOVWF 4F 007B: BCF 03,5 007C: CALL 019 .................... lcd_command( LCD_DISP_OFF ); 007D: MOVLW 08 007E: BSF 03,5 007F: MOVWF 4F 0080: BCF 03,5 0081: CALL 019 .................... lcd_command( LCD_DISP_ON ); 0082: MOVLW 0C 0083: BSF 03,5 0084: MOVWF 4F 0085: BCF 03,5 0086: CALL 019 .................... lcd_command( LCD_CUR_INC ); 0087: MOVLW 06 0088: BSF 03,5 0089: MOVWF 4F 008A: BCF 03,5 008B: CALL 019 .................... lcd_command( LCD_CLEAR ); 008C: MOVLW 01 008D: BSF 03,5 008E: MOVWF 4F 008F: BCF 03,5 0090: CALL 019 0091: BCF 0A,3 0092: GOTO 2FE .................... } .................... .................... .................... .................... /* Define the hardware connections */ .................... const int CLOCK_EN_LINE = PIN_B0; /* Enable device */ .................... const int CLOCK_DATA_PIN = 0; /* Clock Data connected to ADC pin 0 */ .................... const int CLOCK_DATA_LED = PIN_B5; /* LED to show incomming pulses */ .................... const int CLOCK_EROR_LED = PIN_B4; /* LED to show error reading pulses */ .................... .................... const int THRESHOLD = 0x80; .................... .................... enum PULSE_TYPE { PT_ERROR, /* Unidentified pulse */ .................... PT_SHORT, /* 75ms to 175ms pulse */ .................... PT_LONG, /* 175ms to 375ms pulse */ .................... PT_DOUBLE, /* Two short pulses */ .................... PT_START}; /* 375ms to 600ms pulse */ .................... .................... .................... /* Global Variables */ .................... int seconds = 0; .................... .................... /* Functions */ .................... PULSE_TYPE clock_get_pulse(); .................... int clock_get_value( int no_of_pulses ); .................... .................... .................... PULSE_TYPE clock_get_pulse() .................... /* Waits for the next pulse and returns the type of pulse */ .................... /* this can be LONG, SHORT, START, DOUBLE or ERROR as */ .................... /* defined in the enumeration above */ .................... { .................... int pulse_shape; .................... int i; .................... int factor; .................... .................... set_adc_channel( CLOCK_DATA_PIN ); * 00C0: MOVLW 00 00C1: MOVWF 21 00C2: MOVF 1F,W 00C3: ANDLW C7 00C4: IORWF 21,W 00C5: MOVWF 1F .................... output_low( CLOCK_DATA_LED ); 00C6: BSF 03,5 00C7: BCF 06,5 00C8: BCF 03,5 00C9: BCF 06,5 .................... .................... /* Wait for the input to go high */ .................... while( TRUE ) .................... { .................... if( read_adc() > THRESHOLD ) 00CA: BSF 1F,2 00CB: BTFSC 1F,2 00CC: GOTO 0CB 00CD: MOVF 1E,W 00CE: SUBLW 80 00CF: BTFSS 03,0 .................... break; 00D0: GOTO 0D2 .................... } 00D1: GOTO 0CA .................... output_high( CLOCK_DATA_LED ); 00D2: BSF 03,5 00D3: BCF 06,5 00D4: BCF 03,5 00D5: BSF 06,5 .................... .................... /* Wait for the input to go low */ .................... while( TRUE ) .................... { .................... if( read_adc() < THRESHOLD ) 00D6: BSF 1F,2 00D7: BTFSC 1F,2 00D8: GOTO 0D7 00D9: MOVF 1E,W 00DA: SUBLW 7F 00DB: BTFSC 03,0 .................... break; 00DC: GOTO 0DE .................... } 00DD: GOTO 0D6 .................... output_low( CLOCK_DATA_LED ); 00DE: BSF 03,5 00DF: BCF 06,5 00E0: BCF 03,5 00E1: BCF 06,5 .................... .................... /* Increment the seconds and display */ .................... lcd_command( LCD_DD_ADD_L2 + 7 ); 00E2: MOVLW C7 00E3: BSF 03,5 00E4: MOVWF 4F 00E5: BCF 03,5 00E6: CALL 019 .................... if( ++seconds == 60 ) 00E7: INCF 26,F 00E8: MOVF 26,W 00E9: SUBLW 3C 00EA: BTFSC 03,2 .................... seconds = 0; 00EB: CLRF 26 .................... lcd_number( seconds ); 00EC: MOVF 26,W 00ED: BSF 03,5 00EE: MOVWF 4F .................... .................... pulse_shape = 0; * 0110: BSF 03,5 0111: CLRF 4C .................... factor = 2; 0112: MOVLW 02 0113: MOVWF 4E .................... .................... /* Record the shape of the pulse */ .................... delay_ms( 70 ); /* after 70ms */ 0114: MOVLW 46 0115: MOVWF 50 0116: BCF 03,5 0117: CALL 004 .................... if( read_adc() < THRESHOLD ) 0118: BSF 1F,2 0119: BTFSC 1F,2 011A: GOTO 119 011B: MOVF 1E,W 011C: SUBLW 7F 011D: BTFSS 03,0 011E: GOTO 128 .................... { .................... output_low( CLOCK_DATA_LED ); 011F: BSF 03,5 0120: BCF 06,5 0121: BCF 03,5 0122: BCF 06,5 .................... pulse_shape += 1; 0123: MOVLW 01 0124: BSF 03,5 0125: ADDWF 4C,F .................... } .................... else 0126: BCF 03,5 0127: GOTO 12C .................... output_high( CLOCK_DATA_LED ); 0128: BSF 03,5 0129: BCF 06,5 012A: BCF 03,5 012B: BSF 06,5 .................... .................... for( i = 0; i < 3; i++ ) 012C: BSF 03,5 012D: CLRF 4D 012E: BCF 03,5 012F: BSF 03,5 0130: MOVF 4D,W 0131: SUBLW 02 0132: BTFSC 03,0 0133: GOTO 136 0134: BCF 03,5 0135: GOTO 158 0136: BCF 03,5 .................... { .................... /* After 170, 270 and 370ms */ .................... delay_ms( 100 ); 0137: MOVLW 64 0138: BSF 03,5 0139: MOVWF 50 013A: BCF 03,5 013B: CALL 004 .................... if( read_adc() < THRESHOLD ) 013C: BSF 1F,2 013D: BTFSC 1F,2 013E: GOTO 13D 013F: MOVF 1E,W 0140: SUBLW 7F 0141: BTFSS 03,0 0142: GOTO 14C .................... { .................... output_low( CLOCK_DATA_LED ); 0143: BSF 03,5 0144: BCF 06,5 0145: BCF 03,5 0146: BCF 06,5 .................... pulse_shape += factor; 0147: BSF 03,5 0148: MOVF 4E,W 0149: ADDWF 4C,F .................... } .................... else 014A: BCF 03,5 014B: GOTO 150 .................... output_high( CLOCK_DATA_LED ); 014C: BSF 03,5 014D: BCF 06,5 014E: BCF 03,5 014F: BSF 06,5 .................... .................... factor *= 2; 0150: BCF 03,0 0151: BSF 03,5 0152: RLF 4E,F 0153: BCF 03,5 .................... } 0154: BSF 03,5 0155: INCF 4D,F 0156: BCF 03,5 0157: GOTO 12F .................... .................... /* Wait out the rest of the period */ .................... if( read_adc() > THRESHOLD ) 0158: BSF 1F,2 0159: BTFSC 1F,2 015A: GOTO 159 015B: MOVF 1E,W 015C: SUBLW 80 015D: BTFSC 03,0 015E: GOTO 16F .................... delay_ms( 600 ); 015F: MOVLW 03 0160: BSF 03,5 0161: MOVWF 4F 0162: BCF 03,5 0163: MOVLW C8 0164: BSF 03,5 0165: MOVWF 50 0166: BCF 03,5 0167: CALL 004 0168: BSF 03,5 0169: DECFSZ 4F,F 016A: GOTO 16C 016B: GOTO 16E 016C: BCF 03,5 016D: GOTO 163 016E: BCF 03,5 .................... .................... switch( pulse_shape ) 016F: BSF 03,5 0170: MOVF 4C,W 0171: ADDLW F0 0172: BTFSS 03,0 0173: GOTO 176 0174: BCF 03,5 0175: GOTO 1A8 0176: ADDLW 10 0177: BCF 03,5 0178: GOTO 1AB .................... { .................... case 0: .................... case 2: .................... case 4: .................... case 8: .................... output_low( CLOCK_EROR_LED ); 0179: BSF 03,5 017A: BCF 06,4 017B: BCF 03,5 017C: BCF 06,4 .................... return PT_ERROR; 017D: MOVLW 00 017E: MOVWF 21 017F: GOTO 1AA .................... case 1: .................... return PT_SHORT; 0180: MOVLW 01 0181: MOVWF 21 0182: GOTO 1AA .................... case 3: .................... case 7: .................... return PT_LONG; 0183: MOVLW 02 0184: MOVWF 21 0185: GOTO 1AA .................... case 5: .................... return PT_DOUBLE; 0186: MOVLW 03 0187: MOVWF 21 0188: GOTO 1AA .................... case 15: .................... /* Check the low ends after 500ms */ .................... delay_ms( 230 ); /* after 600ms */ 0189: MOVLW E6 018A: BSF 03,5 018B: MOVWF 50 018C: BCF 03,5 018D: CALL 004 .................... if( read_adc() < THRESHOLD ) 018E: BSF 1F,2 018F: BTFSC 1F,2 0190: GOTO 18F 0191: MOVF 1E,W 0192: SUBLW 7F 0193: BTFSS 03,0 0194: GOTO 19D .................... { .................... output_low( CLOCK_EROR_LED ); 0195: BSF 03,5 0196: BCF 06,4 0197: BCF 03,5 0198: BCF 06,4 .................... return PT_ERROR; 0199: MOVLW 00 019A: MOVWF 21 019B: GOTO 1AA .................... } .................... else 019C: GOTO 1A8 .................... { .................... output_high( CLOCK_DATA_LED ); 019D: BSF 03,5 019E: BCF 06,5 019F: BCF 03,5 01A0: BSF 06,5 .................... output_high( CLOCK_EROR_LED ); 01A1: BSF 03,5 01A2: BCF 06,4 01A3: BCF 03,5 01A4: BSF 06,4 .................... return PT_START; 01A5: MOVLW 04 01A6: MOVWF 21 01A7: GOTO 1AA .................... } .................... } * 01AB: BSF 0A,0 01AC: BCF 0A,1 01AD: BCF 0A,2 01AE: ADDWF 02,F 01AF: GOTO 179 01B0: GOTO 180 01B1: GOTO 179 01B2: GOTO 183 01B3: GOTO 179 01B4: GOTO 186 01B5: GOTO 1A8 01B6: GOTO 183 01B7: GOTO 179 01B8: GOTO 1A8 01B9: GOTO 1A8 01BA: GOTO 1A8 01BB: GOTO 1A8 01BC: GOTO 1A8 01BD: GOTO 1A8 01BE: GOTO 189 .................... .................... return PT_ERROR; * 01A8: MOVLW 00 01A9: MOVWF 21 01AA: RETLW 00 .................... } .................... .................... .................... int clock_get_value( int no_of_pulses ) .................... /* Collects the given number of pulses and returns the */ .................... /* decimal value where the first pulse is the most MSB. */ .................... /* 255 is returned as an error. */ .................... { .................... PULSE_TYPE pulse; .................... int p; * 01BF: BSF 03,5 01C0: CLRF 4B .................... int value = 0; .................... .................... for( p = 0; p < no_of_pulses; p++ ) 01C1: CLRF 4A 01C2: BCF 03,5 01C3: BSF 03,5 01C4: MOVF 48,W 01C5: SUBWF 4A,W 01C6: BTFSS 03,0 01C7: GOTO 1CA 01C8: BCF 03,5 01C9: GOTO 1EE 01CA: BCF 03,5 .................... { .................... pulse = clock_get_pulse(); 01CB: CALL 0C0 01CC: MOVF 21,W 01CD: BSF 03,5 01CE: MOVWF 49 .................... .................... switch( pulse ) 01CF: MOVF 49,W 01D0: BCF 03,5 01D1: MOVWF 20 01D2: MOVLW 01 01D3: SUBWF 20,W 01D4: BTFSC 03,2 01D5: GOTO 1DB 01D6: MOVLW 02 01D7: SUBWF 20,W 01D8: BTFSC 03,2 01D9: GOTO 1E0 01DA: GOTO 1E7 .................... { .................... case PT_SHORT: .................... value *= 2; 01DB: BCF 03,0 01DC: BSF 03,5 01DD: RLF 4B,F .................... break; 01DE: BCF 03,5 01DF: GOTO 1EA .................... case PT_LONG: .................... value *= 2; 01E0: BCF 03,0 01E1: BSF 03,5 01E2: RLF 4B,F .................... value += 1; 01E3: MOVLW 01 01E4: ADDWF 4B,F .................... break; 01E5: BCF 03,5 01E6: GOTO 1EA .................... default: .................... return 255; 01E7: MOVLW FF 01E8: MOVWF 21 01E9: GOTO 1F2 .................... } .................... } 01EA: BSF 03,5 01EB: INCF 4A,F 01EC: BCF 03,5 01ED: GOTO 1C3 .................... .................... return value; 01EE: BSF 03,5 01EF: MOVF 4B,W 01F0: BCF 03,5 01F1: MOVWF 21 01F2: RETLW 00 .................... } .................... .................... void main() .................... /* This loop Waits for the start pulse and then decodes */ .................... /* the following 51 pulses to get the time and date. */ .................... { .................... int i; .................... int value1; .................... int value2; .................... char please_wait[15] = "Please Wait..."; .................... char day[22] = "SunMonTueWedThuFriSat"; * 0248: MOVLW 50 0249: MOVWF 2A 024A: MOVLW 6C 024B: MOVWF 2B 024C: MOVLW 65 024D: MOVWF 2C 024E: MOVLW 61 024F: MOVWF 2D 0250: MOVLW 73 0251: MOVWF 2E 0252: MOVLW 65 0253: MOVWF 2F 0254: MOVLW 20 0255: MOVWF 30 0256: MOVLW 57 0257: MOVWF 31 0258: MOVLW 61 0259: MOVWF 32 025A: MOVLW 69 025B: MOVWF 33 025C: MOVLW 74 025D: MOVWF 34 025E: MOVLW 2E 025F: MOVWF 35 0260: MOVLW 2E 0261: MOVWF 36 0262: MOVLW 2E 0263: MOVWF 37 0264: CLRF 38 0265: MOVLW 53 0266: MOVWF 39 0267: MOVLW 75 0268: MOVWF 3A 0269: MOVLW 6E 026A: MOVWF 3B 026B: MOVLW 4D 026C: MOVWF 3C 026D: MOVLW 6F 026E: MOVWF 3D 026F: MOVLW 6E 0270: MOVWF 3E 0271: MOVLW 54 0272: MOVWF 3F 0273: MOVLW 75 0274: MOVWF 40 0275: MOVLW 65 0276: MOVWF 41 0277: MOVLW 57 0278: MOVWF 42 0279: MOVLW 65 027A: MOVWF 43 027B: MOVLW 64 027C: MOVWF 44 027D: MOVLW 54 027E: MOVWF 45 027F: MOVLW 68 0280: MOVWF 46 0281: MOVLW 75 0282: MOVWF 47 0283: MOVLW 46 0284: MOVWF 48 0285: MOVLW 72 0286: MOVWF 49 0287: MOVLW 69 0288: MOVWF 4A 0289: MOVLW 53 028A: MOVWF 4B 028B: MOVLW 61 028C: MOVWF 4C 028D: MOVLW 74 028E: MOVWF 4D 028F: CLRF 4E 0290: MOVLW 20 0291: BSF 03,5 0292: MOVWF 20 0293: MOVLW 20 0294: MOVWF 21 0295: MOVLW 20 0296: MOVWF 22 0297: MOVLW 4A 0298: MOVWF 23 0299: MOVLW 61 029A: MOVWF 24 029B: MOVLW 6E 029C: MOVWF 25 029D: MOVLW 46 029E: MOVWF 26 029F: MOVLW 65 02A0: MOVWF 27 02A1: MOVLW 62 02A2: MOVWF 28 02A3: MOVLW 4D 02A4: MOVWF 29 02A5: MOVLW 61 02A6: MOVWF 2A 02A7: MOVLW 72 02A8: MOVWF 2B 02A9: MOVLW 41 02AA: MOVWF 2C 02AB: MOVLW 70 02AC: MOVWF 2D 02AD: MOVLW 72 02AE: MOVWF 2E 02AF: MOVLW 4D 02B0: MOVWF 2F 02B1: MOVLW 61 02B2: MOVWF 30 02B3: MOVLW 79 02B4: MOVWF 31 02B5: MOVLW 4A 02B6: MOVWF 32 02B7: MOVLW 75 02B8: MOVWF 33 02B9: MOVLW 6E 02BA: MOVWF 34 02BB: MOVLW 4A 02BC: MOVWF 35 02BD: MOVLW 75 02BE: MOVWF 36 02BF: MOVLW 6C 02C0: MOVWF 37 02C1: MOVLW 41 02C2: MOVWF 38 02C3: MOVLW 75 02C4: MOVWF 39 02C5: MOVLW 67 02C6: MOVWF 3A 02C7: MOVLW 53 02C8: MOVWF 3B 02C9: MOVLW 65 02CA: MOVWF 3C 02CB: MOVLW 70 02CC: MOVWF 3D 02CD: MOVLW 4F 02CE: MOVWF 3E 02CF: MOVLW 63 02D0: MOVWF 3F 02D1: MOVLW 74 02D2: MOVWF 40 02D3: MOVLW 4E 02D4: MOVWF 41 02D5: MOVLW 6F 02D6: MOVWF 42 02D7: MOVLW 76 02D8: MOVWF 43 02D9: MOVLW 44 02DA: MOVWF 44 02DB: MOVLW 65 02DC: MOVWF 45 02DD: MOVLW 63 02DE: MOVWF 46 02DF: CLRF 47 .................... char month[40] = " JanFebMarAprMayJunJulAugSepOctNovDec"; * 0240: CLRF 04 0241: MOVLW 9F 0242: MOVWF 04 0243: MOVLW 07 0244: MOVWF 00 0245: MOVLW FF 0246: MOVWF 25 0247: CLRF 26 .................... .................... setup_counters( RTCC_INTERNAL, RTCC_DIV_256 ); * 02E0: MOVLW 07 02E1: BCF 03,5 02E2: MOVWF 20 02E3: BTFSS 20,3 02E4: GOTO 2ED 02E5: MOVLW 07 02E6: CLRF 01 02E7: MOVLW 81 02E8: MOVWF 04 02E9: MOVF 00,W 02EA: ANDLW C0 02EB: IORLW 0F 02EC: MOVWF 00 02ED: CLRWDT 02EE: MOVLW 81 02EF: MOVWF 04 02F0: MOVF 00,W 02F1: ANDLW C0 02F2: IORWF 20,W 02F3: MOVWF 00 .................... setup_adc( ADC_CLOCK_INTERNAL ); 02F4: MOVF 1F,W 02F5: ANDLW 38 02F6: IORLW C1 02F7: MOVWF 1F .................... setup_adc_ports( ALL_ANALOG ); 02F8: BSF 03,5 02F9: CLRF 1F .................... .................... lcd_initialise( LCD_SIZE_SMALL ); 02FA: MOVLW 38 02FB: MOVWF 48 02FC: BCF 03,5 02FD: GOTO 047 .................... .................... /* Enable the rugby clock */ .................... output_low( PIN_B0 ); 02FE: BSF 03,5 02FF: BCF 06,0 0300: BCF 03,5 0301: BCF 06,0 .................... .................... /* Put up the 'Please Wait...' message */ .................... for( i = 0; i < 14; i++ ) 0302: CLRF 27 0303: MOVF 27,W 0304: SUBLW 0D 0305: BTFSS 03,0 0306: GOTO 312 .................... lcd_character( please_wait[i] ); 0307: MOVLW 2A 0308: ADDWF 27,W 0309: MOVWF 04 030A: MOVF 00,W 030B: MOVWF 4F 030C: BSF 03,5 030D: MOVWF 53 030E: BCF 03,5 030F: CALL 093 0310: INCF 27,F 0311: GOTO 303 .................... seconds = 0; 0312: CLRF 26 .................... .................... /* Wait for the start pulse from the clock */ .................... while( clock_get_pulse() != PT_START ); 0313: CALL 0C0 0314: MOVF 21,W 0315: SUBLW 04 0316: BTFSC 03,2 0317: GOTO 319 0318: GOTO 313 .................... lcd_command( LCD_CLEAR ); 0319: MOVLW 01 031A: BSF 03,5 031B: MOVWF 4F 031C: BCF 03,5 031D: CALL 019 .................... seconds = 0; 031E: CLRF 26 .................... .................... while( TRUE ) .................... { .................... /* Count the number of double pulses and display */ .................... value1 = 0; 031F: CLRF 28 .................... for( i = 0; i < 8; i++ ) 0320: CLRF 27 0321: MOVF 27,W 0322: SUBLW 07 0323: BTFSS 03,0 0324: GOTO 32C .................... { .................... if( clock_get_pulse() == PT_DOUBLE ) 0325: CALL 0C0 0326: MOVF 21,W 0327: SUBLW 03 0328: BTFSC 03,2 .................... value1--; 0329: DECF 28,F .................... } 032A: INCF 27,F 032B: GOTO 321 .................... for( i = 8; i < 16; i++ ) 032C: MOVLW 08 032D: MOVWF 27 032E: MOVF 27,W 032F: SUBLW 0F 0330: BTFSS 03,0 0331: GOTO 339 .................... { .................... if( clock_get_pulse() == PT_DOUBLE ) 0332: CALL 0C0 0333: MOVF 21,W 0334: SUBLW 03 0335: BTFSC 03,2 .................... value1++; 0336: INCF 28,F .................... } 0337: INCF 27,F 0338: GOTO 32E .................... lcd_command( LCD_DD_ADD_L2 + 11 ); 0339: MOVLW CB 033A: BSF 03,5 033B: MOVWF 4F 033C: BCF 03,5 033D: CALL 019 .................... lcd_character( '(' ); 033E: MOVLW 28 033F: BSF 03,5 0340: MOVWF 53 0341: BCF 03,5 0342: CALL 093 .................... lcd_character( '+' ); 0343: MOVLW 2B 0344: BSF 03,5 0345: MOVWF 53 0346: BCF 03,5 0347: CALL 093 .................... if( value1 < 0 ) .................... { .................... lcd_command( LCD_SHFT_CUR_L ); .................... lcd_character( '-' ); .................... value1 = -value1; .................... } .................... lcd_character( '0' + value1 ); 0348: MOVLW 30 0349: ADDWF 28,W 034A: MOVWF 4F 034B: BSF 03,5 034C: MOVWF 53 034D: BCF 03,5 034E: CALL 093 .................... lcd_character( ')' ); 034F: MOVLW 29 0350: BSF 03,5 0351: MOVWF 53 0352: BCF 03,5 0353: CALL 093 .................... .................... /* Get the Year and display */ .................... value1 = clock_get_value( 4 ); 0354: MOVLW 04 0355: BSF 03,5 0356: MOVWF 48 0357: BCF 03,5 0358: CALL 1BF 0359: MOVF 21,W 035A: MOVWF 28 .................... value2 = clock_get_value( 4 ); 035B: MOVLW 04 035C: BSF 03,5 035D: MOVWF 48 035E: BCF 03,5 035F: CALL 1BF 0360: MOVF 21,W 0361: MOVWF 29 .................... lcd_command( LCD_DD_ADD_L1 + 11 ); 0362: MOVLW 8B 0363: BSF 03,5 0364: MOVWF 4F 0365: BCF 03,5 0366: CALL 019 .................... lcd_character( '2' ); 0367: MOVLW 32 0368: BSF 03,5 0369: MOVWF 53 036A: BCF 03,5 036B: CALL 093 .................... lcd_character( '0' ); 036C: MOVLW 30 036D: BSF 03,5 036E: MOVWF 53 036F: BCF 03,5 0370: CALL 093 .................... lcd_character( '0' + value1 ); 0371: MOVLW 30 0372: ADDWF 28,W 0373: MOVWF 4F 0374: BSF 03,5 0375: MOVWF 53 0376: BCF 03,5 0377: CALL 093 .................... lcd_character( '0' + value2 ); 0378: MOVLW 30 0379: ADDWF 29,W 037A: MOVWF 4F 037B: BSF 03,5 037C: MOVWF 53 037D: BCF 03,5 037E: CALL 093 .................... .................... /* Get the Month and display */ .................... value1 = clock_get_value( 1 ); 037F: MOVLW 01 0380: BSF 03,5 0381: MOVWF 48 0382: BCF 03,5 0383: CALL 1BF 0384: MOVF 21,W 0385: MOVWF 28 .................... value2 = clock_get_value( 4 ); 0386: MOVLW 04 0387: BSF 03,5 0388: MOVWF 48 0389: BCF 03,5 038A: CALL 1BF 038B: MOVF 21,W 038C: MOVWF 29 .................... lcd_command( LCD_DD_ADD_L1 + 7 ); 038D: MOVLW 87 038E: BSF 03,5 038F: MOVWF 4F 0390: BCF 03,5 0391: CALL 019 .................... value1 = 10 * value1 + value2; * 01F3: CLRF 20 01F4: CLRF 21 01F5: BSF 03,5 01F6: MOVF 48,W 01F7: BCF 03,0 01F8: BTFSS 49,0 01F9: GOTO 1FD 01FA: BCF 03,5 01FB: ADDWF 20,F 01FC: BSF 03,5 01FD: BCF 03,5 01FE: RRF 20,F 01FF: RRF 21,F 0200: BSF 03,5 0201: BTFSS 49,1 0202: GOTO 206 0203: BCF 03,5 0204: ADDWF 20,F 0205: BSF 03,5 0206: BCF 03,5 0207: RRF 20,F 0208: RRF 21,F 0209: BSF 03,5 020A: BTFSS 49,2 020B: GOTO 20F 020C: BCF 03,5 020D: ADDWF 20,F 020E: BSF 03,5 020F: BCF 03,5 0210: RRF 20,F 0211: RRF 21,F 0212: BSF 03,5 0213: BTFSS 49,3 0214: GOTO 218 0215: BCF 03,5 0216: ADDWF 20,F 0217: BSF 03,5 0218: BCF 03,5 0219: RRF 20,F 021A: RRF 21,F 021B: BSF 03,5 021C: BTFSS 49,4 021D: GOTO 221 021E: BCF 03,5 021F: ADDWF 20,F 0220: BSF 03,5 0221: BCF 03,5 0222: RRF 20,F 0223: RRF 21,F 0224: BSF 03,5 0225: BTFSS 49,5 0226: GOTO 22A 0227: BCF 03,5 0228: ADDWF 20,F 0229: BSF 03,5 022A: BCF 03,5 022B: RRF 20,F 022C: RRF 21,F 022D: BSF 03,5 022E: BTFSS 49,6 022F: GOTO 233 0230: BCF 03,5 0231: ADDWF 20,F 0232: BSF 03,5 0233: BCF 03,5 0234: RRF 20,F 0235: RRF 21,F 0236: BSF 03,5 0237: BTFSS 49,7 0238: GOTO 23C 0239: BCF 03,5 023A: ADDWF 20,F 023B: BSF 03,5 023C: BCF 03,5 023D: RRF 20,F 023E: RRF 21,F 023F: RETLW 00 * 0392: MOVLW 0A 0393: BSF 03,5 0394: MOVWF 48 0395: BCF 03,5 0396: MOVF 28,W 0397: BSF 03,5 0398: MOVWF 49 0399: BCF 03,5 039A: CALL 1F3 039B: MOVF 29,W 039C: ADDWF 21,W 039D: MOVWF 28 .................... for( i = 0; i < 3; i++ ) 039E: CLRF 27 039F: MOVF 27,W 03A0: SUBLW 02 03A1: BTFSS 03,0 03A2: GOTO 3B8 .................... lcd_character( month[ 3 * value1 + i ] ); 03A3: MOVLW 03 03A4: BSF 03,5 03A5: MOVWF 48 03A6: BCF 03,5 03A7: MOVF 28,W 03A8: BSF 03,5 03A9: MOVWF 49 03AA: BCF 03,5 03AB: CALL 1F3 03AC: MOVF 27,W 03AD: ADDWF 21,W 03AE: ADDLW A0 03AF: MOVWF 04 03B0: MOVF 00,W 03B1: MOVWF 51 03B2: BSF 03,5 03B3: MOVWF 53 03B4: BCF 03,5 03B5: CALL 093 03B6: INCF 27,F 03B7: GOTO 39F .................... .................... /* Get the Date and display */ .................... value1 = clock_get_value( 2 ); 03B8: MOVLW 02 03B9: BSF 03,5 03BA: MOVWF 48 03BB: BCF 03,5 03BC: CALL 1BF 03BD: MOVF 21,W 03BE: MOVWF 28 .................... value2 = clock_get_value( 4 ); 03BF: MOVLW 04 03C0: BSF 03,5 03C1: MOVWF 48 03C2: BCF 03,5 03C3: CALL 1BF 03C4: MOVF 21,W 03C5: MOVWF 29 .................... lcd_command( LCD_DD_ADD_L1 + 4 ); 03C6: MOVLW 84 03C7: BSF 03,5 03C8: MOVWF 4F 03C9: BCF 03,5 03CA: CALL 019 .................... lcd_character( '0' + value1); 03CB: MOVLW 30 03CC: ADDWF 28,W 03CD: MOVWF 4F 03CE: BSF 03,5 03CF: MOVWF 53 03D0: BCF 03,5 03D1: CALL 093 .................... lcd_character( '0' + value2); 03D2: MOVLW 30 03D3: ADDWF 29,W 03D4: MOVWF 4F 03D5: BSF 03,5 03D6: MOVWF 53 03D7: BCF 03,5 03D8: CALL 093 .................... .................... /* Get the Day and display */ .................... value1 = clock_get_value( 3 ); 03D9: MOVLW 03 03DA: BSF 03,5 03DB: MOVWF 48 03DC: BCF 03,5 03DD: CALL 1BF 03DE: MOVF 21,W 03DF: MOVWF 28 .................... lcd_command( LCD_DD_ADD_L1 + 0 ); 03E0: MOVLW 80 03E1: BSF 03,5 03E2: MOVWF 4F 03E3: BCF 03,5 03E4: CALL 019 .................... for( i = 0; i < 3; i++ ) 03E5: CLRF 27 03E6: MOVF 27,W 03E7: SUBLW 02 03E8: BTFSS 03,0 03E9: GOTO 3FF .................... lcd_character( day[ 3 * value1 + i ] ); 03EA: MOVLW 03 03EB: BSF 03,5 03EC: MOVWF 48 03ED: BCF 03,5 03EE: MOVF 28,W 03EF: BSF 03,5 03F0: MOVWF 49 03F1: BCF 03,5 03F2: CALL 1F3 03F3: MOVF 27,W 03F4: ADDWF 21,W 03F5: ADDLW 39 03F6: MOVWF 04 03F7: MOVF 00,W 03F8: MOVWF 51 03F9: BSF 03,5 03FA: MOVWF 53 03FB: BCF 03,5 03FC: CALL 093 03FD: INCF 27,F 03FE: GOTO 3E6 .................... .................... /* Get the Hour and display */ .................... value1 = clock_get_value( 2 ); 03FF: MOVLW 02 0400: BSF 03,5 0401: MOVWF 48 0402: BCF 03,5 0403: CALL 1BF 0404: MOVF 21,W 0405: MOVWF 28 .................... value2 = clock_get_value( 4 ); 0406: MOVLW 04 0407: BSF 03,5 0408: MOVWF 48 0409: BCF 03,5 040A: CALL 1BF 040B: MOVF 21,W 040C: MOVWF 29 .................... lcd_command( LCD_DD_ADD_L2 + 1 ); 040D: MOVLW C1 040E: BSF 03,5 040F: MOVWF 4F 0410: BCF 03,5 0411: CALL 019 .................... lcd_character( '0' + value1 ); 0412: MOVLW 30 0413: ADDWF 28,W 0414: MOVWF 4F 0415: BSF 03,5 0416: MOVWF 53 0417: BCF 03,5 0418: CALL 093 .................... lcd_character( '0' + value2 ); 0419: MOVLW 30 041A: ADDWF 29,W 041B: MOVWF 4F 041C: BSF 03,5 041D: MOVWF 53 041E: BCF 03,5 041F: CALL 093 .................... lcd_character( ':' ); 0420: MOVLW 3A 0421: BSF 03,5 0422: MOVWF 53 0423: BCF 03,5 0424: CALL 093 .................... .................... /* Get the Minutes but wait for zero seconds */ .................... value1 = clock_get_value( 3 ); 0425: MOVLW 03 0426: BSF 03,5 0427: MOVWF 48 0428: BCF 03,5 0429: CALL 1BF 042A: MOVF 21,W 042B: MOVWF 28 .................... value2 = clock_get_value( 4 ); 042C: MOVLW 04 042D: BSF 03,5 042E: MOVWF 48 042F: BCF 03,5 0430: CALL 1BF 0431: MOVF 21,W 0432: MOVWF 29 .................... .................... /* Wait for the start pulse from the clock */ .................... while( clock_get_pulse() != PT_START ); 0433: CALL 0C0 0434: MOVF 21,W 0435: SUBLW 04 0436: BTFSC 03,2 0437: GOTO 439 0438: GOTO 433 .................... seconds = 0; 0439: CLRF 26 .................... .................... /* Display the minutes */ .................... lcd_command( LCD_DD_ADD_L2 + 4 ); 043A: MOVLW C4 043B: BSF 03,5 043C: MOVWF 4F 043D: BCF 03,5 043E: CALL 019 .................... lcd_character( '0' + value1 ); 043F: MOVLW 30 0440: ADDWF 28,W 0441: MOVWF 4F 0442: BSF 03,5 0443: MOVWF 53 0444: BCF 03,5 0445: CALL 093 .................... lcd_character( '0' + value2 ); 0446: MOVLW 30 0447: ADDWF 29,W 0448: MOVWF 4F 0449: BSF 03,5 044A: MOVWF 53 044B: BCF 03,5 044C: CALL 093 .................... } 044D: GOTO 31F .................... } 044E: SLEEP