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