<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; ATMEGA328 + LCD1602_I2C]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=313&amp;type=atom" />
	<updated>2021-05-09T17:03:56Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=313</id>
		<entry>
			<title type="html"><![CDATA[ATMEGA328 + LCD1602_I2C]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=3524#p3524" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#define ADDR    0x27
#define CPU_F   16000000  // тактовая частота микроконтроллера
#define SCL_F   400000    // частота шины I2C
#define RS      0
#define E       2
#define LED     3

byte led_b;

void setup() {
    TWBR = (((CPU_F)/(SCL_F)-16 )/2); // устанавливаем скорость шины
    TWSR = 0;
    i2c_write(led_b |= (1&lt;&lt;LED));// включаем подсветку
    lcdInit();
}

void loop() {
   
   lcdCurs(0,3);
   lcdString(&quot;LCD1602_I2C&quot;);
   lcdCurs(1,3);
   lcdLong(1234567890);
   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 lcdInit(){ 
    delay(100);
    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(){delay(1);}
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, то выводить ноль
  }  

void i2c_write(byte lcd){
  TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT))); // Ожидание установки флага TWINT. Это покажет, что START был передан.

  TWDR = ADDR &lt;&lt; 1; //передаем адрес устройства
  TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN); //включим прием данных
  while (!(TWCR &amp; (1&lt;&lt;TWINT))); // Ожидание установки флага TWINT. Это покажет, что SLA+W был передан, и будет принят ACK/NACK.

  TWDR = lcd;
  TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN); //включим прием данных
  while (!(TWCR &amp; (1&lt;&lt;TWINT))); // Ожидание установки флага TWINT. Это покажет, что SLA+W был передан, и будет принят ACK/NACK.
  
  TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
  }</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2021-05-09T17:03:56Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=3524#p3524</id>
		</entry>
</feed>
