<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; lcd1602+I2C + DS3231 + 18b20]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=429&amp;type=atom" />
	<updated>2021-12-26T16:05:47Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=429</id>
		<entry>
			<title type="html"><![CDATA[lcd1602+I2C + DS3231 + 18b20]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=4946#p4946" />
			<content type="html"><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/12/3c339a0191dd6861b2aacbefcc0b03a9.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/12/3c339a0191dd6861b2aacbefcc0b03a9.png" /></span> <br /><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/12/a8537a836f7fd66826c678b222bab15f.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/12/a8537a836f7fd66826c678b222bab15f.png" /></span> </p><p>d10 - вход 18b20</p><div class="codebox"><pre><code>#include &lt;avr/io.h&gt;
#include &lt;util/delay.h&gt;

#define ADDR_DS3231    0b1101000
#define ADDR_1602      0x27

#define CPU_F   16000000 // Clock Speed 
#define SCL_F   100000 // // I2C Speed
/// uart init /////
#define BAUD 9600 // USART Speed
#define RS      0
#define E       2
#define LED     3


 byte led_b,init_t;
 byte d1,d2,d3,d4,d5,d6,e1,e2,e3;
 int a[6],x;
 int t_dig;
 byte sec,min,hour,datat,mont,year,day;
 unsigned long i,times,times0;
 bool w;


int main(){
   TWBR = (((CPU_F)/(SCL_F)-16 )/2) ;
   TWSR = 0;
   USART_Init(CPU_F/16/BAUD-1); 
  // set_time(21,1,12,26,18,45,0);// год 00-99, ДН 1-7 (1=ВС), месяц 1-12, дата 1-31, час 0-23, минуты 0-59, секунды 0-59
   lcdInit();
   i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;LED)); // включаем подсветку
   lcdWrite(0, 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07);
   lcdWrite(8, 0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00);      
   lcdWrite(16,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F);
   lcdWrite(24,0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F);
   lcdWrite(32,0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0x1C);
   lcdWrite(40,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C);
   lcdWrite(48,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07);
   lcdWrite(56,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00);
   cli();
   TCCR1A = 0;
   TCCR1B = 0;
   TCNT1 = 0;
   OCR1A = 6249;
   TCCR1B |= (1 &lt;&lt; WGM12);
   TCCR1B |= (1 &lt;&lt; CS12);
   TIMSK1 |= (1 &lt;&lt; OCIE1A);
   sei();
   
   while (1) { 

   sec =  (i2c_read_1bit(ADDR_DS3231,0) &amp; 0x0F) + (((i2c_read_1bit(ADDR_DS3231,0) &amp; 0x70) &gt;&gt; 4) * 10);
   min =  (i2c_read_1bit(ADDR_DS3231,1) &amp; 0x0F) + (((i2c_read_1bit(ADDR_DS3231,1) &amp; 0x70) &gt;&gt; 4) * 10);
   hour = ((i2c_read_1bit(ADDR_DS3231,2) &amp; 0x0F) + ((i2c_read_1bit(ADDR_DS3231,2) &amp; 0x70) &gt;&gt; 4) * 10);
   day =  (i2c_read_1bit(ADDR_DS3231,3) &amp; 0x0F);
   datat = ((i2c_read_1bit(ADDR_DS3231,4) &amp; 0x0F) + ((i2c_read_1bit(ADDR_DS3231,4) &amp; 0x70) &gt;&gt; 4) * 10);
   mont = ((i2c_read_1bit(ADDR_DS3231,5) &amp; 0x0F) + ((i2c_read_1bit(ADDR_DS3231,5) &amp; 0x70) &gt;&gt; 4) * 10);
   year = ((i2c_read_1bit(ADDR_DS3231,6) &amp; 0x0F) + ((i2c_read_1bit(ADDR_DS3231,6) &amp; 0x70) &gt;&gt; 4) * 10);
// temper = (i2c_read_1bit(ADDR_DS3231,0x11)*100 + ((i2c_read_1bit(ADDR_DS3231,0x12) &amp; 0b11000000) &gt;&gt; 6)*25) ;

  
  USART_int(hour);USART_String(&quot;:&quot;);
  USART_int(min);USART_String(&quot;:&quot;);
  USART_int(sec);USART_String(&quot; &quot;);
  USART_int(datat);USART_String(&quot;-&quot;);
  USART_int(mont);USART_String(&quot;-&quot;);
  USART_int(year);USART_String(&quot; &quot;);
  USART_int(day);USART_String(&quot; &quot;);
  USART_String(&quot;\n&quot;);
  
  if(i-times&gt;30){t_dig = read_temp();times=i;}
  if(i-times0&lt;30){
     a[0]=t_dig/100;
     a[1]=t_dig/10%10;
     a[2]=t_dig%10;
   for(x=0;x&lt;3;x++){
    switch(x){
        case 0: e1=2;e2=3,e3=4;break;
        case 1: e1=5,e2=6,e3=7;break;
        case 2: e1=9,e2=10,e3=11;break;

  }digit();
  lcdCurs(1,8);lcdChar(0x2e);lcdCurs(1,12);lcdChar(0xdf);lcdChar(0x43);}
  }
 if(i-times0&gt;=30&amp;&amp;i-times0&lt;100){
     a[0]=hour/10;
     a[1]=hour%10;
     a[2]=min/10;
     a[3]=min%10;
   for(x=0;x&lt;4;x++){
    switch(x){
        case 0: e1=0;e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;break;
  }digit();
  lcdCurs(0,6);lcdChar(0x2e);lcdCurs(1,6);lcdChar(0x2e);lcdCurs(1,13);lcdChar(20);lcdCurs(1,14);lcdChar(sec/10+&#039;0&#039;);lcdChar(sec%10+&#039;0&#039;);}
 }
 if(i-times0&gt;=100){times0=i; lcdClear();}
  

    
}}// END

ISR(TIMER1_COMPA_vect){i++;}

void digit(){
  switch(a[x]){
    case 0: d1=0,d2=7,d3=5,d4=0,d5=2,d6=5;break;
    case 1: d1=32,d2=1,d3=5,d4=32,d5=32,d6=5;break;
    case 2: d1=1,d2=7,d3=5,d4=0,d5=3,d6=4;break;
    case 3: d1=1,d2=3,d3=5,d4=6,d5=2,d6=5;break;
    case 4: d1=0,d2=2,d3=5,d4=32,d5=32,d6=5;break;
    case 5: d1=0,d2=3,d3=4,d4=6,d5=2,d6=5;break;
    case 6: d1=0,d2=3,d3=4,d4=0,d5=2,d6=5;break;
    case 7: d1=0,d2=7,d3=5,d4=32,d5=32,d6=5;break;
    case 8: d1=0,d2=3,d3=5,d4=0,d5=2,d6=5;break;
    case 9: d1=0,d2=3,d3=5,d4=6,d5=2,d6=5;break;
    case 10:d1=150,d2=150,d3=150,d4=150,d5=150,d6=150;break;}
    lcdCurs(0,e1);lcdChar(d1);
    lcdCurs(0,e2);lcdChar(d2);
    lcdCurs(0,e3);lcdChar(d3);
    lcdCurs(1,e1);lcdChar(d4);
    lcdCurs(1,e2);lcdChar(d5);
    lcdCurs(1,e3);lcdChar(d6);
}   


void lcdSend(bool rs, byte data) {
    cli();
    if(rs==0){led_b |= (1&lt;&lt;RS);} else {led_b &amp;= ~(1&lt;&lt;RS);}//RS
 
    _delay_us(1);
    if(((data &gt;&gt; 7) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;7));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;7));}
    if(((data &gt;&gt; 6) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;6));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;6));}
    if(((data &gt;&gt; 5) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;5));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;5));}
    if(((data &gt;&gt; 4) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;4));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;4));}
    e_pin();
    if(((data &gt;&gt; 3) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;7));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;7));}
    if(((data &gt;&gt; 2) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;6));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;6));}
    if(((data &gt;&gt; 1) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;5));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;5));}
    if(((data &gt;&gt; 0) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;4));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;4));}
    e_pin();
    sei();
}
 
void lcdInit(){ 
    lcd(0x03);_delay_us(4500);
    lcd(0x03);_delay_us(4500);
    lcd(0x03);_delay_us(200);
    lcd(0b00000010);_delay_ms(5);
    lcd(0b00001100);_delay_ms(5);
    lcdClear();
  } 
 
void lcdClear(){lcd(0b00000001);} 
void lcdString(const char* str) {while(*str != &#039;\0&#039;) {_delay_us(1);lcdChar(*str);str++;}}
void lcd(uint8_t sett) {lcdSend(true, sett);}
void lcdChar(const char chr) {lcdSend(false, (uint8_t)chr);}
void e_pin(){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;E));_delay_us(1);i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;E));}
void lcdWrite(byte addr_w, byte wr1,byte wr2,byte wr3,byte wr4,byte wr5,byte wr6,byte wr7,byte wr8){
     lcd(0b01000000|addr_w);lcdChar(wr1);lcdChar(wr2);lcdChar(wr3);lcdChar(wr4);lcdChar(wr5);lcdChar(wr6);lcdChar(wr7);lcdChar(wr8);}
 
 
void lcdCurs(byte str, byte mesto){
  if(str==0){lcd(0b10000000+mesto);}
  if(str==1){lcd(0b11000000+mesto);}
  }  


int i2c_read_i2c_2bit(byte i2c_addr, byte i2c_reg){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
 
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT))); 
   TWDR = (i2c_addr &lt;&lt; 1) | 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
 
   TWCR=(1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWEA); 
  while(~TWCR&amp;(1&lt;&lt;TWINT));
   int i2c_data0 = TWDR; 
 
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while(~TWCR&amp;(1&lt;&lt;TWINT));
  int i2c_data1 = TWDR; 
 
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
  int i2c_data = (i2c_data0&lt;&lt;8)+i2c_data1;
  return i2c_data;
  }  

int i2c_read_1bit(byte i2c_addr, byte i2c_reg){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
 
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT))); 
   TWDR = (i2c_addr &lt;&lt; 1) | 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
 
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWEA); 
  while(~TWCR&amp;(1&lt;&lt;TWINT));
    byte i2c_data = TWDR; 
  TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
 
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
  return i2c_data;
  }   

 void i2c_write(byte i2c_addr, byte i2c_reg, byte i2c_dat){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_dat;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
  } 

 void i2c_write_1bit(byte i2c_addr, byte i2c_reg){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
  }   

void set_time(byte years, byte days, byte monts, byte datas, byte hours ,byte minute, byte second){
    if(second &lt; 255){i2c_write(ADDR_DS3231,0x00,(second/10&lt;&lt;4)+second%10);}
    if(minute &lt; 255){i2c_write(ADDR_DS3231,0x01,(minute/10&lt;&lt;4)+minute%10);} 
    if(hours &lt; 255){i2c_write(ADDR_DS3231,0x02,(hours/10&lt;&lt;4)+hours%10);}
    if(days &lt; 255){i2c_write(ADDR_DS3231,0x03,days);}
    if(datas &lt; 255){i2c_write(ADDR_DS3231,0x04,(datas/10&lt;&lt;4)+datas%10);}
    if(monts &lt; 255){i2c_write(ADDR_DS3231,0x05,(monts/10&lt;&lt;4)+monts%10);}
    if(years &lt; 255){i2c_write(ADDR_DS3231,0x06,(years/10&lt;&lt;4)+years%10);}
  }    

void USART_Init( unsigned int ubrr ){
  UBRR0H = (unsigned char)(ubrr&gt;&gt;8);
  UBRR0L = (unsigned char)ubrr;
  UCSR0B = (1&lt;&lt;RXEN0)|(1&lt;&lt;TXEN0);
  UCSR0C = (1&lt;&lt;USBS0)|(3&lt;&lt;UCSZ00);
}  

void USART_String(char *data){
  for(int i=0;i&lt;strlen(data);i++){
  while(!( UCSR0A &amp; (1 &lt;&lt; UDRE0 )));
  UDR0 = data[i];}
}

void USART_int(int to_int){
  String stringVar = String(to_int, DEC);
  char charVar[sizeof(stringVar)];
  stringVar.toCharArray(charVar, sizeof(charVar));
  USART_String(charVar);} 

// reset
uint8_t therm_reset(){
    uint8_t i;
    PORTB &amp;= ~(1 &lt;&lt; PB2);
    DDRB |= (1 &lt;&lt; PB2);
    _delay_us(480);  
    DDRB &amp;= ~(1 &lt;&lt; PB2);
    _delay_us(60);
    i=((PINB &gt;&gt; PB2) &amp; 1);
    _delay_us(420);
    return i;
}
// write bit
void therm_write_bit(uint8_t bit){
    PORTB &amp;= ~(1 &lt;&lt; PB2);
    DDRB |= (1 &lt;&lt; PB2);
    _delay_us(1);
    if(bit) DDRB &amp;= ~(1 &lt;&lt; PB2);
    _delay_us(60);
    DDRB &amp;= ~(1 &lt;&lt; PB2);
}
// read bit
uint8_t therm_read_bit(void){
    uint8_t bit=0;
    PORTB &amp;= ~(1 &lt;&lt; PB2);
    DDRB |= (1 &lt;&lt; PB2);
    _delay_us(1);
    DDRB &amp;= ~(1 &lt;&lt; PB2);
    _delay_us(14);
    if(PINB &amp; (1 &lt;&lt; PB2)) bit=1;
    _delay_us(45);
    return bit;
}
 
// read byte
uint8_t therm_read_byte(void){
    uint8_t i=8, n=0;
    while(i--){n&gt;&gt;=1;n|=(therm_read_bit()&lt;&lt;7);}
    return n;
}
 
// write byte
void therm_write_byte(uint8_t byte){
    uint8_t i=8;
    while(i--){therm_write_bit(byte&amp;1);byte &gt;&gt;= 1;
    }
}
// read temp
int read_temp(){
    uint8_t temperature[2];
    float temper;
    therm_reset();
    therm_write_byte(0xCC);
    therm_write_byte(0x44);
    while(!therm_read_bit());
    therm_reset();
    therm_write_byte(0xCC);
    therm_write_byte(0xBE);
    temperature[0]=therm_read_byte();
    temperature[1]=therm_read_byte();
    therm_reset();
    temper = (temperature[1] &lt;&lt; 8 | temperature[0])/1.60;
    return (int)temper;
}  </code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2021-12-26T16:05:47Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=4946#p4946</id>
		</entry>
</feed>
