<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; ATtiny13 + LCD1602_I2C]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=315&amp;type=atom" />
	<updated>2021-05-11T06:06:03Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=315</id>
		<entry>
			<title type="html"><![CDATA[ATtiny13 + LCD1602_I2C]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=3527#p3527" />
			<content type="html"><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/05/1a970a55975116856d7df8f8fdc12c2b.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/05/1a970a55975116856d7df8f8fdc12c2b.png" /></span> </p><br /><div class="codebox"><pre><code>#define ADDR    0x27
#define SDA 3 // PB3
#define SCL 4 // PB4
#define RS      0
#define E       2
#define LED     3

byte led_b,h[8];

void setup() {

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

void loop() {
   lcdCurs(0,3);
   lcdString(&quot;ATtiny__13&quot;);
   lcdCurs(1,3);
   lcdLong(1234567890);  
}

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(){ 
    del();
    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><div class="quotebox"><blockquote><p>Скетч использует 840 байт (82%) памяти устройства. Всего доступно 1024 байт.<br />Глобальные переменные используют 13 байт (20%) динамической памяти, оставляя 51 байт для локальных переменных. Максимум: 64 байт.</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2021-05-11T06:06:03Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=3527#p3527</id>
		</entry>
</feed>
