<?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 + ds1307]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=317&amp;type=atom" />
	<updated>2021-05-11T09:54:16Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=317</id>
		<entry>
			<title type="html"><![CDATA[ATtiny13 + LCD1602_I2C + ds1307]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=3529#p3529" />
			<content type="html"><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/05/dab1c7b5c86d7a53ce545d1cae5ebe4d.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/05/dab1c7b5c86d7a53ce545d1cae5ebe4d.png" /></span> </p><br /><div class="codebox"><pre><code>#define ADDR    0x27
#define ADDR_T  0b1101000
#define SDA 3 // PB3
#define SCL 4 // PB4
#define RS      0
#define E       2
#define LED     3

byte led_b,init_t;


void setup() {
    lcdInit();
    i2c_write(led_b |= (1&lt;&lt;LED));// включаем подсветку
  //   set_time(21,2,5,11,15,47,0);// год 00-99, ДН 1-7 (1=ВС), месяц 1-12, дата 1-31, час 0-23, минуты 0-59, секунды 0-59
   delay(500);
}

void loop() {
   byte sec =  (ds_read(0) &amp; 0x0F) + (((ds_read(0) &amp; 0x70) &gt;&gt; 4) * 10);
   byte min =  (ds_read(1) &amp; 0x0F) + (((ds_read(1) &amp; 0x70) &gt;&gt; 4) * 10);
   byte hour = ((ds_read(2) &amp; 0x0F) + ((ds_read(2) &amp; 0x70) &gt;&gt; 4) * 10);
   byte datat = ((ds_read(4) &amp; 0x0F) + ((ds_read(4) &amp; 0x70) &gt;&gt; 4) * 10);
   byte mont = ((ds_read(5) &amp; 0x0F) + ((ds_read(5) &amp; 0x70) &gt;&gt; 4) * 10);
   byte year = ((ds_read(6) &amp; 0x0F) + ((ds_read(6) &amp; 0x70) &gt;&gt; 4) * 10);
   lcdCurs(0,4);
   lcdChar(hour/10+&#039;0&#039;);lcdChar(hour%10+&#039;0&#039;);lcdChar(58);
   lcdChar(min/10+&#039;0&#039;);lcdChar(min%10+&#039;0&#039;);lcdChar(58);
   lcdChar(sec/10+&#039;0&#039;);lcdChar(sec%10+&#039;0&#039;);
   lcdCurs(1,4); 
   lcdChar(datat/10+&#039;0&#039;);lcdChar(datat%10+&#039;0&#039;);lcdChar(45);
   lcdChar(mont/10+&#039;0&#039;);lcdChar(mont%10+&#039;0&#039;);lcdChar(45);
   lcdChar(year/10+&#039;0&#039;);lcdChar(year%10+&#039;0&#039;);
   delay(200);
}

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(); 
}

byte i2c_read_byte(byte a){
    byte i, data=0;                
    for(i=0; i&lt;8; i++){if (!i2c_read_bit()) data++;if(i!=7) data&lt;&lt;=1;}        
    i2c_write_bit(a);return data;  
}
 
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(){
     DDRB &amp;= ~(1 &lt;&lt; SDA); DDRB &amp;= ~(1 &lt;&lt; SCL);
     DDRB |= (1 &lt;&lt; SDA);  PORTB &amp;= ~(1 &lt;&lt; SDA);
     DDRB |= (1 &lt;&lt; SCL);  PORTB &amp;= ~(1 &lt;&lt; SCL);
}
 
void i2c_stop()  {
     DDRB |= (1 &lt;&lt; SDA);           
     DDRB &amp;= ~(1 &lt;&lt; SCL);            
     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();
  }   

void ds_write(byte reg, byte data){
     i2c_start();
     i2c_write_byte(ADDR_T&lt;&lt;1);
     i2c_write_byte(reg);
     i2c_write_byte(data);
     i2c_stop();
  }  
  
byte ds_read(byte reg){
     byte dat=0;
     i2c_start();
     i2c_write_byte(ADDR_T&lt;&lt;1);
     i2c_write_byte(reg);
     i2c_start(); 
     i2c_write_byte((ADDR_T&lt;&lt;1)|1); 
     dat = i2c_read_byte(0);
     i2c_stop();
     return dat;
  }

void set_time(byte years, byte days, byte monts, byte datas, byte hours ,byte minute, byte second){
    ds_write(0x00,(second/10&lt;&lt;4)+second%10);
    ds_write(0x01,(minute/10&lt;&lt;4)+minute%10);
    ds_write(0x02,(hours/10&lt;&lt;4)+hours%10);
    ds_write(0x03,days);
    ds_write(0x04,(datas/10&lt;&lt;4)+datas%10);
    ds_write(0x05,(monts/10&lt;&lt;4)+monts%10);
    ds_write(0x06,(years/10&lt;&lt;4)+years%10);
  }  </code></pre></div><div class="quotebox"><blockquote><p>Скетч использует 950 байт (92%) памяти устройства. Всего доступно 1024 байт.<br />Глобальные переменные используют 1 байт (1%) динамической памяти, оставляя 63 байт для локальных переменных. Максимум: 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-11T09:54:16Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=3529#p3529</id>
		</entry>
</feed>
