#define WirePin LATCbits.LATC4 #define WireDir TRISCbits.TRISC4 // "DQ_TRIS = 0;" This must included in the main program void prvWireInit( void ){ WireDir = 1; WirePin = 1; } void prvWireReset( void ){ WireDir = 0; WirePin = 0; DelayUs( 550 ); WirePin = 1; WireDir = 1; // Set DS18B20 pin as input DelayUs( 70 ); } int prvWirePresence( void ){ int i; int Bit = 0; WireDir = 1; // Set DS18B20 pin as input for( i=480; i>0; i-- ) { DelayUs( 1 ); if ( WirePin == 0 ) Bit = 1; } return Bit; } void prvWireSendBit( unsigned char Bit ){ WireDir = 0; WirePin = 0; // Set DS18B20 pin as output DelayUs( 2 ); // Trec - Release time WirePin = Bit; DelayUs( 60 ); // Tslot - Time slot WireDir= 1; // Set DS18B20 pin as input DelayUs( 2 ); // Trec - Release time } char prvWireGetBit( void ){ char Bit; WireDir = 0; // Set DS18B20 pin as output WirePin = 0; // Trec - Release time DelayUs( 2 ); WireDir = 1; // Set DS18B20 pin as input DelayUs( 20 ); // Read data valid Bit = WirePin; DelayUs( 100 ); return Bit; } void prvWireWriteByte( unsigned char Byte ){ int i; for ( i=0; i<8; i++ ) { prvWireSendBit( Byte & 0x01 ); Byte = Byte >> 1; } } char prvWireReadByte(void){ int i; char Byte; Byte = 0; for( i=0; i<8; i++ ) Byte = Byte | ( ( 1&prvWireGetBit( ) ) << i ); // Logic AND - Bits shifted left "i" positions - Logic OR return Byte; }