#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
uint8_t column[2] = {0,64};
#define F_CPU 16000000UL
//lcd connections
#define rs PC0
#define en PC1
#define D4 PC2
#define D5 PC3
#define D6 PC4
#define D7 PC5
//lcd functions
void lcd_init(void)
{
DDRC |= (1 << rs) | (1 << en) | (1 << D4) | (1 << D5) | (1 << D6) | (1 << D7);
_delay_ms(20);
send_command(0x33);
send_command(0x32);
send_command(0x28);
send_command(0x0C);
send_command(0x06);
send_command(0x01);
_delay_ms(2);
}
void send_command(unsigned char command)
{
PORTC = (PORTC & 0x03) | ((command & 0xF0) >> 2);
PORTC &= ~(1 << rs);
PORTC |= (1 << en);
_delay_ms(1);
PORTC &= ~(1 << en);
_delay_ms(200);
PORTC = (PORTC & 0x03) | ((command & 0x0F) << 2);
PORTC |= (1 << en);
_delay_ms(1);
PORTC &= ~(1 << en);
_delay_ms(2);
}
void send_data(unsigned char data)
{
PORTC = (PORTC & 0x03) | ((data & 0xF0) >> 2);
PORTC |= (1 << rs);
PORTC |= (1 << en);
_delay_ms(1);
PORTC &= ~(1 << en);
_delay_ms(200);
PORTC = (PORTC & 0x03) | ((data & 0x0F) << 2);
PORTC |= (1 << en);
_delay_ms(1);
PORTC &= ~(1 << en);
_delay_ms(2);
}
void send_string(char *string)
{
while(*string != '\0')
{
send_data(*string++);
}
}
void set_cursor(uint8_t x,uint8_t y)
{
send_command(0x80 + x + column[y]);
}
//chip functions
void reset(void)
{
DDRD |= (1 << PD4);
PORTD &= ~(1 << PD4);
_delay_us(480);
DDRD &= ~(1 << PD4);
_delay_us(60);
while(PIND & (1 << PD4));
_delay_us(420);
}
void writebit(uint8_t data)
{
DDRD |= (1 << PD4);
PORTD &= ~(1 << PD4);
_delay_us(1);
if(data) PORTD |= (1 << PD4);
_delay_us(60);
DDRD &= ~(1 << PD4);
}
void writebyte(uint8_t byte)
{
for(uint8_t i=0;i<8;i++)
{
writebit(byte & 0x01);
byte >>= 1;
}
}
uint8_t readbit(void)
{
DDRD |= (1 << PD4);
PORTD &= ~(1 << PD4);
_delay_us(1);
DDRD &= ~(1 << PD4);
_delay_us(10);
uint8_t bite = (PIND & (1 << PD4)) ? 1 : 0;
_delay_us(50);
return bite;
}
uint8_t readbyte(void)
{
uint8_t bute;
for(uint8_t i=0;i<8;i++)
{
bute |= (readbit() << i);
}
return bute;
}
float get_temp(void)
{
uint8_t temp_msb,temp_lsb;
uint8_t raw_temp;
float temp_c;
reset();
writebyte(0xCC);
writebyte(0x44);
_delay_ms(750);
reset();
writebyte(0xCC);
writebyte(0xBE);
temp_lsb = readbyte();
temp_msb = readbyte();
raw_temp = temp_lsb << 8 | temp_msb;
temp_c = raw_temp / 16.0;
return temp_c;
}
int main(void)
{
lcd_init();
char buffer[16];
while(1)
{
float temp = get_temp();
set_cursor(0,0);
send_string("temp = ");
dtostrf(temp,5,1,buffer);
send_string(buffer);
send_string(" C");
_delay_ms(1000);
}
return 0;
}