Digital Thermometer Using PIC16F688

Digital ThermometerThis Digital Thermometer is designed to the temperature of the room and it will display its equivalent value on a LCD screen in both Fahrenheit and Celsius scales. PIC16F688 microchip is used as the main controller in this electronics project. In this Digital Thermometer PIC16F688 microchip reads the temperature value from a DS1820which is a 3-pin digital temperature sensor (from Maxim Semiconductors). This DS1820 digital temperature sensor is designed for measuring the temperature measuring from -55 to 125 °C in 0.5°C increment. Our room temperature never goes that much far but the firmware designed for this PIC is able to measure and displays the entire temperature range from DS1820.We have tested this project on different room temperature. We also tested this electronics project from -4.5°C (in our freezer) and also we tested the temperature of our soldering iron of about 105.5 °C.

If you also want to test this electronics project then don’t keep whole components in the freeze, LCD may not work properly at freeze temperature so just keep the temperature sensor inside the freeze and then connect with three wires in the project.
Circuit Diagram and Working Function

In this electronics project PIC16F688 reads the value from RA5 port of DS1820 and then the computed readings is sent to the LCD through RC0, RC1, RC2, RC3 ports. This means that LCD gets data from PIC in 4-bit order mode. The RS (Register Select) signals are provided through ports RC4 to the LCD and similarly, E (Enable) signals for LCD are transferred through RC5 ports. The Read/Write ports are grounded since there is no necessary to read data from LCD in this electronics projects. And contrast is maintained in LCD through the 10K potentiometer as shown in the Circuit below.

There are two switches for the user inputs. The first one is for the reset of whole system and reinitialize the LCD and the second one is for the LCD light mode. LCD back light turns OFF or ON.Digital Thermometer

Circuit Diagram For Digita Thermometer

Circuit Diagram For Digita Thermometer

Source Code:

The coding was done in micro C Compiler with the inbuilt library files of DS1820.

Digital Room Thermometer using PIC16F688
April 05, 2012
// LCD module connections
sbit LCD_RS at RC4_bit;
sbit LCD_EN at RC5_bit;
sbit LCD_D4 at RC0_bit;
sbit LCD_D5 at RC1_bit;
sbit LCD_D6 at RC2_bit;
sbit LCD_D7 at RC3_bit;
sbit LCD_RS_Direction at TRISC4_bit;
sbit LCD_EN_Direction at TRISC5_bit;
sbit LCD_D4_Direction at TRISC0_bit;
sbit LCD_D5_Direction at TRISC1_bit;
sbit LCD_D6_Direction at TRISC2_bit;
sbit LCD_D7_Direction at TRISC3_bit;
// End LCD module connections

// Back Light Switch connected to RA1
sbit BackLight at RA1_bit;
// Define Messages
char message0[] = “LCD Initialized”;
char message1[] = “Room Temperature”;

// String array to store temperature value to display
char *tempC = “000.0”;
char *tempF = “000.0”;

// Variables to store temperature register values
unsigned int temp_whole, temp_fraction, temp_value;
signed int tempinF, tempinC;
unsigned short C_Neg=0, F_Neg=0, TempH, TempL;

void Display_Temperature() {
// convert Temp to characters
if (!C_Neg) {
if (tempinC/1000)
// 48 is the decimal character code value for displaying 0 on LCD
tempC[0] = tempinC/1000 + 48;
else tempC[0] = ‘ ‘;
tempC[1] = (tempinC/100)%10 + 48; // Extract tens digit
tempC[2] = (tempinC/10)%10 + 48; // Extract ones digit

// convert temp_fraction to characters
tempC[4] = tempinC%10 + 48; // Extract tens digit

// print temperature on LCD
Lcd_Out(2, 1, tempC);

if (!F_Neg) {
if (tempinF/1000)
tempF[0] = tempinF/1000 + 48;
else tempF[0] = ‘ ‘;

tempF[1] = (tempinF/100)%10 + 48; // Extract tens digit
tempF[2] = (tempinF/10)%10 + 48;
tempF[4] = tempinF%10 + 48;
// print temperature on LCD
Lcd_Out(2, 10, tempF);

// ISR for LCD Backlight
void interrupt(void){
if (INTCON.INTF == 1) // Check if INTF flag is set
BackLight =~BackLight; // Toggle Backlight
Delay_ms(300) ;
INTCON.INTF = 0; // Clear interrupt flag before exiting ISR

void main() {
TRISC = 0x00 ;
TRISA = 0b00001100; // RA2, RA3 Inputs, Rest O/P’s
ANSEL = 0b00000000;
PORTA = 0b00000000; // Start with Everything Low
PORTC = 0b00000000; // Start with Everything Low
CMCON0 = 0b00000111;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // CLEAR display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
BackLight = 1;
Lcd_Out(1,1,message1); // Write message1 in 1st row
// Print degree character
// different LCD displays have different char code for degree
// if you see greek alpha letter try typing 178 instead of 223


// Interrupt Setup
OPTION_REG = 0x00; // Clear INTEDG, External Interrupt on falling edge
INTCON.INTF = 0; // Clear interrupt flag prior to enable
INTCON.INTE = 1; // enable INT interrupt
INTCON.GIE = 1; // enable Global interrupts

do {
//— perform temperature reading
Ow_Reset(&PORTA, 5); // Onewire reset signal
Ow_Write(&PORTA, 5, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 5, 0x44); // Issue command CONVERT_T
INTCON.GIE = 1; // 1-wire library disables interrpts
Ow_Reset(&PORTA, 5);
Ow_Write(&PORTA, 5, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 5, 0xBE); // Issue command READ_SCRATCHPAD

// Read Byte 0 from Scratchpad
TempL = Ow_Read(&PORTA, 5);
// Then read Byte 1 from Scratchpad
TempH = Ow_Read(&PORTA, 5);
temp_value = (TempH << 8)+ TempL ; // check if temperature is negative if (temp_value & 0x8000) { C_Neg = 1; tempC[0] = ‘-‘; // Negative temp values are stored in 2’s complement form temp_value = ~temp_value + 1; } else C_Neg = 0; // Get temp_whole by dividing by 2 temp_whole = temp_value >> 1 ;
if (temp_value & 0x0001){ // LSB is 0.5C
temp_fraction = 5;
else temp_fraction = 0;
tempinC = temp_whole*10+temp_fraction;

if(C_Neg) {
tempinF = 320-9*tempinC/5;
if (tempinF < 0) {
F_Neg = 1;
tempF[0] = ‘-‘;
tempinF = abs(tempinF);
else F_Neg = 0;
else tempinF = 9*tempinC/5 + 320;
//— Format and display result on Lcd

} while(1);


Freeze Temperature


Back Light ON


Back Light OFF

Add a comment

Comments (3)

  1. TechnologyApril 18, 2012 Reply
    there r many room thermometers but i think this was cool and more advance.
  2. michaelJune 5, 2012 Reply
    i like your work, though their is room for much improvement. i need your help because am constructing same kind but am using the ATMEGA8 as my micro controler, and i have a challenge with my negative value detection by the controler, pls can you help cos it urgent. thanks
    • michaelJune 5, 2012 Reply
      pls i need good response from any one

Add a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Connect with Me

GPO 8973 NPC 541; Kathmandu Nepal
Phone: +977 9851236800


September 2019
« Jun