Bueno y aqui otra mas que me encontre no se donde.....jeje tampoco esta provada pero le metere mano a la anterior y a esta haber si funcionan:
// Define DS1620 interface pins
#define DQ PIN_B2 // Wire rb2 to pin #1 on DS1620
#define CLKD PIN_B3 // Wire rb3 to pin #2 on DS1620
#define RST PIN_B4 // Wire rb4 to pin #3 on DS1620
// DS1620 & temp related function prototypes
void write_1620(byte cmd); // write to DS1620
void init_1620(void); // initialize DS1620
void read_temp(void); // read temp from DS1620
void convert(void); // convert C to F then to BCD for display
void ouch(void); // display OUCH when >= high temp setpoint
char toBCD(char bin_val); // conversion to BCD
// write a byte to the DS1620
void write_1620(byte cmd)
{
byte i;
for(i=0; i<8; i++)
{
output_low(CLKD);
output_bit(DQ, shift_right(&cmd,1,0));
output_high(CLKD);
}
}
// initialize the DS1620
void init_1620(void)
{
// set CLK and RST to correct states
output_high(CLKD);
delay_us(2);
output_low(RST);
// set DS1620 config to continuous convert
// and CPU communications mode
output_high(RST);
write_1620(0x0C); // send Write Config command
write_1620(0x02); // configure for CPU mode, continuous convert
output_low(RST);
// start conversion
output_high(RST);
write_1620(0xEE); // send Start Convert command
output_low(RST);
}
// read & display temperature from DS1620.
void read_temp(void)
{
byte i;
output_high(RST);
write_1620(0xAA); // send Read Temp command
temp_data = 0; // clear temp_data on entry
for(i=0; i<9; i++) // loop for 9-bits
{
output_low(CLKD);
temp_data = temp_data >> 1;
if (input(DQ))
{
temp_data = temp_data | 0x100;
}
output_high(CLKD);
}
temp_data = temp_data/2; // convert temp_data to whole deg C
output_low(RST);
convert(); // convert C to F then to BCD
if (temp_r >= setpoint) // if temp >= setpoint display OUCH
{
ouch(); // call OUCH function if temp >= high setpt
return; // do not update temp display when temp >= setpt
}
enable(); // enable SLED4C data entry
send_byte(0b11001011); // digits 5,4,2 HEX decode. Digits 3,1 special
disable(); // write config value into config register
delay_ms(1); // short pause between config & display reg write
enable(); // enable SLED4C data entry
send_nib(0x00); // DIM display + DP"s off
send_byte(temp_r); // display temp on digits 5/4
send_byte(0xFF); // display Deg F on digits 3/2
send_nib(0x00); // turn colon off
disable(); // write data into display registers
delay_ms(2000); // wait 2 seonds between temp & time updates
}
// convert temp from deg C to deg F, then pass
// to BCD conversion conversion function
void convert(void)
{
temp_data = (temp_data * 9/5)+32; // convert C to F
temp_r = toBCD(temp_data); // convert to BCD for display
}
// this function converts an 8 bit binary value
// to an 8 bit BCD value. Input range from 0 to 99.
char toBCD(char bin_val)
{
char temp;
char retval;
temp = bin_val;
retval = 0;
while(1)
{
// get tens digit by multiple subtraction
// of 10 from bin_val
if(temp >= 10)
{
temp -= 10;
retval += 0x10; // increment tens digit
}
else // get ones digit by adding remainder
{
retval += temp; // adjusted result
break;
}
}
return(retval);
}
// say the temperature
void say_temp(void)
{
printf("say=the temperature iz %Ld degrees faren hyte;",temp_data);
delay_ms(2000); // allow time for message to play
} // adjust as required for message length