📄 tstrs485.lst
字号:
.................... // XOR in the Message Data into the extracted bits
.................... t = t ^ val;
02A8: MOVF 39,W
02A9: XORWF 3A,F
....................
.................... // Shift the CRC Register left 4 bits
.................... cCalcCrcHigh = (cCalcCrcHigh << 4) | (cCalcCrcLow >> 4);
02AA: BCF 03,5
02AB: SWAPF 79,W
02AC: BSF 03,5
02AD: MOVWF 3B
02AE: MOVLW F0
02AF: ANDWF 3B,F
02B0: BCF 03,5
02B1: SWAPF 7A,W
02B2: MOVWF 20
02B3: MOVLW 0F
02B4: ANDWF 20,F
02B5: MOVF 20,W
02B6: BSF 03,5
02B7: IORWF 3B,W
02B8: BCF 03,5
02B9: MOVWF 79
.................... cCalcCrcLow = cCalcCrcLow << 4;
02BA: SWAPF 7A,F
02BB: MOVLW F0
02BC: ANDWF 7A,F
....................
.................... // Do the table lookups and XOR the result into the CRC Tables
.................... cCalcCrcHigh = cCalcCrcHigh ^ CRC16_LookupHigh[t];
02BD: BSF 03,5
02BE: MOVF 3A,W
02BF: BCF 03,5
02C0: CALL 071
02C1: MOVWF 21
02C2: XORWF 79,F
.................... cCalcCrcLow = cCalcCrcLow ^ CRC16_LookupLow[t];
02C3: BSF 03,5
02C4: MOVF 3A,W
02C5: BCF 03,5
02C6: CALL 085
02C7: MOVWF 21
02C8: XORWF 7A,F
02C9: RETLW 00
.................... }
....................
.................... /*
.................... * Process one Message Byte to update the current CRC Value
.................... */
.................... void Rs485UpdateCrc( char cVal )
.................... {
.................... CRC16_Update4Bits( cVal >> 4 ); // High nibble first
02CA: BSF 03,5
02CB: SWAPF 37,W
02CC: MOVWF 38
02CD: MOVLW 0F
02CE: ANDWF 38,F
02CF: MOVF 38,W
02D0: MOVWF 39
02D1: BCF 03,5
02D2: CALL 2A3
.................... CRC16_Update4Bits( cVal & 0x0F ); // Low nibble
02D3: BSF 03,5
02D4: MOVF 37,W
02D5: ANDLW 0F
02D6: MOVWF 38
02D7: MOVWF 39
02D8: BCF 03,5
02D9: CALL 2A3
02DA: RETLW 00
.................... }
....................
.................... //****************************************************************************
.................... // void Rs485SendChar( char c )
.................... //
.................... // Driver level of RS485 protocol
.................... // Output character on RS485 driver
.................... // // Include line turn around time
.................... //****************************************************************************
.................... void Rs485SendChar( char c )
.................... {
.................... TXREG = c; // Load data to send
*
0294: BSF 03,5
0295: MOVF 37,W
0296: BCF 03,5
0297: MOVWF 19
.................... while ( !( TXSTA & TRMT_MASK )); // Wait for TX Empty
0298: BSF 03,5
0299: MOVF 18,W
029A: ANDLW 02
029B: XORLW 00
029C: BTFSS 03,2
029D: GOTO 2A0
029E: BCF 03,5
029F: GOTO 298
02A0: BCF 03,5
02A1: GOTO 2A2
02A2: RETLW 00
.................... }
....................
....................
.................... //****************************************************************************
.................... // char PostValidatePacket(void)
.................... //
.................... // Verify the CRC on the last packet received
.................... //
.................... // Check if the CRC is correct
.................... // and return the updated state as the result
.................... //
.................... //****************************************************************************
.................... char PostValidatePacket(void)
.................... {
.................... char c, d;
....................
.................... CRC16_Init();
.................... Rs485UpdateCrc(PKT_START);
*
03C5: MOVLW 02
03C6: BSF 03,5
03C7: MOVWF 37
03C8: BCF 03,5
03C9: CALL 2CA
.................... Rs485UpdateCrc(cNetAddrHigh);
03CA: MOVF 33,W
03CB: BSF 03,5
03CC: MOVWF 37
03CD: BCF 03,5
03CE: CALL 2CA
.................... Rs485UpdateCrc(cNetAddrLow);
03CF: MOVF 34,W
03D0: BSF 03,5
03D1: MOVWF 37
03D2: BCF 03,5
03D3: CALL 2CA
.................... Rs485UpdateCrc(cLenExpected);
03D4: MOVF 35,W
03D5: BSF 03,5
03D6: MOVWF 37
03D7: BCF 03,5
03D8: CALL 2CA
.................... Rs485UpdateCrc(cCommand);
03D9: MOVF 36,W
03DA: BSF 03,5
03DB: MOVWF 37
03DC: BCF 03,5
03DD: CALL 2CA
....................
.................... if ( PacketHasPayload() ) // If the packet has a payload,
03DE: CALL 106
03DF: MOVF 21,F
03E0: BTFSC 03,2
03E1: GOTO 3FA
.................... { // then include the data in the CRC.
.................... for ( c = 0; c < cLenExpected; c++ )
03E2: BSF 03,5
03E3: CLRF 34
03E4: BCF 03,5
03E5: MOVF 35,W
03E6: BSF 03,5
03E7: SUBWF 34,W
03E8: BTFSS 03,0
03E9: GOTO 3EC
03EA: BCF 03,5
03EB: GOTO 3FA
03EC: BCF 03,5
.................... {
.................... d = c485Buf[c];
03ED: MOVLW 37
03EE: BSF 03,5
03EF: ADDWF 34,W
03F0: MOVWF 04
03F1: MOVF 00,W
03F2: MOVWF 35
.................... Rs485UpdateCrc( d );
03F3: MOVWF 37
03F4: BCF 03,5
03F5: CALL 2CA
.................... }
03F6: BSF 03,5
03F7: INCF 34,F
03F8: BCF 03,5
03F9: GOTO 3E5
.................... }
.................... // Check if the CRC is correct
.................... // and return the updated state as the result
.................... if ( (cRxCrcHigh == cCalcCrcHigh)&&(cRxCrcLow == cCalcCrcLow) )
03FA: MOVF 79,W
03FB: SUBWF 77,W
03FC: BTFSS 03,2
03FD: GOTO 406
03FE: GOTO 3FF
03FF: MOVF 7A,W
0400: SUBWF 78,W
0401: BTFSS 03,2
0402: GOTO 406
.................... {
.................... cRS485State = PKT_VALID;
0403: MOVLW 09
0404: MOVWF 31
.................... }
.................... else
0405: GOTO 438
.................... {
.................... cError = BAD_CRC;
0406: MOVLW 02
0407: MOVWF 7C
.................... cRS485State = PKT_INVALID;
0408: MOVLW FF
0409: MOVWF 31
.................... ClearLine2();
040A: CALL 27D
.................... BinToHexAscii(cRxCrcHigh );
040B: MOVF 77,W
040C: BSF 03,5
040D: MOVWF 36
040E: BCF 03,5
040F: CALL 379
.................... BinToHexAscii(cRxCrcLow );
0410: MOVF 78,W
0411: BSF 03,5
0412: MOVWF 36
0413: BCF 03,5
0414: CALL 379
.................... LcdWrite(' ');
0415: MOVLW 20
0416: BSF 03,5
0417: MOVWF 3A
0418: BCF 03,5
0419: CALL 1C9
.................... BinToHexAscii(cCalcCrcHigh);
041A: MOVF 79,W
041B: BSF 03,5
041C: MOVWF 36
041D: BCF 03,5
041E: CALL 379
.................... BinToHexAscii(cCalcCrcHigh);
041F: MOVF 79,W
0420: BSF 03,5
0421: MOVWF 36
0422: BCF 03,5
0423: CALL 379
.................... delay_ms(255);
0424: MOVLW FF
0425: BSF 03,5
0426: MOVWF 3C
0427: BCF 03,5
0428: CALL 1A0
.................... delay_ms(255);
0429: MOVLW FF
042A: BSF 03,5
042B: MOVWF 3C
042C: BCF 03,5
042D: CALL 1A0
.................... delay_ms(255);
042E: MOVLW FF
042F: BSF 03,5
0430: MOVWF 3C
0431: BCF 03,5
0432: CALL 1A0
.................... delay_ms(255);
0433: MOVLW FF
0434: BSF 03,5
0435: MOVWF 3C
0436: BCF 03,5
0437: CALL 1A0
.................... }
....................
.................... return cRS485State;
0438: MOVF 31,W
0439: MOVWF 21
.................... }
....................
.................... //****************************************************************************
.................... // char GetPacketCmdType(void)
.................... //
.................... // Check packet command type
.................... // Return TRUE if packet has a data payload.
.................... //
.................... //****************************************************************************
.................... char PacketHasPayload(void)
.................... {
.................... if ( cCommand == SENSOR_GET_DATA ) return TRUE;
*
0106: MOVF 36,W
0107: SUBLW A4
0108: BTFSS 03,2
0109: GOTO 10E
010A: MOVLW 01
010B: MOVWF 21
010C: GOTO 111
.................... else return FALSE;
010D: GOTO 111
010E: MOVLW 00
010F: MOVWF 21
0110: GOTO 111
0111: RETLW 00
.................... }
....................
.................... //****************************************************************************
.................... // void BinToHexAscii( char c )
.................... //
.................... // Contributed by: Nick De Smith
.................... //
.................... //****************************************************************************
.................... void BinToHexAscii( char c )
.................... {
.................... const char hexMap[17] = "0123456789ABCDEF";
*
0099: BCF 0A,0
009A: BCF 0A,1
009B: BCF 0A,2
009C: ADDWF 02,F
009D: RETLW 30
009E: RETLW 31
009F: RETLW 32
00A0: RETLW 33
00A1: RETLW 34
00A2: RETLW 35
00A3: RETLW 36
00A4: RETLW 37
00A5: RETLW 38
00A6: RETLW 39
00A7: RETLW 41
00A8: RETLW 42
00A9: RETLW 43
00AA: RETLW 44
00AB: RETLW 45
00AC: RETLW 46
00AD: RETLW 00
....................
.................... LcdWrite( hexMap[(c >> 4) & 0xF] );
*
0379: BSF 03,5
037A: SWAPF 36,W
037B: BCF 03,5
037C: MOVWF 20
037D: MOVLW 0F
037E: ANDWF 20,F
037F: MOVF 20,W
0380: ANDLW 0F
0381: CALL 099
0382: BSF 03,5
0383: MOVWF 39
0384: MOVWF 3A
0385: BCF 03,5
0386: CALL 1C9
.................... LcdWrite( hexMap[(c & 0xF)] );
0387: BSF 03,5
0388: MOVF 36,W
0389: ANDLW 0F
038A: BCF 03,5
038B: CALL 099
038C: BSF 03,5
038D: MOVWF 38
038E: MOVWF 3A
038F: BCF 03,5
0390: CALL 1C9
0391: RETLW 00
.................... }
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
.................... //#include <lcd2.c> // LCD routine
.................... #include <lcd873b.c> // Keypad example LCD routine
.................... /***************************************************************************/
.................... /* Lcd.c LCD interface routines */
.................... /* Version : 2.1. for PIC16F87x */
.................... /* */
.................... /* J. Winpenny 1/8/2000 */
.................... /* */
.................... /* */
.................... /* Mode : HD44780 type LCD displays */
.................... /* */
.................... /* */
.................... /* Notes : Updated version */
.................... /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -