#ifndef __DS18B20_H__
#define __DS18B20_H__

/* ROM COMMANDS */
#define DS_SEARCH_ROM	0xF0
#define DS_READ_ROM		0x33
#define DS_MATCH_ROM	0x55
#define DS_SKIP_ROM		0xCC
#define DS_ALARM_SEARCH	0xEC

/* FUNCTION COMMANDS */
#define DS_CONVERT_T			0x44
#define DS_WRITE_SCRATCHPAD		0x4E
#define DS_READ_SCRATCHPAD		0xBE
#define DS_COPY_SCRATCHPAD		0x48
#define DS_RECALL_E2			0xB8
#define DS_READ_POWER_SUPPLY	0xB4

// DQ
// DQ_DIR

bit pd = 0;

void OW_HIZ()
{
	DQ_DIR = 1;
}

void OW_LO()
{
	DQ = 0;
	DQ_DIR = 0;
}

void OW_RESET()
{
	OW_HIZ();
	pd = 0;
	OW_LO();
	__delay_us(500);
	OW_HIZ();
	__delay_us(70);
	if(DQ == 0)
		pd = 1;
	__delay_us(430);
}

void DSTXBYTE(char byte)
{
	char count;
	for(count = 0; count < 8; count++)
	{
		OW_LO();
		__delay_us(3);
		DQ = (byte >> count) & 1;
		__delay_us(60);
		OW_HIZ();
		__delay_us(2);
	}
}

char DSRXBYTE(void)
{
	char count, byte=0, temp;
	for(count = 0; count < 8; count++)
	{
		OW_LO();
		__delay_us(6);
		OW_HIZ();
		__delay_us(4);
		temp = DQ;
		__delay_us(50);
		
		byte >>= 1;
		if(temp)
			byte |= 0x80;
	}
	
	return byte;
}

#endif /* __DS18B20_H__ */