<?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; ATtiny2313 + LCD1602_I2C]]></title>
		<link>http://forum.rcl-radio.ru/viewtopic.php?id=312</link>
		<atom:link href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=312&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «ATtiny2313 + LCD1602_I2C».]]></description>
		<lastBuildDate>Mon, 07 Apr 2025 06:43:30 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: ATtiny2313 + LCD1602_I2C]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=11726#p11726</link>
			<description><![CDATA[<p>Большой шрифт цифр.<br /></p><div class="codebox"><pre><code>#define ADDR    0x27
#define SDA 0 // PB0
#define SCL 1 // PB1
#define RS      0
#define En      2
#define LED     3
byte led_b;
byte A[8] = {0b00111,0b01111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111};
byte B[8] = {0b11111,0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000};
byte C[8] = {0b11100,0b11110,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111};
byte D[8] = {0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b01111,0b00111};
byte E[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111,0b11111};
byte F[8] = {0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11110,0b11100};
byte G[8] = {0b11111,0b11111,0b11111,0b00000,0b00000,0b00000,0b11111,0b11111};
byte H[8] ={0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111};

void setup() {
  i2c_write(led_b |= (1&lt;&lt;LED));// включаем подсветку
  lcdInit();
    create(0,A);
    create(1,B);
    create(2,C);
    create(3,D);
    create(4,E);
    create(5,F);
    create(6,G);
    create(7,H);
   lcdCurs(0,7);
   lcdSend(0,0xa5); 
   lcdCurs(1,7);
   lcdSend(0,0xa5);  
  }
 
void loop() {
 
   displayC(0,0);
   displayC(4,1);
   displayC(8,2);
   displayC(12,3);
   
   delay(100);
}

///////////////////////////////////////////////////////////////////////////////////////////
void lcdSend(bool rs, byte data) {
    if(rs==0){led_b |= (1&lt;&lt;RS);} else {led_b &amp;= ~(1&lt;&lt;RS);}//RS
    
    del();
    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 lcd(uint8_t cmd) {lcdSend(true, cmd);}
void lcdChar(const char chr) {lcdSend(false, (uint8_t)chr);}
void lcdString(const char* str) {while(*str != &#039;\0&#039;) {del();lcdChar(*str);str++;}}
void del(){delayMicroseconds(1000);}
void e_pin(){i2c_write(led_b |= (1&lt;&lt;En));del();i2c_write(led_b &amp;= ~(1&lt;&lt;En));}

void lcdCurs(byte str, byte mesto){
  if(str==0){lcd(0b10000000+mesto);}
  if(str==1){lcd(0b11000000+mesto);}
  }
void lcdInit(){ 
    DDRB |= (1 &lt;&lt; 2)| (1 &lt;&lt; 3)| (1 &lt;&lt; 4)| (1 &lt;&lt; 5) | (1 &lt;&lt; 6) | (1 &lt;&lt; 7);  
    delay(100);
    lcd(0x03);
    delayMicroseconds(4500); 
    lcd(0x03);
    delayMicroseconds(200);
    lcd(0b00000010);del();
    lcd(0b00001100);del();
    lcd(0b00101000);del();
    lcdClear();
  } 
void lcdInt(long int_x){
   byte h[8];
   long int_y=int_x;
   int i,i_kol;
  if(int_x&lt;0){int_x=abs(int_x);lcdChar(&#039;-&#039;);}    // если минус
  for(i_kol=0;int_x&gt;0;i_kol++){int_x=int_x/10;}  // определяем кол-во цифр в long
  for(i=0;i&lt;i_kol;i++){h[i]=int_y%10; int_y=int_y/10;}// разбиваем число на отдельные цифры
  for(i=i_kol-1;i&gt;=0;i--){lcdChar(h[i] +&#039;0&#039;);} // преобразуем числа в char
  if(i_kol==0){lcdChar(&#039;0&#039;);} // если long = 0, то выводить ноль
  }
void lcdClear(){lcd(0x01);} 
void create( byte loc, byte charA[]) {
  loc &amp;= 0x7; 
  lcd(0x40 | (loc &lt;&lt; 3));
  for (byte i=0; i&lt;8; i++) {
    lcdSend(0,charA[i]);
  }
} 
void displayC(byte col, byte fig){
  
  switch (fig) {
      case 0:
        lcdCurs(0,col); 
        lcdSend(0,0); 
        lcdSend(0,1); 
        lcdSend(0,2); 
        lcdCurs(1,col);
        lcdSend(0,3); 
        lcdSend(0,4); 
        lcdSend(0,5); 
        break;
      case 1:
        lcdCurs(0,col); 
        lcdSend(0,1); 
        lcdSend(0,2); 
        lcdSend(0,0x20); 
        lcdCurs(1,col);
        lcdSend(0,4); 
        lcdSend(0,7); 
        lcdSend(0,4); 
        break;
      case 2:
        lcdCurs(0,col); 
        lcdSend(0,6); 
        lcdSend(0,6); 
        lcdSend(0,2); 
        lcdCurs(1,col);
        lcdSend(0,3); 
        lcdSend(0,4); 
        lcdSend(0,4); 
        break;
      case 3:
        lcdCurs(0,col); 
        lcdSend(0,6); 
        lcdSend(0,6); 
        lcdSend(0,2); 
        lcdCurs(1,col);
        lcdSend(0,4); 
        lcdSend(0,4); 
        lcdSend(0,5); 
        break;
      case 4:
        lcdCurs(0,col); 
        lcdSend(0,3); 
        lcdSend(0,4); 
        lcdSend(0,7); 
        lcdCurs(1,col);
        lcdSend(0,0x20); 
        lcdSend(0,0x20); 
        lcdSend(0,7); 
        break;
      case 5:
       lcdCurs(0,col); 
        lcdSend(0,3); 
        lcdSend(0,6); 
        lcdSend(0,6); 
        lcdCurs(1,col);
        lcdSend(0,4); 
        lcdSend(0,4); 
        lcdSend(0,5); 
        break;
      case 6:
        lcdCurs(0,col); 
        lcdSend(0,0); 
        lcdSend(0,6); 
        lcdSend(0,6); 
        lcdCurs(1,col);
        lcdSend(0,3); 
        lcdSend(0,4); 
        lcdSend(0,5); 
        break;
      case 7:
       lcdCurs(0,col); 
        lcdSend(0,1); 
        lcdSend(0,1); 
        lcdSend(0,2); 
        lcdCurs(1,col);
        lcdSend(0,0x20); 
        lcdSend(0,0x20); 
        lcdSend(0,7); 
        break;
      case 8:
        lcdCurs(0,col); 
        lcdSend(0,0); 
        lcdSend(0,6); 
        lcdSend(0,2); 
        lcdCurs(1,col);
        lcdSend(0,3); 
        lcdSend(0,4); 
        lcdSend(0,5); 
        break;
      case 9:
        lcdCurs(0,col); 
        lcdSend(0,0); 
        lcdSend(0,6); 
        lcdSend(0,2); 
        lcdCurs(1,col);
        lcdSend(0,0x20); 
        lcdSend(0,0x20); 
        lcdSend(0,7); 
        break;                                

    }

}
 /////////////////////////////////////
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();
  }    
   </code></pre></div><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2025/04/50618c80521cd901c9ba1dab39823460.jpg" alt="http://forum.rcl-radio.ru/uploads/images/2025/04/50618c80521cd901c9ba1dab39823460.jpg" /></span></p>]]></description>
			<author><![CDATA[null@example.com (klause)]]></author>
			<pubDate>Mon, 07 Apr 2025 06:43:30 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=11726#p11726</guid>
		</item>
		<item>
			<title><![CDATA[Re: ATtiny2313 + LCD1602_I2C]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=11438#p11438</link>
			<description><![CDATA[<p>Создание своих символов. <br /></p><div class="codebox"><pre><code>#define ADDR    0x27
#define SDA 2 // PB3
#define SCL 3 // PB2
#define RS      0
#define E       2
#define LED     3
byte led_b;
char smile[]={0x00,0x00,0x0a,0x00,0x11,0x0e,0x00,0x00};
char plus[]={0x04,0x04,0x1f,0x04,0x04,0x00,0x1f,0x00};
char gradus[] = {B00110,B01001,B01001,B00110,B00000,B00000,B00000,B00000};
void setup() {

    i2c_write(led_b |= (1&lt;&lt;LED));// включаем подсветку
    lcdInit();
  lcd(0x40);
  for( byte i=0;i&lt;8;i++)lcdSend(0,smile[i]);
  lcd(0x40+8);
  for( byte i=0;i&lt;8;i++)lcdSend(0,plus[i]);
  lcd(0x40+16);
  for( byte i=0;i&lt;8;i++)lcdSend(0,gradus[i]);  
}

void loop() {
   
   lcdCurs(0,3);
   lcdString(&quot;ATtiny2313&quot;);
   lcdCurs(1,3);
   lcdSend(0,0); 
   lcdCurs(1,5);
   lcdSend(0,1);
   lcdCurs(1,7);
   lcdSend(0,2);
   delayMicroseconds(10000);
   

}

void lcdSend(bool rs, byte data) {
    if(rs==0){led_b |= (1&lt;&lt;RS);} else {led_b &amp;= ~(1&lt;&lt;RS);}//RS
    
    del();
    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(){ 
    delayMicroseconds(10000);
    lcd(0x03);delayMicroseconds(4500);
    lcd(0x03);delayMicroseconds(4500);
    lcd(0x03);delayMicroseconds(200);
    
    lcd(0b00000010);del();
    lcd(0b00001100);del();
    lcdClear();
  } 

void lcdClear(){lcd(0b00000001);} 
void lcd(uint8_t cmd) {lcdSend(true, cmd);}
void lcdChar(const char chr) {lcdSend(false, (uint8_t)chr);}
void lcdString(const char* str) {while(*str != &#039;\0&#039;) {del();lcdChar(*str);str++;}}
void del(){delayMicroseconds(1000);}
void e_pin(){i2c_write(led_b |= (1&lt;&lt;E));del();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);}
  }  

void lcdLong(long int_x){
   byte h[8];
   long int_y=int_x;
   int i,i_kol;
  if(int_x&lt;0){int_x=abs(int_x);lcdChar(&#039;-&#039;);}    // если минус
  for(i_kol=0;int_x&gt;0;i_kol++){int_x=int_x/10;}  // определяем кол-во цифр в long
  for(i=0;i&lt;i_kol;i++){h[i]=int_y%10; int_y=int_y/10;}// разбиваем число на отдельные цифры
  for(i=i_kol-1;i&gt;=0;i--){lcdChar(h[i] +&#039;0&#039;);} // преобразуем числа в char
  if(i_kol==0){lcdChar(&#039;0&#039;);} // если long = 0, то выводить ноль
  }  


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();
  }    </code></pre></div><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2025/02/54928f83e6d2d243f70f7cb32a7df94b.jpg" alt="http://forum.rcl-radio.ru/uploads/images/2025/02/54928f83e6d2d243f70f7cb32a7df94b.jpg" /></span></p>]]></description>
			<author><![CDATA[null@example.com (klause)]]></author>
			<pubDate>Fri, 28 Feb 2025 08:02:19 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=11438#p11438</guid>
		</item>
		<item>
			<title><![CDATA[ATtiny2313 + LCD1602_I2C]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=3523#p3523</link>
			<description><![CDATA[<div class="codebox"><pre><code>#define ADDR    0x27
#define SDA 2 // PB3
#define SCL 3 // PB2
#define RS      0
#define E       2
#define LED     3

byte led_b;

void setup() {

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

void loop() {
   
   lcdCurs(0,3);
   lcdString(&quot;ATtiny2313&quot;);
   lcdCurs(1,3);
   lcdLong(1234567891);
   delayMicroseconds(10000);
   

}

void lcdSend(bool rs, byte data) {
    if(rs==0){led_b |= (1&lt;&lt;RS);} else {led_b &amp;= ~(1&lt;&lt;RS);}//RS
    
    del();
    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(){ 
    delayMicroseconds(10000);
    lcd(0x03);delayMicroseconds(4500);
    lcd(0x03);delayMicroseconds(4500);
    lcd(0x03);delayMicroseconds(200);
    
    lcd(0b00000010);del();
    lcd(0b00001100);del();
    lcdClear();
  } 

void lcdClear(){lcd(0b00000001);} 
void lcd(uint8_t cmd) {lcdSend(true, cmd);}
void lcdChar(const char chr) {lcdSend(false, (uint8_t)chr);}
void lcdString(const char* str) {while(*str != &#039;\0&#039;) {del();lcdChar(*str);str++;}}
void del(){delayMicroseconds(1000);}
void e_pin(){i2c_write(led_b |= (1&lt;&lt;E));del();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);}
  }  

void lcdLong(long int_x){
   byte h[8];
   long int_y=int_x;
   int i,i_kol;
  if(int_x&lt;0){int_x=abs(int_x);lcdChar(&#039;-&#039;);}    // если минус
  for(i_kol=0;int_x&gt;0;i_kol++){int_x=int_x/10;}  // определяем кол-во цифр в long
  for(i=0;i&lt;i_kol;i++){h[i]=int_y%10; int_y=int_y/10;}// разбиваем число на отдельные цифры
  for(i=i_kol-1;i&gt;=0;i--){lcdChar(h[i] +&#039;0&#039;);} // преобразуем числа в char
  if(i_kol==0){lcdChar(&#039;0&#039;);} // если long = 0, то выводить ноль
  }  


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();
  }    </code></pre></div>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Sun, 09 May 2021 16:54:12 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=3523#p3523</guid>
		</item>
	</channel>
</rss>
