#include #include #include "LCDDisplay.h" #define SHT_IN PINB #define SHT_PORT PORTB #define SHT_DDR DDRB #define SHT_DATA PB6 #define SHT_CLK PB7 #define SHT_DATA_1 DDRB &= ~(1 << SHT_DATA) //write "1" to bus (tristate, pullup will pull to high) #define SHT_DATA_0 DDRB |= (1<< SHT_DATA) //write "0" to bus (drive bus low) #define SHT_DATA_IN (SHT_IN >> PB6) #define SHT_CLK_1 DDRB &= ~(1 << SHT_CLK) #define SHT_CLK_0 DDRB |= (1<0; i=i/2){ if(i&data) SHT_DATA_1; else SHT_DATA_0; SHT_CLK_1; _delay_us(5); SHT_CLK_0; _delay_ms(100); } //release Bus, SHT_DATA=1 SHT_DATA_1; //direction input SHT_CLK_1; //release Bus error=SHT_DATA_IN; //Get ack or nack SHT_CLK_0; return error; //error=1 on nack } void sht_trans_start(void){ SHT_CLK_0; SHT_DATA_1; _delay_us(5); SHT_CLK_1; _delay_us(5); SHT_DATA_0; _delay_us(5); SHT_CLK_0; _delay_us(5); SHT_CLK_1; _delay_us(5); SHT_DATA_1; _delay_us(5); SHT_CLK_0; } unsigned char sht_read_byte(unsigned char ack){ unsigned char i, val=0; SHT_DATA_1; //release bus (let the sht drive bus) for(i=0x80; i>0; i/=2){ SHT_CLK_1; if(SHT_DATA_IN) val =(val|i); _delay_ms(10); SHT_CLK_0; _delay_ms(100); } if(ack==1) SHT_DATA_0; //pull down if ack==1 (send ack) SHT_CLK_1; _delay_us(5); SHT_CLK_0; _delay_us(5); SHT_DATA_1; return val; } void sht_connection_reset(void){ unsigned char i; SHT_DATA_1; SHT_CLK_0; for(i=0; i<9; i++){ SHT_CLK_1; SHT_CLK_0; } sht_trans_start(); } unsigned char sht_softreset(void){ unsigned char error=0; sht_connection_reset(); error+=sht_write_byte(SHT_RESET); _delay_ms(15); //wait at least 11 ms after this command return error; } unsigned char sht_measure(unsigned int *result, unsigned char *checksum, unsigned char mode){ unsigned char error=0; unsigned int i; sht_trans_start(); switch(mode){ case TEMP: error+=sht_write_byte(MEASURE_TEMP); break; case HUMI: error+=sht_write_byte(MEASURE_HUMI); break; default: break; } while(!SHT_DATA_IN){ asm volatile ("nop"); } *result=(sht_read_byte(ACK) << 8); *result=*result + sht_read_byte(ACK); *checksum=sht_read_byte(NACK); return error; } void disp_array(unsigned char buf[], char size){ while(*buf!='\0' && size--){ if(size==7){ disp_cmd(DISP_L2); } disp_data(*buf); buf++; } }