342
// Function prototypes void lcd_initialize(void); void lcd_data(unsigned char data); void lcd_string(const char *str, unsigned char len); void lcd_command(unsigned char cmd); void write_data(unsigned char data); unsigned int read_data(void); void start_transfer(void); void end_transfer(void); void ds1620_init(void); signed int read_temperature(void); // DS1620 Functions void write_data(unsigned char data) { unsigned char i; DQ_TRIS = 0; // Set DQ as output for(i = 0; i < 8; i++) { CLK = 0; DQ = (data >> i) & 0x01; // LSB first CLK = 1; __delay_us(1); } } unsigned int read_data(void) { unsigned char i; unsigned int data = 0; DQ_TRIS = 1; // Set DQ as input for(i = 0; i < 9; i++) { // Read 9 bits for temperature CLK = 0; __delay_us(1); data |= ((unsigned int)(DQ) << i); // LSB first CLK = 1; __delay_us(1); } DQ_TRIS = 0; // Set back to output return data; } void start_transfer(void) { CLK = 0; RST = 1; __delay_us(1); } void end_transfer(void) { RST = 0; __delay_us(1); } void ds1620_init(void) { // Configure DS1620 start_transfer(); write_data(WRITE_CONFIG); write_data(0x02); // CPU mode, continuous conversion end_transfer(); __delay_ms(50); // Allow time for writing to config register // Start continuous conversion start_transfer(); write_data(START_CONVERT); end_transfer(); __delay_ms(750); // Maximum conversion time } signed int read_temperature(void) { unsigned int raw_temp; start_transfer(); write_data(READ_TEMP); raw_temp = read_data(); end_transfer(); // Check if the 9th bit is set for two's complement if (raw_temp & 0x100) { // 0x100 is 9th bit in 9-bit number raw_temp |= ~0x1FF; // Sign-extend for two's complement } return raw_temp; // Now return the correct signed value }