<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[forum.rcl-radio.ru &mdash; ATtiny13 + LCD1602_I2C + ds18b20]]></title>
		<link>http://forum.rcl-radio.ru/viewtopic.php?id=316</link>
		<atom:link href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=316&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «ATtiny13 + LCD1602_I2C + ds18b20».]]></description>
		<lastBuildDate>Tue, 11 May 2021 06:15:56 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[ATtiny13 + LCD1602_I2C + ds18b20]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=3528#p3528</link>
			<description><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/05/1078d049da6bf7ace4bfb78a45dda3d1.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/05/1078d049da6bf7ace4bfb78a45dda3d1.png" /></span> </p><div class="codebox"><pre><code>#define ADDR    0x27
#define SDA 3 // PB3
#define SCL 4 // PB4
#define OUT 0 // PB0
#define RS      0
#define E       2
#define LED     3

byte led_b;
int t;

void setup() {
    i2c_write(led_b |= (1&lt;&lt;LED));// включаем подсветку
    lcdInit();
}

void loop() {
   t = read_temp();
   lcdCurs(0,3);
   lcdChar(84);lcdChar(69);lcdChar(77);lcdChar(80);
   lcdCurs(1,3); 
   lcdChar(t/100 +&#039;0&#039;);
   lcdChar(t/10%10 +&#039;0&#039;);
   lcdChar(46);
   lcdChar(t%10 +&#039;0&#039;);
   lcdChar(32);lcdChar(67);
   delay(1000);
}

void lcdSend(bool rs, byte data) {
    if(rs==0){led_b |= (1&lt;&lt;RS);} else {led_b &amp;= ~(1&lt;&lt;RS);}//RS
    
    delay(1);
    if(((data &gt;&gt; 7) &amp; 1) ==1){i2c_write(led_b |= (1&lt;&lt;7));} else {i2c_write(led_b &amp;= ~(1&lt;&lt;7));}
    if(((data &gt;&gt; 6) &amp; 1) ==1){i2c_write(led_b |= (1&lt;&lt;6));} else {i2c_write(led_b &amp;= ~(1&lt;&lt;6));}
    if(((data &gt;&gt; 5) &amp; 1) ==1){i2c_write(led_b |= (1&lt;&lt;5));} else {i2c_write(led_b &amp;= ~(1&lt;&lt;5));}
    if(((data &gt;&gt; 4) &amp; 1) ==1){i2c_write(led_b |= (1&lt;&lt;4));} else {i2c_write(led_b &amp;= ~(1&lt;&lt;4));}
    e_pin();
    if(((data &gt;&gt; 3) &amp; 1) ==1){i2c_write(led_b |= (1&lt;&lt;7));} else {i2c_write(led_b &amp;= ~(1&lt;&lt;7));}
    if(((data &gt;&gt; 2) &amp; 1) ==1){i2c_write(led_b |= (1&lt;&lt;6));} else {i2c_write(led_b &amp;= ~(1&lt;&lt;6));}
    if(((data &gt;&gt; 1) &amp; 1) ==1){i2c_write(led_b |= (1&lt;&lt;5));} else {i2c_write(led_b &amp;= ~(1&lt;&lt;5));}
    if(((data &gt;&gt; 0) &amp; 1) ==1){i2c_write(led_b |= (1&lt;&lt;4));} else {i2c_write(led_b &amp;= ~(1&lt;&lt;4));}
    e_pin();
}

void lcdInit(){ 
    lcd(0x03);delay(5);
    lcd(0x03);delay(5);
    lcd(0x03);delayMicroseconds(200);
    lcd(0b00000010);delay(5);
    lcd(0b00001100);delay(5);
    lcdClear();
  } 

void lcdClear(){lcd(0b00000001);} 
void lcd(uint8_t sett) {lcdSend(true, sett);}
void lcdChar(const char chr) {lcdSend(false, (uint8_t)chr);}
void e_pin(){i2c_write(led_b |= (1&lt;&lt;E));delay(1);i2c_write(led_b &amp;= ~(1&lt;&lt;E));}


void lcdCurs(byte str, byte mesto){
  if(str==0){lcd(0b10000000+mesto);}
  if(str==1){lcd(0b11000000+mesto);}
  }  
  

///// i2c /////////////

bool i2c_read_bit() {
    bool i2c_bit = 1;        
    DDRB &amp;= ~(1 &lt;&lt; SDA);            
    delayMicroseconds(10); 
    DDRB &amp;= ~(1 &lt;&lt; SCL);                
    if((PINB &gt;&gt; SDA) &amp; 1) i2c_bit=0;                            
    delayMicroseconds(10);  
    DDRB |= (1 &lt;&lt; SCL);              
    return i2c_bit;  
}
 
byte i2c_write_byte(byte data){
    for (byte i=0; i&lt;8; i++){i2c_write_bit((data&amp;0x80)==0);data&lt;&lt;=1;}    
    return i2c_read_bit(); 
}
 
void i2c_write_bit(byte b){
    delayMicroseconds(5);
    if(b){DDRB |= (1 &lt;&lt; SDA);}else{DDRB &amp;= ~(1 &lt;&lt; SDA);}
    delayMicroseconds(5);
    DDRB &amp;= ~(1 &lt;&lt; SCL);       
    delayMicroseconds(10);
    DDRB |= (1 &lt;&lt; SCL);
}
 
void i2c_start(){
     delayMicroseconds(10);  
     DDRB &amp;= ~(1 &lt;&lt; SDA); DDRB &amp;= ~(1 &lt;&lt; SCL); 
     delayMicroseconds(10); 
     DDRB |= (1 &lt;&lt; SDA);  PORTB &amp;= ~(1 &lt;&lt; SDA);
     delayMicroseconds(10); 
     DDRB |= (1 &lt;&lt; SCL);  PORTB &amp;= ~(1 &lt;&lt; SCL);   
     delayMicroseconds(10);
}
 
void i2c_stop()  {
     DDRB |= (1 &lt;&lt; SDA);            
     delayMicroseconds(10);
     DDRB &amp;= ~(1 &lt;&lt; SCL);               
     delayMicroseconds(10); 
     DDRB &amp;= ~(1 &lt;&lt; SDA);             
}
 
void i2c_write(byte lcd){
     i2c_start();
     i2c_write_byte(ADDR&lt;&lt;1);
     i2c_write_byte(lcd);
     i2c_stop();
  }   

//////// ds18b20 /////////////

// reset
uint8_t therm_reset(){
    uint8_t i;
    PORTB &amp;= ~(1 &lt;&lt; OUT);
    DDRB |= (1 &lt;&lt; OUT);
    delayMicroseconds(480);  
    DDRB &amp;= ~(1 &lt;&lt; OUT);
    delayMicroseconds(60);
    i=((PINB &gt;&gt; OUT) &amp; 1);
    delayMicroseconds(420);
    return i;
}
// write bit
void therm_write_bit(uint8_t bit){
    PORTB &amp;= ~(1 &lt;&lt; OUT);
    DDRB |= (1 &lt;&lt; OUT);
    delayMicroseconds(1);
    if(bit) DDRB &amp;= ~(1 &lt;&lt; OUT);
    delayMicroseconds(60);
    DDRB &amp;= ~(1 &lt;&lt; OUT);
}
// read bit
uint8_t therm_read_bit(void){
    uint8_t bit=0;
    PORTB &amp;= ~(1 &lt;&lt; OUT);
    DDRB |= (1 &lt;&lt; OUT);
    delayMicroseconds(1);
    DDRB &amp;= ~(1 &lt;&lt; OUT);
    delayMicroseconds(14);
    if(PINB &amp; (1 &lt;&lt; OUT)) bit=1;
    delayMicroseconds(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];
    int 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])*10/16;
    return (int)temper;
}   </code></pre></div><div class="quotebox"><blockquote><p>Скетч использует 946 байт (92%) памяти устройства. Всего доступно 1024 байт.<br />Глобальные переменные используют 3 байт (4%) динамической памяти, оставляя 61 байт для локальных переменных. Максимум: 64 байт.</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Tue, 11 May 2021 06:15:56 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=3528#p3528</guid>
		</item>
	</channel>
</rss>
