#include <xc.h> #define _XTAL_FREQ 4000000 // PIC Configuration Bits #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF #pragma config CP = OFF // LCD Functions void lcd_cmd(unsigned char cmd); void lcd_data(unsigned char data); void lcd_init(); void lcd_print(char *str); void main() { // ADC and Ports setup ADCON1 = 0x80; // Configure AN0 as analog, rest digital TRISA = 0x01; // RA0 input (LM35) TRISB = 0x00; // PORTB output (LCD) lcd_init(); lcd_print("Temperature:"); while(1) { // Start ADC on AN0 ADCON0 = 0x41; // ADC on, channel 0 __delay_ms(2); GO_nDONE = 1; while(GO_nDONE); int adc = (ADRESH << 8) + ADRESL; float temp = adc * 0.488; // LM35 conversion // Display temperature on LCD lcd_cmd(0xC0); // Second line lcd_data((int)temp/10 + '0'); // Tens lcd_data((int)temp%10 + '0'); // Ones lcd_data(223); // Degree symbol lcd_data('C'); __delay_ms(500); } } // Implement LCD functions here (4-bit mode) void lcd_cmd(unsigned char cmd){ PORTB = (cmd & 0xF0); // Upper nibble RB1 = 1; RB0 = 0; __delay_ms(2); RB1 = 0; PORTB = (cmd << 4); // Lower nibble RB1 = 1; RB0 = 0; __delay_ms(2); RB1 = 0; } void lcd_data(unsigned char data){ PORTB = (data & 0xF0); // Upper nibble RB1 = 1; RB0 = 1; __delay_ms(2); RB1 = 0; PORTB = (data << 4); // Lower nibble RB1 = 1; RB0 = 1; __delay_ms(2); RB1 = 0; } void lcd_init(){ __delay_ms(20); lcd_cmd(0x02); // Initialize LCD lcd_cmd(0x28); // 4-bit, 2 lines lcd_cmd(0x0C); // Display ON lcd_cmd(0x06); // Entry mode } void lcd_print(char *str){ while(*str) lcd_data(*str++); }
Standard input is empty
#include <xc.h>
#define _XTAL_FREQ 4000000
// PIC Configuration Bits
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF
// LCD Functions
void lcd_cmd(unsigned char cmd);
void lcd_data(unsigned char data);
void lcd_init();
void lcd_print(char *str);
void main() {
// ADC and Ports setup
ADCON1 = 0x80; // Configure AN0 as analog, rest digital
TRISA = 0x01; // RA0 input (LM35)
TRISB = 0x00; // PORTB output (LCD)
lcd_init();
lcd_print("Temperature:");
while(1) {
// Start ADC on AN0
ADCON0 = 0x41; // ADC on, channel 0
__delay_ms(2);
GO_nDONE = 1;
while(GO_nDONE);
int adc = (ADRESH << 8) + ADRESL;
float temp = adc * 0.488; // LM35 conversion
// Display temperature on LCD
lcd_cmd(0xC0); // Second line
lcd_data((int)temp/10 + '0'); // Tens
lcd_data((int)temp%10 + '0'); // Ones
lcd_data(223); // Degree symbol
lcd_data('C');
__delay_ms(500);
}
}
// Implement LCD functions here (4-bit mode)
void lcd_cmd(unsigned char cmd){
PORTB = (cmd & 0xF0); // Upper nibble
RB1 = 1; RB0 = 0; __delay_ms(2); RB1 = 0;
PORTB = (cmd << 4); // Lower nibble
RB1 = 1; RB0 = 0; __delay_ms(2); RB1 = 0;
}
void lcd_data(unsigned char data){
PORTB = (data & 0xF0); // Upper nibble
RB1 = 1; RB0 = 1; __delay_ms(2); RB1 = 0;
PORTB = (data << 4); // Lower nibble
RB1 = 1; RB0 = 1; __delay_ms(2); RB1 = 0;
}
void lcd_init(){
__delay_ms(20);
lcd_cmd(0x02); // Initialize LCD
lcd_cmd(0x28); // 4-bit, 2 lines
lcd_cmd(0x0C); // Display ON
lcd_cmd(0x06); // Entry mode
}
void lcd_print(char *str){
while(*str) lcd_data(*str++);
}