Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

ds1820 in pic16f877a code problem,...

Status
Not open for further replies.

tart

New Member
View attachment 67574// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

const unsigned short TEMP_RESOLUTION = 9;
char *text = "000.0000";
unsigned temp;

void Display_Temperature(unsigned int temp2write) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;


if (temp2write & 0x8000) {
text[0] = '-';
temp2write = ~temp2write + 1;
Lcd_Chr(2,4,'-');
}

temp_whole = temp2write >> RES_SHIFT ;


if (temp_whole/100)
text[0] = temp_whole/100 + 48;
else
text[0] = '0';

text[1] = (temp_whole/10)%10 + 48;
text[2] = temp_whole%10 + 48;

temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;


text[4] = temp_fraction/1000 + 48;
text[5] = (temp_fraction/100)%10 + 48;
text[6] = (temp_fraction/10)%10 + 48;
text[7] = temp_fraction%10 + 48;


Lcd_Out(2, 5, text);
}

void main() {
ADCON1=7;
PORTE=0;
TRISE=0;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn the cursor off
Lcd_Out(1, 1, " Temperature: ");

// Print degree character, 'C' for Centigrades
Lcd_Chr(2,13,223); // different LCD displays have different char code for degree
// if you see greek alpha letter try typing 178 instead of 223

Lcd_Chr(2,14,'C');



do {

Ow_Reset(&PORTE, 2 );
Ow_Write(&PORTE, 2, 0xCC);
Ow_Write(&PORTE, 2, 0x44);
Delay_us(120);
Ow_Reset(&PORTE, 2);
Ow_Write(&PORTE, 2, 0xCC);
Ow_Write(&PORTE, 2, 0xBE);
temp = Ow_Read(&PORTE, 2);
temp = (Ow_Read(&PORTE, 2) << 8) + temp;


Display_Temperature(temp);
Delay_ms(500);
} while (1);
}
 
Last edited:
my problem is that everytime i adjust the sensor, the output in the LCD adjust by 8,... what should i do with my code,.. please help me,.. thank you,...
 
The conversion can take up to 750mS and you're only waiting 120uS.

Mike.
 
You asked in chat what the following piece of code does:

Code:
if (temp2write & 0x8000) {
    text[0] = '-';
    temp2write = ~temp2write + 1;
}

That is simply testing whether the number is negative by looking at the most significant bit, then removing the 2s complement to get back the number. You can read more at: https://en.wikipedia.org/wiki/Two's_complement

If you need help with your project you will need to be more specific about what your problems are.
 
Last edited:
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top