<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; Примеры кода]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;fid=23&amp;type=atom" />
	<updated>2025-04-06T09:18:38Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/index.php</id>
		<entry>
			<title type="html"><![CDATA[Управление панелькой от магнитолы aura с драйвером ht1621]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=699&amp;action=new" />
			<summary type="html"><![CDATA[<div class="codebox"><pre><code>#define CS   13  
#define WR   12  
#define DATA 10  

#define CS1    digitalWrite(CS, HIGH) 
#define CS0    digitalWrite(CS, LOW)
#define WR1    digitalWrite(WR, HIGH) 
#define WR0    digitalWrite(WR, LOW)
#define DATA1  digitalWrite(DATA, HIGH) 
#define DATA0  digitalWrite(DATA, LOW)

#define sbi(x, y)  (x |= (1 &lt;&lt; y))   
#define cbi(x, y)  (x &amp;= ~(1 &lt;&lt;y ))  
#define uchar   unsigned char 
#define uint   unsigned int 

 
#define  ComMode    0x52  //4COM,1/3bias  1000    010 1001  0  
#define  RCosc      0x30  //1000 0011 0000 
#define  LCD_on     0x06  //1000     0000 0 11 0 
#define  LCD_off    0x04  
#define  Sys_en     0x02  //1000   0000 0010 
#define  CTRl_cmd   0x80  
#define  Data_cmd   0xa0  

/*0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,H,h,L,n,N,o,P,r,t,U,-, ,*/

const char buk[]={B10000000,B11111111,B10110110,B11110010,B01100011,B11010011,B11010111,B01110000,B11110111,B11110011,B00000000,B00001000}; // биты чисел
                 //    0        1          2         3        4         5         6          7          8       9      
char dispnum[6]={0x00,0x00,0x00,0x00,0x00,0x00};

void SendBit_1621(uchar sdata,uchar cnt)
{ 
  //data cnt HT1621
  uchar i; 
  for(i=0;i&lt;cnt;i++) 
  { 
    WR0;
    if(sdata&amp;0x80) DATA1; 
    else DATA0;
    WR1;
    sdata&lt;&lt;=1; 
  } 
}
void SendCmd_1621(uchar command) 
{ 
  CS0; 
  SendBit_1621(0x80,4);  
  SendBit_1621(command,8); 
  CS1;                     
}
void Write_1621(uchar addr,uchar sdata)
{ 
  addr&lt;&lt;=2; 
  CS0; 
  SendBit_1621(0xa0,3);     
  SendBit_1621(addr,6);     
  SendBit_1621(sdata,10);   
  CS1; 
} 
void HT1621_all_off(uchar num) 
{
  uchar i; 
  uchar addr=0; 
  for(i=0;i&lt;num;i++) 
  { 
    Write_1621(addr,0x00); 
    addr+=2; 
  } 
}

void Init_1621(void)
{
  SendCmd_1621(Sys_en);
  SendCmd_1621(RCosc);    
  SendCmd_1621(ComMode);  
  SendCmd_1621(LCD_on);
}    
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
   Serial.begin(9600);  //открыть порт
	pinMode(2, INPUT_PULLUP);
  pinMode(CS, OUTPUT); // 
  pinMode(WR, OUTPUT); // 
  pinMode(DATA, OUTPUT); //
  CS1;
  DATA1;
  WR1;
  delay(50);
  Init_1621();
  HT1621_all_off(16);
  delay(50);
   // set the motor speed to 30 RPM (360 PPS aprox.).
Write_1621( 32,buk[1]);
//Write_1621( 30,buk[1]);




  


}  

void loop(){
 
}

           </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[vladbuharkin20]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2352</uri>
			</author>
			<updated>2025-04-06T09:18:38Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=699&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Attiny10 + TM1637]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=690&amp;action=new" />
			<summary type="html"><![CDATA[<p>Плата Attiny10Core Arduino 1МГц</p><div class="codebox"><pre><code>  #include &lt;avr/io.h&gt;
  // TM1637 Macros
  #define TM1637_DIO_HIGH() (PORTB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_LOW() (PORTB &amp;= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_OUTPUT() (DDRB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_INPUT() (DDRB &amp;= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_READ() (((PINB &amp; _BV(TM1637_DIO_PIN)) &gt; 0) ? 1 : 0)
  #define TM1637_CLK_HIGH() (PORTB |= _BV(TM1637_CLK_PIN))
  #define TM1637_CLK_LOW() (PORTB &amp;= ~_BV(TM1637_CLK_PIN))
  
  
  // TM1637 Main Settings
  #define TM1637_DIO_PIN  PB0
  #define TM1637_CLK_PIN  PB1
  #define TM1637_BRIGHTNESS_MAX (7)
  #define TM1637_POSITION_MAX (4)
  
  // TM1637 commands
  #define TM1637_CMD_SET_DATA 0x40
  #define TM1637_CMD_SET_ADDR 0xC0
  #define TM1637_CMD_SET_DSIPLAY  0x80
  
  // TM1637 data settings (use bitwise OR to contruct complete command)
  #define TM1637_SET_DATA_WRITE 0x00 // write data to the display register
  #define TM1637_SET_DATA_READ  0x02 // read the key scan data
  #define TM1637_SET_DATA_A_ADDR  0x00 // automatic address increment
  #define TM1637_SET_DATA_F_ADDR  0x04 // fixed address
  #define TM1637_SET_DATA_M_NORM  0x00 // normal mode
  #define TM1637_SET_DATA_M_TEST  0x10 // test mode
  
  // TM1637 display control command set (use bitwise OR to consruct complete command)
  #define TM1637_SET_DISPLAY_OFF  0x00 // off
  #define TM1637_SET_DISPLAY_ON 0x08 // on
  
  static void TM1637_send_config(const uint8_t enable, const uint8_t brightness);
  static void TM1637_send_command(const uint8_t value);
  static void TM1637_start(void);
  static void TM1637_stop(void);
  static uint8_t TM1637_write_byte(uint8_t value);
  
  static uint8_t _config = TM1637_SET_DISPLAY_ON | TM1637_BRIGHTNESS_MAX;
  static uint8_t _segments = 0xff;
  
  
  void TM1637_init(const uint8_t enable, const uint8_t brightness);
  
  /**
  * Turn display on/off.
  * value: 1 - on, 0 - off
  */
  void TM1637_enable(const uint8_t value);
  
  /**
  * Set display brightness.
  * Min value: 0
  * Max value: 7
  */
  void TM1637_set_brightness(const uint8_t value);
  
  /**
  * Display raw segments at position (0x00..0x03)
  *
  * bits:
  * -- 0 --
  * | |
  * 5 1
  * | |
  * -- 6 --
  * | |
  * 4 2
  * | |
  * -- 3 --
  *
  * Example segment configurations:
  * - for character &#039;H&#039;, segments=0b01110110
  * - for character &#039;-&#039;, segments=0b01000000
  * - etc.
  */
  void TM1637_display_segments(const uint8_t position, const uint8_t segments);
  
  /**
  * Display digit (&#039;0&#039;..&#039;9&#039;) at position (0x00..0x03)
  */
  void TM1637_display_digit(const uint8_t position, const uint8_t digit);
  
  /**
  * Display colon on/off.
  * value: 1 - on, 0 - off
  */
  void TM1637_display_colon(const uint8_t value);
  
  /**
  * Clear all segments (including colon).
  */
  void TM1637_clear(void);
  
  
  PROGMEM const uint8_t _digit2segments[] =
  {
  0x3F, // 0
  0x06, // 1
  0x5B, // 2
  0x4F, // 3
  0x66, // 4
  0x6D, // 5
  0x7D, // 6
  0x07, // 7
  0x7F, // 8
  0x6F // 9
  };
  
 
  //  DELAY library CODE 
 inline void dly() { //пустая команда
  __asm__(&quot;NOP&quot;);
}

  void delay1sec(void)
  {
  
  asm volatile (
  &quot; ldi r18, 6&quot; &quot;\n&quot;
  &quot; ldi r19, 19&quot;  &quot;\n&quot;
  &quot; ldi r20, 174&quot; &quot;\n&quot;
  &quot;1: dec r20&quot;  &quot;\n&quot;
  &quot; brne 1b&quot;  &quot;\n&quot;
  &quot; dec r19&quot;  &quot;\n&quot;
  &quot; brne 1b&quot;  &quot;\n&quot;
  &quot; dec r18&quot;  &quot;\n&quot;
  &quot; brne 1b&quot;  &quot;\n&quot;
  &quot; rjmp 1f&quot;  &quot;\n&quot;
  &quot;1:&quot;  &quot;\n&quot;
  );
  };
  
  
  //  TM1637 library 
  
  void
  TM1637_init(const uint8_t enable, const uint8_t brightness)
  {
  
  DDRB |= (_BV(TM1637_DIO_PIN)|_BV(TM1637_CLK_PIN));
  PORTB &amp;= ~(_BV(TM1637_DIO_PIN)|_BV(TM1637_CLK_PIN));
  TM1637_send_config(enable, brightness);
  }
  
  void
  TM1637_enable(const uint8_t value)
  {
  
  TM1637_send_config(value, _config &amp; TM1637_BRIGHTNESS_MAX);
  }
  
  void
  TM1637_set_brightness(const uint8_t value)
  {
  
  TM1637_send_config(_config &amp; TM1637_SET_DISPLAY_ON,
  value &amp; TM1637_BRIGHTNESS_MAX);
  }
  
  void
  TM1637_display_segments(const uint8_t position, const uint8_t segments)
  {
  
  TM1637_send_command(TM1637_CMD_SET_DATA | TM1637_SET_DATA_F_ADDR);
  TM1637_start();
  TM1637_write_byte(TM1637_CMD_SET_ADDR | (position &amp; (TM1637_POSITION_MAX - 1)));
  TM1637_write_byte(segments);
  TM1637_stop();
  }
  
  void
  TM1637_display_digit(const uint8_t position, const uint8_t digit)
  {
  uint8_t segments = (digit &lt; 10 ? _digit2segments[(digit)]  : 0x00);
 // uint8_t segments = (digit &lt; 10 ? pgm_read_byte_near((uint8_t *)&amp;_digit2segments + digit) : 0x00);
  if (position == 0x01) {
  segments = segments | (_segments &amp; 0x00);//tochka 0x80
  _segments = segments;
  }
  
  TM1637_display_segments(position, segments);
  }
  
  void
  TM1637_display_colon(const uint8_t value)
  {
  if (value) {
  _segments |= 0x80;
  } else {
  _segments &amp;= ~0x80;
  }
  TM1637_display_segments(0x01, _segments);
  }
  
  void
  TM1637_clear(void)
  {
  uint8_t i;
  
  for (i = 0; i &lt; TM1637_POSITION_MAX; ++i) {
  TM1637_display_segments(i, 0x00);
  }
  }
  
  void
  TM1637_send_config(const uint8_t enable, const uint8_t brightness)
  {
  
  _config = (enable ? TM1637_SET_DISPLAY_ON : TM1637_SET_DISPLAY_OFF) |
  (brightness &gt; TM1637_BRIGHTNESS_MAX ? TM1637_BRIGHTNESS_MAX : brightness);
  
  TM1637_send_command(TM1637_CMD_SET_DSIPLAY | _config);
  }
  
  void
  TM1637_send_command(const uint8_t value)
  {
  
  TM1637_start();
  TM1637_write_byte(value);
  TM1637_stop();
  }
  
  void
  TM1637_start(void)
  {
  
  TM1637_DIO_HIGH();
  TM1637_CLK_HIGH();
  dly();
  TM1637_DIO_LOW();
  }
  
  void
  TM1637_stop(void)
  {
  
  TM1637_CLK_LOW();
   dly();
  TM1637_DIO_LOW();
   dly();
  TM1637_CLK_HIGH();
   dly();
  TM1637_DIO_HIGH();
  }
  
  uint8_t
  TM1637_write_byte(uint8_t value)
  {
  uint8_t i, ack;
  
  for (i = 0; i &lt; 8; ++i, value &gt;&gt;= 1) {
  TM1637_CLK_LOW();
   dly();
  if (value &amp; 0x01) {
  TM1637_DIO_HIGH();
  } else {
  TM1637_DIO_LOW();
  }
  
  TM1637_CLK_HIGH();
  dly();
  }
  
  TM1637_CLK_LOW();
  TM1637_DIO_INPUT();
  TM1637_DIO_HIGH();
   dly();
  ack = TM1637_DIO_READ();
  if (ack) {
  TM1637_DIO_OUTPUT();
  TM1637_DIO_LOW();
  }
   dly();
  TM1637_CLK_HIGH();
   dly();
  TM1637_CLK_LOW();
   dly();
  TM1637_DIO_OUTPUT();
  
  return ack;
  }
 
  int main(void)
  {
                      
          /* setup */
  TM1637_init(1/*enable*/, 1/*brightness*/);
  
 for(byte i=0;i&lt;5;i++){TM1637_display_segments(i,0b01000000);}
  // delay 1 for diagnostic
  delay1sec();

 
  while (1) {
  byte c; 
  c++;
 
  TM1637_display_digit(2, c/10%10);
  TM1637_display_digit(3, c%10); 
  TM1637_display_digit(1, c/100%10);
  TM1637_display_segments(0, 118);
  delay1sec();
 // for(byte i=0;i&lt;5;i++){ delay1sec();}//delay 5s.
   
  };
  
  }
  </code></pre></div><p>Вольтметр 5в. PB2 input.<br /></p><div class="codebox"><pre><code>  #include &lt;avr/io.h&gt;
  // TM1637 Macros
  #define TM1637_DIO_HIGH() (PORTB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_LOW() (PORTB &amp;= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_OUTPUT() (DDRB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_INPUT() (DDRB &amp;= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_READ() (((PINB &amp; _BV(TM1637_DIO_PIN)) &gt; 0) ? 1 : 0)
  #define TM1637_CLK_HIGH() (PORTB |= _BV(TM1637_CLK_PIN))
  #define TM1637_CLK_LOW() (PORTB &amp;= ~_BV(TM1637_CLK_PIN))
  
  
  // TM1637 Main Settings
  #define TM1637_DIO_PIN  PB0
  #define TM1637_CLK_PIN  PB1
  #define TM1637_BRIGHTNESS_MAX (7)
  #define TM1637_POSITION_MAX (4)
  
  // TM1637 commands
  #define TM1637_CMD_SET_DATA 0x40
  #define TM1637_CMD_SET_ADDR 0xC0
  #define TM1637_CMD_SET_DSIPLAY  0x80
  
  // TM1637 data settings (use bitwise OR to contruct complete command)
  #define TM1637_SET_DATA_WRITE 0x00 // write data to the display register
  #define TM1637_SET_DATA_READ  0x02 // read the key scan data
  #define TM1637_SET_DATA_A_ADDR  0x00 // automatic address increment
  #define TM1637_SET_DATA_F_ADDR  0x04 // fixed address
  #define TM1637_SET_DATA_M_NORM  0x00 // normal mode
  #define TM1637_SET_DATA_M_TEST  0x10 // test mode
  
  // TM1637 display control command set (use bitwise OR to consruct complete command)
  #define TM1637_SET_DISPLAY_OFF  0x00 // off
  #define TM1637_SET_DISPLAY_ON 0x08 // on
  
  static void TM1637_send_config(const uint8_t enable, const uint8_t brightness);
  static void TM1637_send_command(const uint8_t value);
  static void TM1637_start(void);
  static void TM1637_stop(void);
  static uint8_t TM1637_write_byte(uint8_t value);
  
  static uint8_t _config = TM1637_SET_DISPLAY_ON | TM1637_BRIGHTNESS_MAX;
  static uint8_t _segments = 0xff;
  
  
  void TM1637_init(const uint8_t enable, const uint8_t brightness);
  
  /**
  * Turn display on/off.
  * value: 1 - on, 0 - off
  */
  void TM1637_enable(const uint8_t value);
  
  /**
  * Set display brightness.
  * Min value: 0
  * Max value: 7
  */
  void TM1637_set_brightness(const uint8_t value);
  
  /**
  * Display raw segments at position (0x00..0x03)
  *
  * bits:
  * -- 0 --
  * | |
  * 5 1
  * | |
  * -- 6 --
  * | |
  * 4 2
  * | |
  * -- 3 --
  *
  * Example segment configurations:
  * - for character &#039;H&#039;, segments=0b01110110
  * - for character &#039;-&#039;, segments=0b01000000
  * - etc.
  */
  void TM1637_display_segments(const uint8_t position, const uint8_t segments);
  
  /**
  * Display digit (&#039;0&#039;..&#039;9&#039;) at position (0x00..0x03)
  */
  void TM1637_display_digit(const uint8_t position, const uint8_t digit);
  
  /**
  * Display colon on/off.
  * value: 1 - on, 0 - off
  */
  void TM1637_display_colon(const uint8_t value);
  
  /**
  * Clear all segments (including colon).
  */
  void TM1637_clear(void);
  
  
  PROGMEM const uint8_t _digit2segments[] =
  {
  0x3F, // 0
  0x06, // 1
  0x5B, // 2
  0x4F, // 3
  0x66, // 4
  0x6D, // 5
  0x7D, // 6
  0x07, // 7
  0x7F, // 8
  0x6F // 9
  };
  
 
  //  DELAY library CODE 
 inline void dly() { //пустая команда
  __asm__(&quot;NOP&quot;);
}

  void delay1sec(void)
  {
  
  asm volatile (
  &quot; ldi r18, 6&quot; &quot;\n&quot;
  &quot; ldi r19, 19&quot;  &quot;\n&quot;
  &quot; ldi r20, 174&quot; &quot;\n&quot;
  &quot;1: dec r20&quot;  &quot;\n&quot;
  &quot; brne 1b&quot;  &quot;\n&quot;
  &quot; dec r19&quot;  &quot;\n&quot;
  &quot; brne 1b&quot;  &quot;\n&quot;
  &quot; dec r18&quot;  &quot;\n&quot;
  &quot; brne 1b&quot;  &quot;\n&quot;
  &quot; rjmp 1f&quot;  &quot;\n&quot;
  &quot;1:&quot;  &quot;\n&quot;
  );
  };
  
  
  //  TM1637 library 
  
  void
  TM1637_init(const uint8_t enable, const uint8_t brightness)
  {
  
  DDRB |= (_BV(TM1637_DIO_PIN)|_BV(TM1637_CLK_PIN));
  PORTB &amp;= ~(_BV(TM1637_DIO_PIN)|_BV(TM1637_CLK_PIN));
  TM1637_send_config(enable, brightness);
  }
  
  void
  TM1637_enable(const uint8_t value)
  {
  
  TM1637_send_config(value, _config &amp; TM1637_BRIGHTNESS_MAX);
  }
  
  void
  TM1637_set_brightness(const uint8_t value)
  {
  
  TM1637_send_config(_config &amp; TM1637_SET_DISPLAY_ON,
  value &amp; TM1637_BRIGHTNESS_MAX);
  }
  
  void
  TM1637_display_segments(const uint8_t position, const uint8_t segments)
  {
  
  TM1637_send_command(TM1637_CMD_SET_DATA | TM1637_SET_DATA_F_ADDR);
  TM1637_start();
  TM1637_write_byte(TM1637_CMD_SET_ADDR | (position &amp; (TM1637_POSITION_MAX - 1)));
  TM1637_write_byte(segments);
  TM1637_stop();
  }
  
  void
  TM1637_display_digit(const uint8_t position, const uint8_t digit)
  {
  uint8_t segments = (digit &lt; 10 ? _digit2segments[(digit)]  : 0x00);
 // uint8_t segments = (digit &lt; 10 ? pgm_read_byte_near((uint8_t *)&amp;_digit2segments + digit) : 0x00);
  if (position == 0x01) {
  segments = segments | (_segments &amp; 0x00);//tochka 0x80
  _segments = segments;
  }
  
  TM1637_display_segments(position, segments);
  }
  
  void
  TM1637_display_colon(const uint8_t value)
  {
  if (value) {
  _segments |= 0x80;
  } else {
  _segments &amp;= ~0x80;
  }
  TM1637_display_segments(0x01, _segments);
  }
  
  void
  TM1637_clear(void)
  {
  uint8_t i;
  
  for (i = 0; i &lt; TM1637_POSITION_MAX; ++i) {
  TM1637_display_segments(i, 0x00);
  }
  }
  
  void
  TM1637_send_config(const uint8_t enable, const uint8_t brightness)
  {
  
  _config = (enable ? TM1637_SET_DISPLAY_ON : TM1637_SET_DISPLAY_OFF) |
  (brightness &gt; TM1637_BRIGHTNESS_MAX ? TM1637_BRIGHTNESS_MAX : brightness);
  
  TM1637_send_command(TM1637_CMD_SET_DSIPLAY | _config);
  }
  
  void
  TM1637_send_command(const uint8_t value)
  {
  
  TM1637_start();
  TM1637_write_byte(value);
  TM1637_stop();
  }
  
  void
  TM1637_start(void)
  {
  
  TM1637_DIO_HIGH();
  TM1637_CLK_HIGH();
  dly();
  TM1637_DIO_LOW();
  }
  
  void
  TM1637_stop(void)
  {
  
  TM1637_CLK_LOW();
   dly();
  TM1637_DIO_LOW();
   dly();
  TM1637_CLK_HIGH();
   dly();
  TM1637_DIO_HIGH();
  }
  
  uint8_t
  TM1637_write_byte(uint8_t value)
  {
  uint8_t i, ack;
  
  for (i = 0; i &lt; 8; ++i, value &gt;&gt;= 1) {
  TM1637_CLK_LOW();
   dly();
  if (value &amp; 0x01) {
  TM1637_DIO_HIGH();
  } else {
  TM1637_DIO_LOW();
  }
  
  TM1637_CLK_HIGH();
  dly();
  }
  
  TM1637_CLK_LOW();
  TM1637_DIO_INPUT();
  TM1637_DIO_HIGH();
   dly();
  ack = TM1637_DIO_READ();
  if (ack) {
  TM1637_DIO_OUTPUT();
  TM1637_DIO_LOW();
  }
   dly();
  TM1637_CLK_HIGH();
   dly();
  TM1637_CLK_LOW();
   dly();
  TM1637_DIO_OUTPUT();
  
  return ack;
  }

uint16_t VOLT;

  int main(void)
  {
  DDRB = 0&lt;&lt;DDB3;                  
          
  TM1637_init(1/*enable*/, 1/*brightness*/);
  
 for(byte i=0;i&lt;5;i++){TM1637_display_segments(i,0b01000000);}
  // delay 1 for diagnostic
  delay1sec();

 
  while (1) {
  PrepareADC(ADC2);
  ADCSRA |= (1&lt;&lt;ADSC); //  start reading
  while ((ADCSRA &amp; (1&lt;&lt;ADIF))==0);
  ADCSRA|=(1&lt;&lt;ADIF);   
  VOLT =(ADCL*50)/256;
 
  TM1637_display_digit(2,VOLT %10);
  TM1637_display_digit(3, VOLT%1); 
  TM1637_display_digit(1, VOLT/10%10);
  TM1637_display_segments(0, 62);
  delay1sec();
 // for(byte i=0;i&lt;5;i++){ delay1sec();}//delay 5s.
  
  
  };
  
  }
  void PrepareADC( uint8_t ADCF ) 
{
  PRR &amp;= ~(1&lt;&lt;PRADC); // ADC power enable
  ADMUX = ADCF;
  ADCSRB = 0;
  ADCSRA = (1&lt;&lt;ADEN) | (0&lt;&lt;ADATE) | (0&lt;&lt;ADIE) |   (0&lt;&lt;ADPS2) | (0&lt;&lt;ADPS1) | (0&lt;&lt;ADPS0); // ADC on, AutoTrigger off, Interrupt off, divider = 2
  dly();
}</code></pre></div><p>+ds18b20 . Работает не стабильно.<br /></p><div class="codebox"><pre><code>  #include &lt;avr/io.h&gt;
  // TM1637 Macros
  #define TM1637_DIO_HIGH() (PORTB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_LOW() (PORTB &amp;= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_OUTPUT() (DDRB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_INPUT() (DDRB &amp;= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_READ() (((PINB &amp; _BV(TM1637_DIO_PIN)) &gt; 0) ? 1 : 0)
  #define TM1637_CLK_HIGH() (PORTB |= _BV(TM1637_CLK_PIN))
  #define TM1637_CLK_LOW() (PORTB &amp;= ~_BV(TM1637_CLK_PIN))
  
  
  // TM1637 Main Settings
  #define TM1637_DIO_PIN  PB0
  #define TM1637_CLK_PIN  PB1
  #define TM1637_BRIGHTNESS_MAX (7)
  #define TM1637_POSITION_MAX (4)
  
  // TM1637 commands
  #define TM1637_CMD_SET_DATA 0x40
  #define TM1637_CMD_SET_ADDR 0xC0
  #define TM1637_CMD_SET_DSIPLAY  0x80
  
  // TM1637 data settings (use bitwise OR to contruct complete command)
  #define TM1637_SET_DATA_WRITE 0x00 // write data to the display register
  #define TM1637_SET_DATA_READ  0x02 // read the key scan data
  #define TM1637_SET_DATA_A_ADDR  0x00 // automatic address increment
  #define TM1637_SET_DATA_F_ADDR  0x04 // fixed address
  #define TM1637_SET_DATA_M_NORM  0x00 // normal mode
  #define TM1637_SET_DATA_M_TEST  0x10 // test mode
  
  // TM1637 display control command set (use bitwise OR to consruct complete command)
  #define TM1637_SET_DISPLAY_OFF  0x00 // off
  #define TM1637_SET_DISPLAY_ON 0x08 // on
  
  static void TM1637_send_config(const uint8_t enable, const uint8_t brightness);
  static void TM1637_send_command(const uint8_t value);
  static void TM1637_start(void);
  static void TM1637_stop(void);
  static uint8_t TM1637_write_byte(uint8_t value);
  
  static uint8_t _config = TM1637_SET_DISPLAY_ON | TM1637_BRIGHTNESS_MAX;
  static uint8_t _segments = 0xff;
  
  
  void TM1637_init(const uint8_t enable, const uint8_t brightness);
  
  /**
  * Turn display on/off.
  * value: 1 - on, 0 - off
  */
  void TM1637_enable(const uint8_t value);
  
  /**
  * Set display brightness.
  * Min value: 0
  * Max value: 7
  */
  void TM1637_set_brightness(const uint8_t value);
  
  /**
  * Display raw segments at position (0x00..0x03)
  *
  * bits:
  * -- 0 --
  * | |
  * 5 1
  * | |
  * -- 6 --
  * | |
  * 4 2
  * | |
  * -- 3 --
  *
  * Example segment configurations:
  * - for character &#039;H&#039;, segments=0b01110110
  * - for character &#039;-&#039;, segments=0b01000000
  * - etc.
  */
  void TM1637_display_segments(const uint8_t position, const uint8_t segments);
  
  /**
  * Display digit (&#039;0&#039;..&#039;9&#039;) at position (0x00..0x03)
  */
  void TM1637_display_digit(const uint8_t position, const uint8_t digit);
  
  /**
  * Display colon on/off.
  * value: 1 - on, 0 - off
  */
  void TM1637_display_colon(const uint8_t value);
  
  /**
  * Clear all segments (including colon).
  */
  void TM1637_clear(void);
  
  
  PROGMEM const uint8_t _digit2segments[] =
  {
  0x3F, // 0
  0x06, // 1
  0x5B, // 2
  0x4F, // 3
  0x66, // 4
  0x6D, // 5
  0x7D, // 6
  0x07, // 7
  0x7F, // 8
  0x6F // 9
  };
  
 
  //  DELAY library CODE 
 inline void dly() { //пустая команда
   asm volatile (
&quot;    rjmp 1f \n&quot;
&quot;1:  rjmp 2f  \n&quot;
&quot;2: \n&quot;
);
}

  void delay1sec(void)
  {
  
  asm volatile (
  &quot; ldi r18, 6&quot; &quot;\n&quot;
  &quot; ldi r19, 19&quot;  &quot;\n&quot;
  &quot; ldi r20, 174&quot; &quot;\n&quot;
  &quot;1: dec r20&quot;  &quot;\n&quot;
  &quot; brne 1b&quot;  &quot;\n&quot;
  &quot; dec r19&quot;  &quot;\n&quot;
  &quot; brne 1b&quot;  &quot;\n&quot;
  &quot; dec r18&quot;  &quot;\n&quot;
  &quot; brne 1b&quot;  &quot;\n&quot;
  &quot; rjmp 1f&quot;  &quot;\n&quot;
  &quot;1:&quot;  &quot;\n&quot;
  );
  };
  
  
  //  TM1637 library 
  
  void
  TM1637_init(const uint8_t enable, const uint8_t brightness)
  {
  
  DDRB |= (_BV(TM1637_DIO_PIN)|_BV(TM1637_CLK_PIN));
  PORTB &amp;= ~(_BV(TM1637_DIO_PIN)|_BV(TM1637_CLK_PIN));
  TM1637_send_config(enable, brightness);
  }
  
  void
  TM1637_enable(const uint8_t value)
  {
  
  TM1637_send_config(value, _config &amp; TM1637_BRIGHTNESS_MAX);
  }
  
  void
  TM1637_set_brightness(const uint8_t value)
  {
  
  TM1637_send_config(_config &amp; TM1637_SET_DISPLAY_ON,
  value &amp; TM1637_BRIGHTNESS_MAX);
  }
  
  void
  TM1637_display_segments(const uint8_t position, const uint8_t segments)
  {
  
  TM1637_send_command(TM1637_CMD_SET_DATA | TM1637_SET_DATA_F_ADDR);
  TM1637_start();
  TM1637_write_byte(TM1637_CMD_SET_ADDR | (position &amp; (TM1637_POSITION_MAX - 1)));
  TM1637_write_byte(segments);
  TM1637_stop();
  }
  
  void
  TM1637_display_digit(const uint8_t position, const uint8_t digit)
  {
  uint8_t segments = (digit &lt; 10 ? _digit2segments[(digit)]  : 0x00);
 // uint8_t segments = (digit &lt; 10 ? pgm_read_byte_near((uint8_t *)&amp;_digit2segments + digit) : 0x00);
  if (position == 0x01) {
  segments = segments | (_segments &amp; 0x00);//tochka 0x80
  _segments = segments;
  }
  
  TM1637_display_segments(position, segments);
  }
  
  void
  TM1637_display_colon(const uint8_t value)
  {
  if (value) {
  _segments |= 0x80;
  } else {
  _segments &amp;= ~0x80;
  }
  TM1637_display_segments(0x01, _segments);
  }
  
  void
  TM1637_clear(void)
  {
  uint8_t i;
  
  for (i = 0; i &lt; TM1637_POSITION_MAX; ++i) {
  TM1637_display_segments(i, 0x00);
  }
  }
  
  void
  TM1637_send_config(const uint8_t enable, const uint8_t brightness)
  {
  
  _config = (enable ? TM1637_SET_DISPLAY_ON : TM1637_SET_DISPLAY_OFF) |
  (brightness &gt; TM1637_BRIGHTNESS_MAX ? TM1637_BRIGHTNESS_MAX : brightness);
  
  TM1637_send_command(TM1637_CMD_SET_DSIPLAY | _config);
  }
  
  void
  TM1637_send_command(const uint8_t value)
  {
  
  TM1637_start();
  TM1637_write_byte(value);
  TM1637_stop();
  }
  
  void
  TM1637_start(void)
  {
  
  TM1637_DIO_HIGH();
  TM1637_CLK_HIGH();
  dly();
  TM1637_DIO_LOW();
  }
  
  void
  TM1637_stop(void)
  {
  
  TM1637_CLK_LOW();
   dly();
  TM1637_DIO_LOW();
   dly();
  TM1637_CLK_HIGH();
   dly();
  TM1637_DIO_HIGH();
  }
  
  uint8_t
  TM1637_write_byte(uint8_t value)
  {
  uint8_t i, ack;
  
  for (i = 0; i &lt; 8; ++i, value &gt;&gt;= 1) {
  TM1637_CLK_LOW();
   dly();
  if (value &amp; 0x01) {
  TM1637_DIO_HIGH();
  } else {
  TM1637_DIO_LOW();
  }
  
  TM1637_CLK_HIGH();
  dly();
  }
  
  TM1637_CLK_LOW();
  TM1637_DIO_INPUT();
  TM1637_DIO_HIGH();
   dly();
  ack = TM1637_DIO_READ();
  if (ack) {
  TM1637_DIO_OUTPUT();
  TM1637_DIO_LOW();
  }
   dly();
  TM1637_CLK_HIGH();
   dly();
  TM1637_CLK_LOW();
   dly();
  TM1637_DIO_OUTPUT();
  
  return ack;
  }

int temp;
#define OUT 2 // PB2
  int main(void)
  {
    ACSR ^= ~_BV(ACIE);//comparator off
    ACSR |= ACD;           
    PRR |= (1&lt;&lt;PRADC);// ADC off    
  TM1637_init(1/*enable*/, 1/*brightness*/);
  
 for(byte i=0;i&lt;5;i++){TM1637_display_segments(i,0b01000000);}
  // delay 1 for diagnostic
  delay1sec();

 
  while (1) {
  temp=read_temp();
 
  TM1637_display_digit(1,temp /10%10);
  TM1637_display_digit(2, temp%10); 
  TM1637_display_digit(0, temp/100%10);
  TM1637_display_segments(3, 99);
  delay1sec();
 // for(byte i=0;i&lt;5;i++){ delay1sec();}//delay 5s.
  
  
  };
  }
 /////////////////////

// reset
uint8_t therm_reset(){
    uint8_t i;
    PORTB &amp;= ~(1 &lt;&lt; OUT);
    DDRB |= (1 &lt;&lt; OUT);
 asm volatile (
&quot;    ldi  r18, 160 \n&quot;
&quot;1:  dec  r18 \n&quot;
&quot;    brne 1b  \n&quot;
);


    //delayMicroseconds(480);  
    DDRB &amp;= ~(1 &lt;&lt; OUT);
  asm volatile (
&quot;    ldi  r18, 20  \n&quot;
&quot;1:  dec  r18 \n&quot;
&quot;    brne 1b  \n&quot;
);
  
   // delayMicroseconds(60);
    i=((PINB &gt;&gt; OUT) &amp; 1);
    asm volatile (
&quot;    ldi  r18, 140  \n&quot;
&quot;1:  dec  r18 \n&quot;
&quot;    brne 1b  \n&quot;
);

   // delayMicroseconds(420);
    return i;
}
// write bit
void therm_write_bit(uint8_t bit){
    PORTB &amp;= ~(1 &lt;&lt; OUT);
    DDRB |= (1 &lt;&lt; OUT);
    asm volatile (
&quot;    nop  \n&quot;
);

  //  delayMicroseconds(1);
    if(bit) DDRB &amp;= ~(1 &lt;&lt; OUT);
    asm volatile (
&quot;    ldi  r18, 20  \n&quot;
&quot;1:  dec  r18 \n&quot;
&quot;    brne 1b  \n&quot;
);  
   // 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);
       asm volatile (
&quot;    nop  \n&quot;
);
   // delayMicroseconds(1);
    DDRB &amp;= ~(1 &lt;&lt; OUT);
    asm volatile (
&quot;    ldi  r18, 4  \n&quot;
&quot;1:  dec  r18 \n&quot;
&quot;    brne 1b  \n&quot;
&quot;    rjmp 1f  \n&quot;
&quot;1: \n&quot;
);

   // delayMicroseconds(14);
    if(PINB &amp; (1 &lt;&lt; OUT)) bit=1;
    asm volatile (
&quot;    ldi  r18, 15  \n&quot;
&quot;1:  dec  r18 \n&quot;
&quot;    brne 1b  \n&quot;
);
  //  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];
    float 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><p>+DHT11<br /></p><div class="codebox"><pre><code>  #define DHT_PIN PB2
  byte data_dht[5];
  
  // TM1637 Macros
  #define TM1637_DIO_HIGH() (PORTB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_LOW() (PORTB &amp;= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_OUTPUT() (DDRB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_INPUT() (DDRB &amp;= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_READ() (((PINB &amp; _BV(TM1637_DIO_PIN)) &gt; 0) ? 1 : 0)
  #define TM1637_CLK_HIGH() (PORTB |= _BV(TM1637_CLK_PIN))
  #define TM1637_CLK_LOW() (PORTB &amp;= ~_BV(TM1637_CLK_PIN))
  
  
  // TM1637 Main Settings
  #define TM1637_DIO_PIN  PB0
  #define TM1637_CLK_PIN  PB1
  #define TM1637_BRIGHTNESS_MAX (7)
  #define TM1637_POSITION_MAX (4)
  
  // TM1637 commands
  #define TM1637_CMD_SET_DATA 0x40
  #define TM1637_CMD_SET_ADDR 0xC0
  #define TM1637_CMD_SET_DSIPLAY  0x80
  
  // TM1637 data settings (use bitwise OR to contruct complete command)
  #define TM1637_SET_DATA_WRITE 0x00 // write data to the display register
  #define TM1637_SET_DATA_READ  0x02 // read the key scan data
  #define TM1637_SET_DATA_A_ADDR  0x00 // automatic address increment
  #define TM1637_SET_DATA_F_ADDR  0x04 // fixed address
  #define TM1637_SET_DATA_M_NORM  0x00 // normal mode
  #define TM1637_SET_DATA_M_TEST  0x10 // test mode
  
  // TM1637 display control command set (use bitwise OR to consruct complete command)
  #define TM1637_SET_DISPLAY_OFF  0x00 // off
  #define TM1637_SET_DISPLAY_ON 0x08 // on
  
  static void TM1637_send_config(const uint8_t enable, const uint8_t brightness);
  static void TM1637_send_command(const uint8_t value);
  static void TM1637_start(void);
  static void TM1637_stop(void);
  static uint8_t TM1637_write_byte(uint8_t value);
  
  static uint8_t _config = TM1637_SET_DISPLAY_ON | TM1637_BRIGHTNESS_MAX;
  static uint8_t _segments = 0xff;
  
  
  
  
  /**
  * Initialize TM1637 display driver.
  * Clock pin (TM1637_CLK_PIN) and data pin (TM1637_DIO_PIN)
  * are defined at the top of this file.
  */
  void TM1637_init(const uint8_t enable, const uint8_t brightness);
  
  /**
  * Turn display on/off.
  * value: 1 - on, 0 - off
  */
  void TM1637_enable(const uint8_t value);
  
  /**
  * Set display brightness.
  * Min value: 0
  * Max value: 7
  */
  void TM1637_set_brightness(const uint8_t value);
  
  /**
  * Display raw segments at position (0x00..0x03)
  *
  * bits:
  * -- 0 --
  * | |
  * 5 1
  * | |
  * -- 6 --
  * | |
  * 4 2
  * | |
  * -- 3 --
  *
  * Example segment configurations:
  * - for character &#039;H&#039;, segments=0b01110110
  * - for character &#039;-&#039;, segments=0b01000000
  * - etc.
  */
  void TM1637_display_segments(const uint8_t position, const uint8_t segments);
  
  /**
  * Display digit (&#039;0&#039;..&#039;9&#039;) at position (0x00..0x03)
  */
  void TM1637_display_digit(const uint8_t position, const uint8_t digit);
  
  /**
  * Display colon on/off.
  * value: 1 - on, 0 - off
  */
  void TM1637_display_colon(const uint8_t value);
  
  /**
  * Clear all segments (including colon).
  */
  void TM1637_clear(void);
  
  
  PROGMEM const uint8_t _digit2segments[] =
  {
  0x3F, // 0
  0x06, // 1
  0x5B, // 2
  0x4F, // 3
  0x66, // 4
  0x6D, // 5
  0x7D, // 6
  0x07, // 7
  0x7F, // 8
  0x6F // 9
  };
  
  void delay1sec(void)
  {
  // Generated by delay loop calculator
  // at http://www.bretmulvey.com/avrdelay.html
  //
  // Delay 1 000 000 cycles
  // 1s at 1 MHz
  
  asm volatile (
  &quot; ldi r18, 6&quot; &quot;\n&quot;
  &quot; ldi r19, 19&quot;  &quot;\n&quot;
  &quot; ldi r20, 174&quot; &quot;\n&quot;
  &quot;1: dec r20&quot;  &quot;\n&quot;
  &quot; brne 1b&quot;  &quot;\n&quot;
  &quot; dec r19&quot;  &quot;\n&quot;
  &quot; brne 1b&quot;  &quot;\n&quot;
  &quot; dec r18&quot;  &quot;\n&quot;
  &quot; brne 1b&quot;  &quot;\n&quot;
  &quot; rjmp 1f&quot;  &quot;\n&quot;
  &quot;1:&quot;  &quot;\n&quot;
  );
  };
  
  
  
  // -------------------------------------------------------------------------------------------------------
  // ---------------------------------------- TM1637 library CODE ------------------------------------------
  // -------------------------------------------------------------------------------------------------------
  
  
  void
  TM1637_init(const uint8_t enable, const uint8_t brightness)
  {
  
  DDRB |= (_BV(TM1637_DIO_PIN)|_BV(TM1637_CLK_PIN));
  PORTB &amp;= ~(_BV(TM1637_DIO_PIN)|_BV(TM1637_CLK_PIN));
  TM1637_send_config(enable, brightness);
  }
  
  void
  TM1637_enable(const uint8_t value)
  {
  
  TM1637_send_config(value, _config &amp; TM1637_BRIGHTNESS_MAX);
  }
  
  void
  TM1637_set_brightness(const uint8_t value)
  {
  
  TM1637_send_config(_config &amp; TM1637_SET_DISPLAY_ON,
  value &amp; TM1637_BRIGHTNESS_MAX);
  }
  
  void
  TM1637_display_segments(const uint8_t position, const uint8_t segments)
  {
  
  TM1637_send_command(TM1637_CMD_SET_DATA | TM1637_SET_DATA_F_ADDR);
  TM1637_start();
  TM1637_write_byte(TM1637_CMD_SET_ADDR | (position &amp; (TM1637_POSITION_MAX - 1)));
  TM1637_write_byte(segments);
  TM1637_stop();
  }
  
  void
  TM1637_display_digit(const uint8_t position, const uint8_t digit)
  {
  uint8_t segments = (digit &lt; 10 ? _digit2segments[(digit)]  : 0x00);
  
  if (position == 0x01) {
  segments = segments | (_segments &amp; 0x00);//0x80
  _segments = segments;
  }
  
  TM1637_display_segments(position, segments);
  }
  
  void
  TM1637_display_colon(const uint8_t value)
  {
  if (value) {
  _segments |= 0x80;
  } else {
  _segments &amp;= ~0x80;
  }
  TM1637_display_segments(0x01, _segments);
  }
  
  void
  TM1637_clear(void)
  {
  uint8_t i;
  
  for (i = 0; i &lt; TM1637_POSITION_MAX; ++i) {
  TM1637_display_segments(i, 0x00);
  }
  }
  
  void
  TM1637_send_config(const uint8_t enable, const uint8_t brightness)
  {
  
  _config = (enable ? TM1637_SET_DISPLAY_ON : TM1637_SET_DISPLAY_OFF) |
  (brightness &gt; TM1637_BRIGHTNESS_MAX ? TM1637_BRIGHTNESS_MAX : brightness);
  
  TM1637_send_command(TM1637_CMD_SET_DSIPLAY | _config);
  }
  
  void
  TM1637_send_command(const uint8_t value)
  {
  
  TM1637_start();
  TM1637_write_byte(value);
  TM1637_stop();
  }
  
  void
  TM1637_start(void)
  {
  
  TM1637_DIO_HIGH();
  TM1637_CLK_HIGH();
  asm volatile (
&quot;    rjmp 1f  \n&quot;
&quot;1:  rjmp 2f  \n&quot;
&quot;2: \n&quot;
);
  TM1637_DIO_LOW();
  }
  
  void
  TM1637_stop(void)
  {
  
  TM1637_CLK_LOW();
  asm volatile (
&quot;    rjmp 1f  \n&quot;
&quot;1:  rjmp 2f  \n&quot;
&quot;2: \n&quot;
);
  TM1637_DIO_LOW();
  asm volatile (
&quot;    rjmp 1f  \n&quot;
&quot;1:  rjmp 2f  \n&quot;
&quot;2: \n&quot;
);
  TM1637_CLK_HIGH();
 asm volatile (
&quot;    rjmp 1f \n&quot;
&quot;1:  rjmp 2f  \n&quot;
&quot;2: \n&quot;
);
  TM1637_DIO_HIGH();
  }
  
  uint8_t
  TM1637_write_byte(uint8_t value)
  {
  uint8_t i, ack;
  
  for (i = 0; i &lt; 8; ++i, value &gt;&gt;= 1) {
  TM1637_CLK_LOW();
  asm volatile (
&quot;    rjmp 1f  \n&quot;
&quot;1:  rjmp 2f  \n&quot;
&quot;2: \n&quot;
);
  if (value &amp; 0x01) {
  TM1637_DIO_HIGH();
  } else {
  TM1637_DIO_LOW();
  }
  
  TM1637_CLK_HIGH();
  asm volatile (
&quot;    rjmp 1f  \n&quot;
&quot;1:  rjmp 2f  \n&quot;
&quot;2: \n&quot;
);
  }
  
  TM1637_CLK_LOW();
  TM1637_DIO_INPUT();
  TM1637_DIO_HIGH();
 asm volatile (
&quot;    rjmp 1f \n&quot;
&quot;1:  rjmp 2f  \n&quot;
&quot;2: \n&quot;
);
  ack = TM1637_DIO_READ();
  if (ack) {
  TM1637_DIO_OUTPUT();
  TM1637_DIO_LOW();
  }
 asm volatile (
&quot;    rjmp 1f \n&quot;
&quot;1:  rjmp 2f  \n&quot;
&quot;2: \n&quot;
);
  TM1637_CLK_HIGH();
  asm volatile (
&quot;    rjmp 1f  \n&quot;
&quot;1:  rjmp 2f  \n&quot;
&quot;2: \n&quot;
);
  TM1637_CLK_LOW();
  asm volatile (
&quot;    rjmp 1f  \n&quot;
&quot;1:  rjmp 2f  \n&quot;
&quot;2: \n&quot;
);
  TM1637_DIO_OUTPUT();
  
  return ack;
  }
  
  int main(void)
  {
  uint8_t firstdig, seconddig;
    ACSR ^= ~_BV(ACIE);//comparator off
    ACSR |= ACD;           
    PRR |= (1&lt;&lt;PRADC);// ADC off  
  
  // delay 1 for startup
  delay1sec();
  
  /* setup */
  TM1637_init(1/*enable*/, 1/*brightness*/);
  
  /// display zeros at start - self check
  TM1637_display_digit(0, 0);
  TM1637_display_digit(1, 0);
  TM1637_display_digit(2, 0);
  TM1637_display_digit(3, 0);
  
  // delay 1 for diagnostic
  delay1sec();
  
  
  /* setup */
 
  
  
  /* Beginning of neverending loop */
  while (1) {
  
  
 dht_read();
byte h = data_dht[0];
byte t = data_dht[2];
  
  TM1637_display_segments(2, 99);
  TM1637_display_segments(3, 57);
  
  firstdig = t / 10;
  seconddig = t % 10;
  
  
  TM1637_display_digit(0, firstdig);
  TM1637_display_digit(1, seconddig);
  
  
  delay1sec();
 
  

  
 
  TM1637_display_segments(2, 92);
  TM1637_display_segments(3, 118);
  
  firstdig = h / 10;
  seconddig = h % 10;
 
  TM1637_display_digit(0, firstdig);
  TM1637_display_digit(1, seconddig);
  
  delay1sec();
  
  };
 
  }
  
  int dht_read(){
        byte ii = 0,i1 = 0;  
        for(ii = 0;ii &lt; 5;ii++){data_dht[ii] = 0;}                  
        DDRB |=(1 &lt;&lt; DHT_PIN); 
        PORTB &amp;= ~(1 &lt;&lt; DHT_PIN); 
        asm volatile (
&quot;    ldi  r18, 24  \n&quot;
&quot;    ldi  r19, 95 \n&quot;
&quot;1:  dec  r19 \n&quot;
&quot;    brne 1b  \n&quot;
&quot;    dec  r18 \n&quot;
&quot;    brne 1b  \n&quot;
&quot;    rjmp 1f  \n&quot;
&quot;1: \n&quot;
);

        //delay(18); 
        PORTB |= (1 &lt;&lt; DHT_PIN);
asm volatile (
&quot;    ldi  r18, 13  \n&quot;
&quot;1:  dec  r18 \n&quot;
&quot;    brne 1b  \n&quot;
&quot;    nop  \n&quot;
);
        
       // delayMicroseconds(40); 
        DDRB &amp;= ~(1 &lt;&lt; DHT_PIN);
asm volatile (
&quot;    ldi  r18, 26  \n&quot;
&quot;1:  dec  r18 \n&quot;
&quot;    brne 1b  \n&quot;
&quot;    rjmp 1f  \n&quot;
&quot;1: \n&quot;
);
        
         
       // delayMicroseconds(80); 
    while(PINB &amp; (1 &lt;&lt; DHT_PIN));
      for (ii = 0; ii &lt; 5; ii++){
        data_dht[ii]=0;
      for (i1=0; i1&lt;8; i1++){
    while(!(PINB &amp; (1 &lt;&lt; DHT_PIN)));
asm volatile (
&quot;    ldi  r18, 10  \n&quot;
&quot;1:  dec  r18 \n&quot;
&quot;    brne 1b  \n&quot;
);
      
        //delayMicroseconds(30);
      if (PINB &amp; (1 &lt;&lt; DHT_PIN)){data_dht[ii] |= 1 &lt;&lt; (7-i1);}
    while(PINB &amp; (1 &lt;&lt; DHT_PIN));  
}}return 1;}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[klause]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2004</uri>
			</author>
			<updated>2025-01-16T07:10:09Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=690&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[oled 1.3 sh1106 + Attiny]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=671&amp;action=new" />
			<summary type="html"><![CDATA[<p>установить подтягивающие резисторы 4.7 кОм на шину I2C</p><div class="codebox"><pre><code>#include &lt;avr/io.h&gt;
#include &lt;util/delay.h&gt;
 
#define I2C_SDA         PB3                   
#define I2C_SCL         PB4     

long ttt;
 
#define I2C_SDA_HIGH()  DDRB &amp;= ~(1&lt;&lt;I2C_SDA) 
#define I2C_SDA_LOW()   DDRB |=  (1&lt;&lt;I2C_SDA) 
#define I2C_SCL_HIGH()  DDRB &amp;= ~(1&lt;&lt;I2C_SCL) 
#define I2C_SCL_LOW()   DDRB |=  (1&lt;&lt;I2C_SCL) 
 
const char Message1[] PROGMEM = &quot;RCL-RADIO.RU&quot;;
const char Message2[] PROGMEM = &quot;ABCDEFGH&quot;;

 
int main(void) {
  OLED_init();                           
  OLED_clear(); 
 
  while(1) { 
    ttt++;
    OLED_cursor(0, 0);                  
    OLED_printP(Message1);
    OLED_cursor(0, 2);                  
    OLED_num(ttt/100000);OLED_num(ttt/10000%10);OLED_num(ttt/1000%10);OLED_num(ttt/100%10);OLED_num(ttt/10%10);OLED_num(ttt%10);
    OLED_cursor(0, 4);                  
    OLED_printP(Message2); 
    OLED_cursor(0, 7);                  
    OLED_printP(Message2);  
    _delay_ms(1000);
 //   OLED_clear();                   
}}
 
///// I2C ///////////////////////////////////////////////////////
void I2C_init(void) {DDRB  &amp;= ~((1&lt;&lt;I2C_SDA)|(1&lt;&lt;I2C_SCL)); PORTB &amp;= ~((1&lt;&lt;I2C_SDA)|(1&lt;&lt;I2C_SCL));}
void I2C_write(uint8_t data) {
  for(uint8_t i = 8; i; i--) {I2C_SDA_LOW();                        
    if (data &amp; 0x80) I2C_SDA_HIGH();I2C_SCL_HIGH();data&lt;&lt;=1;I2C_SCL_LOW();}
  I2C_SDA_HIGH();I2C_SCL_HIGH();asm(&quot;nop&quot;);I2C_SCL_LOW();                         
}
void I2C_start(uint8_t addr) {I2C_SDA_LOW();I2C_SCL_LOW();I2C_write(addr);}
void I2C_stop(void) {I2C_SDA_LOW();I2C_SCL_HIGH();I2C_SDA_HIGH();}
 
///// OLED ///////////////////////////////////
#define OLED_ADDR       0x78                  
#define OLED_CMD_MODE   0x00                  
#define OLED_DAT_MODE   0x40                  
#define OLED_INIT_LEN   13                 
 
// OLED init settings
const uint8_t OLED_INIT_CMD[] PROGMEM = {0xA8,0x3F,0x81,0xff,0xA1,0xC0,0xC8,0xDA,0x12,0xD3,0x00,0x40,0xAF};
 
// Standard ASCII 5x8 font (adapted from Neven Boyanov and Stephen Denne)
const uint8_t OLED_FONT[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, //   0  
  0x00, 0x1c, 0x22, 0x41, 0x00, // ( 8 
  0x00, 0x41, 0x22, 0x1c, 0x00, // ) 9 
  0x14, 0x08, 0x3E, 0x08, 0x14, // * 10
  0x08, 0x08, 0x3E, 0x08, 0x08, // + 11
  0x00, 0x00, 0xA0, 0x60, 0x00, // , 12
  0x08, 0x08, 0x08, 0x08, 0x08, // - 13
  0x00, 0x60, 0x60, 0x00, 0x00, // . 14
  0x20, 0x10, 0x08, 0x04, 0x02, // / 15
  0x3E, 0x51, 0x49, 0x45, 0x3E, // 0 16
  0x00, 0x42, 0x7F, 0x40, 0x00, // 1 17
  0x42, 0x61, 0x51, 0x49, 0x46, // 2 18
  0x21, 0x41, 0x45, 0x4B, 0x31, // 3 19
  0x18, 0x14, 0x12, 0x7F, 0x10, // 4 20
  0x27, 0x45, 0x45, 0x45, 0x39, // 5 21
  0x3C, 0x4A, 0x49, 0x49, 0x30, // 6 22
  0x01, 0x71, 0x09, 0x05, 0x03, // 7 23
  0x36, 0x49, 0x49, 0x49, 0x36, // 8 24
  0x06, 0x49, 0x49, 0x29, 0x1E, // 9 25
  0x00, 0x36, 0x36, 0x00, 0x00, // : 26
  0x00, 0x56, 0x36, 0x00, 0x00, // ; 27
  0x08, 0x14, 0x22, 0x41, 0x00, // &lt; 28
  0x14, 0x14, 0x14, 0x14, 0x14, // = 29
  0x00, 0x41, 0x22, 0x14, 0x08, // &gt; 30
  0x02, 0x01, 0x51, 0x09, 0x06, // ? 31
  0x32, 0x49, 0x59, 0x51, 0x3E, // @ 32
  0x7C, 0x12, 0x11, 0x12, 0x7C, // A 33
  0x7F, 0x49, 0x49, 0x49, 0x36, // B 34
  0x3E, 0x41, 0x41, 0x41, 0x22, // C 35
  0x7F, 0x41, 0x41, 0x22, 0x1C, // D 36
  0x7F, 0x49, 0x49, 0x49, 0x41, // E 37
  0x7F, 0x09, 0x09, 0x09, 0x01, // F 38
  0x3E, 0x41, 0x49, 0x49, 0x7A, // G 39
  0x7F, 0x08, 0x08, 0x08, 0x7F, // H 40
  0x00, 0x41, 0x7F, 0x41, 0x00, // I 41
  0x20, 0x40, 0x41, 0x3F, 0x01, // J 42
  0x7F, 0x08, 0x14, 0x22, 0x41, // K 43
  0x7F, 0x40, 0x40, 0x40, 0x40, // L 44
  0x7F, 0x02, 0x0C, 0x02, 0x7F, // M 45
  0x7F, 0x04, 0x08, 0x10, 0x7F, // N 46
  0x3E, 0x41, 0x41, 0x41, 0x3E, // O 47
  0x7F, 0x09, 0x09, 0x09, 0x06, // P 48
  0x3E, 0x41, 0x51, 0x21, 0x5E, // Q 49
  0x7F, 0x09, 0x19, 0x29, 0x46, // R 50
  0x46, 0x49, 0x49, 0x49, 0x31, // S 51
  0x01, 0x01, 0x7F, 0x01, 0x01, // T 52
  0x3F, 0x40, 0x40, 0x40, 0x3F, // U 53
  0x1F, 0x20, 0x40, 0x20, 0x1F, // V 54
  0x3F, 0x40, 0x38, 0x40, 0x3F, // W 55
  0x63, 0x14, 0x08, 0x14, 0x63, // X 56
  0x07, 0x08, 0x70, 0x08, 0x07, // Y 57
  0x61, 0x51, 0x49, 0x45, 0x43, // Z 58
};
 
void OLED_init(void) {
  I2C_init();                             
  I2C_start(OLED_ADDR);                   
  I2C_write(OLED_CMD_MODE);               
  for (uint8_t i = 0; i &lt; OLED_INIT_LEN; i++) I2C_write(pgm_read_byte(&amp;OLED_INIT_CMD[i])); 
  I2C_stop();                            
}
 
void OLED_printC(char ch) {
  uint16_t offset = ch - 32 -7;              
  offset += offset &lt;&lt; 2;                  
  I2C_write(0x00);                       
  for(uint8_t i=5; i; i--) I2C_write(pgm_read_byte(&amp;OLED_FONT[offset++])); 
}
 
void OLED_printP(const char* p) {
  I2C_start(OLED_ADDR);                   
  I2C_write(OLED_DAT_MODE);               
  char ch = pgm_read_byte(p);            
  while (ch != 0){OLED_printC(ch);ch = pgm_read_byte(++p);}
  I2C_stop();                   
}
 
void OLED_cursor(uint8_t xpos, uint8_t ypos) {
  I2C_start(OLED_ADDR);                   
  I2C_write(OLED_CMD_MODE);             
  I2C_write(xpos+1 &amp; 0x0F);                 
  I2C_write(0x10 | (xpos &gt;&gt; 4));     
  I2C_write(0xB0 | (ypos &amp; 0x07));    
  I2C_stop();                           
}
 
void OLED_clear(void) {
  for(uint16_t b=0;b&lt;8;b++){
  OLED_cursor(0, b);                      
  I2C_start(OLED_ADDR);                   
  I2C_write(OLED_DAT_MODE);              
  for(uint16_t i=129; i; i--) I2C_write(0x00); 
  I2C_stop(); 
  } 
}
 
void OLED_num(byte num){
  I2C_start(OLED_ADDR);                 
  I2C_write(OLED_DAT_MODE);    
  OLED_printC(num+48); 
  I2C_stop();    
  }
 </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2024-09-23T08:11:21Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=671&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Динамический экран на 74HC595]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=641&amp;action=new" />
			<summary type="html"><![CDATA[<p>Добрый день, сделал я мини экранчик на 3-ех разрядном 7 сегментном индикаторе на регистре сдвига 74HC595. Экран у меня с общим катодом, нашёл на ютубе пример для вывода на него информации, всё прекрасно выводится. Но столкнулся с проблемой, а именно в коде нет функции вывода точек на нужных разрядах. В комментариях к видео автор рассказал как сделать данный вывод, но в реализации него у меня возникли сложности<br />Сам код(немного я его подкорректировал, и убрал лишнее)<br /></p><div class="codebox"><pre><code>#include &lt;MsTimer2.h&gt;
uint8_t digital_OK[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0b00000001};   
#define clockPin        6                                                   
#define dataPin         4                                                  
#define latchPin        5                                                    
#define pinBeginStrob   8                                                     //  номер пина для подключения строба (разряда) первого индиеатора
#define pinEndStrob     11                                                     //  номер пина для подключения строба (разряда) последнего индиеатора
#define numberDigits    4                                                     //  количество разрядов индикатора (до 8-ми)
#define durationPause   10                                                     //  длительность паузы (мсек)
#define maxCount        10000                                             //  максимально возможное число счёта

uint8_t mass[numberDigits];                                                   //  буфер данных индикатора
uint32_t count = 0;
uint32_t num;
bool    modeStrob = false;                                                   
bool    typeDigit = true;                                                     

void setup()
{
  Serial.begin(9600);
  pinMode(clockPin, OUTPUT);                                                  
  pinMode(dataPin, OUTPUT);                                                  
  pinMode(latchPin, OUTPUT);                                                  
  digitalWrite(latchPin, HIGH);                                               
  for (uint8_t i = pinBeginStrob;i &lt;= pinEndStrob;i ++)
  {
    pinMode(i, OUTPUT);
    digitalWrite(i, HIGH);
  }
  MsTimer2::set(2, timerInterrupt);                                            
  MsTimer2::start();                                                           
}

void loop()
{
  num= millis()/1000;
  count = num*10;                                                                  
 
  convert(count, mass);
  Serial.println(count);                                                       
  delay(durationPause);                                                       
}

void  timerInterrupt()
{
static uint8_t index = 0;
  for (uint8_t i = pinBeginStrob;i &lt;= pinEndStrob;i ++)
{
digitalWrite(i, HIGH);
  }
  digitalWrite(latchPin, LOW);                                                
  shiftOut(dataPin, clockPin, MSBFIRST, mass[index]);                        
  digitalWrite(latchPin, HIGH);                                            
digitalWrite(index + pinBeginStrob, LOW);
  index ++;
  if (index == numberDigits) index = 0;
}


void convert(uint32_t value, uint8_t *m)
{
  for (uint8_t i = 0;i &lt; numberDigits;i ++)
  {
 *(m + i) = digital_OK[value %10];
    value /= 10;
  }
}</code></pre></div><p>Видео автора кода <div class="fancy_video_tag_player"><iframe class="youtube-player" type="text/html" width="640" height="385" src="https://www.youtube.com/embed/1ZIBmk0YxGs" frameborder="0"></iframe></div><br />Комментарий,как реализовать вывод точки на экран <span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2024/05/8760de43cbb508a24e36fa7f9c3c166f.png" alt="http://forum.rcl-radio.ru/uploads/images/2024/05/8760de43cbb508a24e36fa7f9c3c166f.png" /></span></p>]]></summary>
			<author>
				<name><![CDATA[vladbuharkin20]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2352</uri>
			</author>
			<updated>2024-05-16T19:27:55Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=641&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[управление драйвером жк lc75823]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=627&amp;action=new" />
			<summary type="html"><![CDATA[<p>Добрый день, имеется панелька от магнитолы с жк драйвером lc75823. Хотелось бы создать на его остове-дисплей для вывода на него информации. В интернете есть пример управления(от автора Jose Luis Monteiro. Ссылку прикреплю ниже). Я уже определил расположение каждого сегмента на моем жк, и записал их. Основываясь на этих знания хотелось бы создать скетч или же библиотеку для управления и написания текста на дисплей.</p><p>пример Jose Luis Monteiro <div class="fancy_video_tag_player"><iframe class="youtube-player" type="text/html" width="640" height="385" src="https://www.youtube.com/embed/YGfzQpoSFbQ" frameborder="0"></iframe></div></p><p>мой тестовый скетч<span class="attention-yellow"></span> </p><p>сегменты определял и подписывал по этой схеме<span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2024/03/c55ff2a153cd278f90a323469c1f79c5.png" alt="http://forum.rcl-radio.ru/uploads/images/2024/03/c55ff2a153cd278f90a323469c1f79c5.png" /></span></p>]]></summary>
			<author>
				<name><![CDATA[vladbuharkin20]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2352</uri>
			</author>
			<updated>2024-03-18T14:06:21Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=627&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Attiny4313&bme280]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=626&amp;action=new" />
			<summary type="html"><![CDATA[<p>Попытался подключить модуль bme280(bmp280). Индикатор на MAx7219.Выводится через 3с температура,давление,влажность. Плата AttinyCore. <br /></p><div class="codebox"><pre><code>#include &lt;Wire.h&gt;
#include &quot;TinyBME280.h&quot;
#define DIN PD3 // нога1
#define CS  PD4 // нога12
#define CLK PD5 // нога13
int const sda = PB5;//pin 17 
int const scl = PB7;//pin 19  

void setup() {
  // Set up BME280
  Wire.begin();
  BME280setI2Caddress(0x76);
  BME280setup();
  DDRD |= (1 &lt;&lt; DIN) | (1 &lt;&lt; CS) | (1 &lt;&lt; CLK);
  PORTD |= (1 &lt;&lt; CS);
  PORTD &amp;= ~(1 &lt;&lt; CLK) | (1 &lt;&lt; DIN);
  delay(1);

  WriteBit16(0x0f,0x00); // Тест выкл.
  WriteBit16(0x0C,0x01); // Вкл. индик.
  WriteBit16(0x0B,0x04); // кол-во разрядов
  WriteBit16(0x09,0xFF); // Дешифраторы вкл.
  WriteBit16(0x0A,0x0f); // яркость
}
void loop () {

int t = BME280temperature();
int p = BME280pressure()/10;
int h = BME280humidity();
delay(3000);
  WriteBit16(0x01,t/1000);
  WriteBit16(0x02,((t /100)% 10)|128);
  WriteBit16(0x03,(t/10)%10);
  WriteBit16(0x04,t%10);
  delay(3000);
  WriteBit16(0x01,p/1000);
  WriteBit16(0x02,(p /100)% 10);
  WriteBit16(0x03,((p/10)%10)|128);
  WriteBit16(0x04,p%10);
  delay(3000);
  WriteBit16(0x01,h/1000);
 WriteBit16(0x02,((h /100)% 10)|128);
  WriteBit16(0x03,(h/10)%10);
  WriteBit16(0x04,h%10);
  delay(3000);
  
}
void WriteBit16(byte reg, byte data)
{  
     PORTD &amp;= ~(1 &lt;&lt; CLK);PORTD &amp;= ~(1 &lt;&lt; CS);
     for(int i = 7; i &gt;= 0; i--){
        if(((reg &gt;&gt; i) &amp; 1) == 1){PORTD |= (1 &lt;&lt; DIN);}else{PORTD &amp;= ~(1 &lt;&lt; DIN);}
        PORTD |=(1 &lt;&lt; CLK);PORTD &amp;= ~(1 &lt;&lt; CLK);
        }
     for(int i = 7; i &gt;= 0; i--){
        if(((data &gt;&gt; i) &amp; 1) == 1){PORTD |= (1 &lt;&lt; DIN);}else{PORTD &amp;= ~(1 &lt;&lt; DIN);}
        PORTD |=(1 &lt;&lt; CLK);PORTD &amp;= ~(1 &lt;&lt; CLK);
        }
     PORTD |=(1 &lt;&lt; CS);PORTD &amp;= ~(1 &lt;&lt; CLK);PORTD &amp;= ~(1 &lt;&lt; DIN);
  }  </code></pre></div><p><span class="attention-yellow"></span></p>]]></summary>
			<author>
				<name><![CDATA[klause]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2004</uri>
			</author>
			<updated>2024-03-15T10:42:40Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=626&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[LGT8F328 КОМПАРАТОР]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=624&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=131706">http://rcl-radio.ru/?p=131706</a></p><div class="codebox"><pre><code>void setup() {
  Serial.begin(9600);
  C0SR = 0;C0XR=0;
  C0XR |=(1&lt;&lt;C0OE); // C0OE[7] = 1, выход компаратора AC0 для внешнего порта PD2

  // ВЫБОР ИНВЕРСНОГО ВХОДА
  ADCSRB = 0b01000000;// ADMUX
  /*
  CME01[7] CME00[6] Источник входного сигнала AC0
  0        0        ACXN
  0        1        ADMUX
  1        0        DFFO
  */
 
  ADMUX = 0b00000000; // CHMUX[3:0] = 0000 Источник входного сигнала PC0 (A0)

  // ВЫБОР НЕИНВЕРСНОГО ВХОДА
  C0SR &amp;=~(1&lt;&lt;C0BG);C0XR &amp;=~(1&lt;&lt;C0PS0);
  /*
  C0BG C0PS0 Источник входного сигнала AC0
  0    0     AC0P
  0    1     ACXP
  1    0     DAO
  */
}

void loop() {
 Serial.println((C0SR &gt;&gt; 5) &amp; 1, BIN);
 delay(1000);
}</code></pre></div><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2024/03/81e7e8fbfcd5d1cd0469e479d4396814.png" alt="http://forum.rcl-radio.ru/uploads/images/2024/03/81e7e8fbfcd5d1cd0469e479d4396814.png" /></span></p>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2024-03-12T08:39:43Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=624&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[ATtiny45 ADC]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=520&amp;action=new" />
			<summary type="html"><![CDATA[<p>Single Ended Input</p><p>Voltage Reference VCC</p><div class="codebox"><pre><code>#define CLK  PB2 // TM1637
#define DIO  PB1 // TM1637

// PB4 INPUT

void setup(){
cli();
 ADMUX |= (1 &lt;&lt; MUX1);
 ADCSRA |= (1&lt;&lt;ADEN)|(1 &lt;&lt; ADATE)|(1&lt;&lt;ADSC)|(1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0);
sei();
}

void loop(){
  long u=0;
  for(int n=0;n&lt;10;n++){
    while((ADCSRA &amp; (1 &lt;&lt; ADIF)) == 0);
     int u_data = (ADCL|ADCH &lt;&lt; 8);
     u += u_data;delay(100);
     }
     
     u=u/10;
     tm_print(500*u/1023,1,5);
  }

void tm_dec(byte dig){
       for(byte i = 0; i &lt; 8; i++) {
         DDRB |= (1 &lt;&lt; CLK);del();
       if (dig &amp; 0x01)
         DDRB &amp;= ~(1 &lt;&lt; DIO);
       else
         DDRB |= (1 &lt;&lt; DIO);del();
         DDRB &amp;= ~(1 &lt;&lt; CLK);del();
         dig = dig &gt;&gt; 1;
  }
         DDRB |= (1 &lt;&lt; CLK);
         DDRB &amp;= ~(1 &lt;&lt; DIO);del();
         DDRB &amp;= ~(1 &lt;&lt; CLK);del();
 
       if (((PINB &gt;&gt; DIO) &amp; 1) == 0)
         DDRB |= (1 &lt;&lt; DIO);del();
         DDRB |= (1 &lt;&lt; CLK);del();
  }  
 
void tm_stop(){
         DDRB |= (1 &lt;&lt; DIO);del();
         DDRB &amp;= ~(1 &lt;&lt; CLK);del();
         DDRB &amp;= ~(1 &lt;&lt; DIO);del();
  }  
 
void tm_start(){
         DDRB |= (1 &lt;&lt; DIO);del();
  }
 
void tm_print(int t, bool pd_t, byte br){
        tm_start();tm_dec(0b10001000 + br);
        tm_dec(0x40);tm_stop();tm_start();
 
        int data0 =10;
        int data1 = t / 100 % 10;
        int data2 = t / 10 % 10;
        int data3 = t % 10;
 
      for(byte n = 0; n &lt; 4; n++){
        int data;
      switch(n){
        case 0: data = data0;break;
        case 1: data = data1;break;
        case 2: data = data2;break;
        case 3: data = data3;break;
        }  
 
      switch(data){    // XGFEDCBA
        case 0:  data = 0b00111111;break;     // 0
        case 1:  data = 0b00000110;break;     // 1
        case 2:  data = 0b01011011;break;     // 2
        case 3:  data = 0b01001111;break;     // 3
        case 4:  data = 0b01100110;break;     // 4
        case 5:  data = 0b01101101;break;     // 5
        case 6:  data = 0b01111101;break;     // 6
        case 7:  data = 0b00000111;break;     // 7
        case 8:  data = 0b01111111;break;     // 8
        case 9:  data = 0b01101111;break;     // 9
        case 10: data = 0b00000000;break;     // пусто
        }
        if(n == 0){data0 = data;}
        if(n == 1){data1 = data;}
        if(n == 2){data2 = data;}
        if(n == 3){data3 = data;}
        }
      if(pd_t==1){data1 = data1+0b10000000;}
      tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}  
 
void del(){delay(1);} </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2022-10-14T07:17:51Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=520&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[ATtiny45 timer1]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=519&amp;action=new" />
			<summary type="html"><![CDATA[<p>CTC</p><div class="codebox"><pre><code>void setup(){
DDRB |= (1 &lt;&lt; PB0); 
PORTB |= (1 &lt;&lt; PB0); 
cli();
OCR1A = 243; // 0...255 8bit
TCCR1 |= (1 &lt;&lt; CTC1);   // CTC mode
TCCR1 |= (1 &lt;&lt; CS13)|(1 &lt;&lt; CS12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10);// Prescaler 16384
TIMSK |= (1 &lt;&lt; OCIE1A);
// (8000000/((243+1)16384))=2,00115266 Hz
sei();
}

void loop(){}

ISR(TIM1_COMPA_vect) { 
  PORTB ^= (1 &lt;&lt; PB0);
}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2022-10-11T04:22:55Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=519&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Atmega88 + IR]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=484&amp;action=new" />
			<summary type="html"><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/03/dbeb764172faabdd21bec74b8e8fc995.png" alt="http://forum.rcl-radio.ru/uploads/images/2022/03/dbeb764172faabdd21bec74b8e8fc995.png" /></span> </p><br /><div class="codebox"><pre><code>#define IR_IN PC3

#include &lt;avr/io.h&gt;
#include &lt;util/delay.h&gt;
#include &lt;Wire_low.h&gt;         // http://forum.rcl-radio.ru/viewtopic.php?pid=5521#p5521
#include &lt;Lcd1602_i2c_low.h&gt;  // http://rcl-radio.ru/wp-content/uploads/2022/03/Lcd1602_i2c_low.zip
Lcd1602_i2c_low lcd(0x27);// адрес I2C

bool data[96],st,st1,raz;
uint32_t cod;
byte i1,i2,s;
unsigned long data_ir;

int main(){
  wire_set(12000000,100000); // тактовая частота контроллера, частота шины I2C
  lcd.setInit();
  lcd.Clear(); // очистка экрана
  lcd.led(1);  // включение и отключение подсветки экрана
  ////////// TIMER_1
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
// (12000000/((6749+1)x1)) = 562.5 mks
  OCR1A = 6749;
  TCCR1B |= (1 &lt;&lt; WGM12);
// Prescaler 1
  TCCR1B |= (1 &lt;&lt; CS10);
  TIMSK1 |= (1 &lt;&lt; OCIE1A);  
  sei();
  
  
while(1){  
    lcd.Curs(0,0);
    lcd.PrintString(&quot;IR_CODE&quot;);
 if(raz==1){
    lcd.Clear();
    data_ir = IR();
    String stringVar = String(data_ir, HEX);
    char charVar[10];
    stringVar.toCharArray(charVar, 10);
    lcd.Curs(1,0);
    lcd.PrintString(charVar);
    _delay_ms(200);
    }
    
  }}

ISR(TIMER1_COMPA_vect){
     if(((PINC &gt;&gt; IR_IN) &amp; 1)==0&amp;&amp;st==0&amp;&amp;raz==0){st=1;OCR1A = 6749;}
     if(st==1){s++;}
     if(s&gt;20&amp;&amp;((PINC &gt;&gt; IR_IN) &amp; 1)==0){st1=1;}   
     if(st1==1){data[i1]=((PINC &gt;&gt; IR_IN) &amp; 1);i1++;} 
     if(i1&gt;96){i1=0;s=0;st=0;raz=1;st1=0;TCCR1B &amp;= ~(1 &lt;&lt; CS10); }
     }

uint32_t IR(){
 _delay_ms(100);
 cod=0;i2=0;
 for(int ai=0;ai&lt;96;ai++){
   if(data[ai] + data[ai+2] == 2){cod += ((uint32_t)0 &lt;&lt; 31-i2);i2++;ai=ai+1;}
   if(data[ai] + data[ai+2] == 1){cod += ((uint32_t)1 &lt;&lt; 31-i2);i2++;ai=ai+3;}}
 raz=0;
 TCCR1B |= (1 &lt;&lt; CS10);OCR1A = 239;//50000 kHz
 if(cod==1||cod&gt;0x7fffffff){cod=0xFFFFFFFF;}
 return cod;}       </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2022-03-19T15:03:17Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=484&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[ATtiny 2313 timer]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=440&amp;action=new" />
			<summary type="html"><![CDATA[<p>20 Mhz</p><p>timer1</p><div class="codebox"><pre><code> byte i = 0;

void setup() {
 DDRB |=(1&lt;&lt;PB7);
 PORTB &amp;=~(1&lt;&lt;PB7);
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
// (20000000/((2499+1)x8))=1000 Hz
  OCR1A = 2499;
  TCCR1B |= (1 &lt;&lt; WGM12);
// Prescaler 8
  TCCR1B |= (1 &lt;&lt; CS11);
  TIMSK |= (1 &lt;&lt; OCIE1A);
  sei();
}

void loop(){}

ISR(TIMER1_COMPA_vect){
  if(i==0)PORTB &amp;=~(1&lt;&lt;PB7);
  if(i==1)PORTB |=(1&lt;&lt;PB7);
  i++;
  if(i&gt;1)i=0;      
  }</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2022-01-11T08:40:28Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=440&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Atmega8 timer]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=439&amp;action=new" />
			<summary type="html"><![CDATA[<p>TIMER 1<br />4 MHz</p><div class="codebox"><pre><code>bool led_stat    = true;

void setup() {
    pinMode(13, OUTPUT);
  digitalWrite(13, LOW); 
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
// (4000000/((15624+1)x256))=1 Hz
  OCR1A = 15624;
  TCCR1B |= (1 &lt;&lt; WGM12);
// Prescaler 256
  TCCR1B |= (1 &lt;&lt; CS12);
  TIMSK |= (1 &lt;&lt; OCIE1A);
  sei();
}

void loop(){}

ISR(TIMER1_COMPA_vect){
  digitalWrite(13, led_stat); 
       led_stat = !led_stat;
  }</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2022-01-10T04:24:46Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=439&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[lcd1602+I2C + DS3231 + 18b20]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=429&amp;action=new" />
			<summary type="html"><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/12/3c339a0191dd6861b2aacbefcc0b03a9.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/12/3c339a0191dd6861b2aacbefcc0b03a9.png" /></span> <br /><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/12/a8537a836f7fd66826c678b222bab15f.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/12/a8537a836f7fd66826c678b222bab15f.png" /></span> </p><p>d10 - вход 18b20</p><div class="codebox"><pre><code>#include &lt;avr/io.h&gt;
#include &lt;util/delay.h&gt;

#define ADDR_DS3231    0b1101000
#define ADDR_1602      0x27

#define CPU_F   16000000 // Clock Speed 
#define SCL_F   100000 // // I2C Speed
/// uart init /////
#define BAUD 9600 // USART Speed
#define RS      0
#define E       2
#define LED     3


 byte led_b,init_t;
 byte d1,d2,d3,d4,d5,d6,e1,e2,e3;
 int a[6],x;
 int t_dig;
 byte sec,min,hour,datat,mont,year,day;
 unsigned long i,times,times0;
 bool w;


int main(){
   TWBR = (((CPU_F)/(SCL_F)-16 )/2) ;
   TWSR = 0;
   USART_Init(CPU_F/16/BAUD-1); 
  // set_time(21,1,12,26,18,45,0);// год 00-99, ДН 1-7 (1=ВС), месяц 1-12, дата 1-31, час 0-23, минуты 0-59, секунды 0-59
   lcdInit();
   i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;LED)); // включаем подсветку
   lcdWrite(0, 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07);
   lcdWrite(8, 0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00);      
   lcdWrite(16,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F);
   lcdWrite(24,0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F);
   lcdWrite(32,0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0x1C);
   lcdWrite(40,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C);
   lcdWrite(48,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07);
   lcdWrite(56,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00);
   cli();
   TCCR1A = 0;
   TCCR1B = 0;
   TCNT1 = 0;
   OCR1A = 6249;
   TCCR1B |= (1 &lt;&lt; WGM12);
   TCCR1B |= (1 &lt;&lt; CS12);
   TIMSK1 |= (1 &lt;&lt; OCIE1A);
   sei();
   
   while (1) { 

   sec =  (i2c_read_1bit(ADDR_DS3231,0) &amp; 0x0F) + (((i2c_read_1bit(ADDR_DS3231,0) &amp; 0x70) &gt;&gt; 4) * 10);
   min =  (i2c_read_1bit(ADDR_DS3231,1) &amp; 0x0F) + (((i2c_read_1bit(ADDR_DS3231,1) &amp; 0x70) &gt;&gt; 4) * 10);
   hour = ((i2c_read_1bit(ADDR_DS3231,2) &amp; 0x0F) + ((i2c_read_1bit(ADDR_DS3231,2) &amp; 0x70) &gt;&gt; 4) * 10);
   day =  (i2c_read_1bit(ADDR_DS3231,3) &amp; 0x0F);
   datat = ((i2c_read_1bit(ADDR_DS3231,4) &amp; 0x0F) + ((i2c_read_1bit(ADDR_DS3231,4) &amp; 0x70) &gt;&gt; 4) * 10);
   mont = ((i2c_read_1bit(ADDR_DS3231,5) &amp; 0x0F) + ((i2c_read_1bit(ADDR_DS3231,5) &amp; 0x70) &gt;&gt; 4) * 10);
   year = ((i2c_read_1bit(ADDR_DS3231,6) &amp; 0x0F) + ((i2c_read_1bit(ADDR_DS3231,6) &amp; 0x70) &gt;&gt; 4) * 10);
// temper = (i2c_read_1bit(ADDR_DS3231,0x11)*100 + ((i2c_read_1bit(ADDR_DS3231,0x12) &amp; 0b11000000) &gt;&gt; 6)*25) ;

  
  USART_int(hour);USART_String(&quot;:&quot;);
  USART_int(min);USART_String(&quot;:&quot;);
  USART_int(sec);USART_String(&quot; &quot;);
  USART_int(datat);USART_String(&quot;-&quot;);
  USART_int(mont);USART_String(&quot;-&quot;);
  USART_int(year);USART_String(&quot; &quot;);
  USART_int(day);USART_String(&quot; &quot;);
  USART_String(&quot;\n&quot;);
  
  if(i-times&gt;30){t_dig = read_temp();times=i;}
  if(i-times0&lt;30){
     a[0]=t_dig/100;
     a[1]=t_dig/10%10;
     a[2]=t_dig%10;
   for(x=0;x&lt;3;x++){
    switch(x){
        case 0: e1=2;e2=3,e3=4;break;
        case 1: e1=5,e2=6,e3=7;break;
        case 2: e1=9,e2=10,e3=11;break;

  }digit();
  lcdCurs(1,8);lcdChar(0x2e);lcdCurs(1,12);lcdChar(0xdf);lcdChar(0x43);}
  }
 if(i-times0&gt;=30&amp;&amp;i-times0&lt;100){
     a[0]=hour/10;
     a[1]=hour%10;
     a[2]=min/10;
     a[3]=min%10;
   for(x=0;x&lt;4;x++){
    switch(x){
        case 0: e1=0;e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;break;
  }digit();
  lcdCurs(0,6);lcdChar(0x2e);lcdCurs(1,6);lcdChar(0x2e);lcdCurs(1,13);lcdChar(20);lcdCurs(1,14);lcdChar(sec/10+&#039;0&#039;);lcdChar(sec%10+&#039;0&#039;);}
 }
 if(i-times0&gt;=100){times0=i; lcdClear();}
  

    
}}// END

ISR(TIMER1_COMPA_vect){i++;}

void digit(){
  switch(a[x]){
    case 0: d1=0,d2=7,d3=5,d4=0,d5=2,d6=5;break;
    case 1: d1=32,d2=1,d3=5,d4=32,d5=32,d6=5;break;
    case 2: d1=1,d2=7,d3=5,d4=0,d5=3,d6=4;break;
    case 3: d1=1,d2=3,d3=5,d4=6,d5=2,d6=5;break;
    case 4: d1=0,d2=2,d3=5,d4=32,d5=32,d6=5;break;
    case 5: d1=0,d2=3,d3=4,d4=6,d5=2,d6=5;break;
    case 6: d1=0,d2=3,d3=4,d4=0,d5=2,d6=5;break;
    case 7: d1=0,d2=7,d3=5,d4=32,d5=32,d6=5;break;
    case 8: d1=0,d2=3,d3=5,d4=0,d5=2,d6=5;break;
    case 9: d1=0,d2=3,d3=5,d4=6,d5=2,d6=5;break;
    case 10:d1=150,d2=150,d3=150,d4=150,d5=150,d6=150;break;}
    lcdCurs(0,e1);lcdChar(d1);
    lcdCurs(0,e2);lcdChar(d2);
    lcdCurs(0,e3);lcdChar(d3);
    lcdCurs(1,e1);lcdChar(d4);
    lcdCurs(1,e2);lcdChar(d5);
    lcdCurs(1,e3);lcdChar(d6);
}   


void lcdSend(bool rs, byte data) {
    cli();
    if(rs==0){led_b |= (1&lt;&lt;RS);} else {led_b &amp;= ~(1&lt;&lt;RS);}//RS
 
    _delay_us(1);
    if(((data &gt;&gt; 7) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;7));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;7));}
    if(((data &gt;&gt; 6) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;6));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;6));}
    if(((data &gt;&gt; 5) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;5));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;5));}
    if(((data &gt;&gt; 4) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;4));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;4));}
    e_pin();
    if(((data &gt;&gt; 3) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;7));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;7));}
    if(((data &gt;&gt; 2) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;6));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;6));}
    if(((data &gt;&gt; 1) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;5));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;5));}
    if(((data &gt;&gt; 0) &amp; 1) ==1){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;4));} else {i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;4));}
    e_pin();
    sei();
}
 
void lcdInit(){ 
    lcd(0x03);_delay_us(4500);
    lcd(0x03);_delay_us(4500);
    lcd(0x03);_delay_us(200);
    lcd(0b00000010);_delay_ms(5);
    lcd(0b00001100);_delay_ms(5);
    lcdClear();
  } 
 
void lcdClear(){lcd(0b00000001);} 
void lcdString(const char* str) {while(*str != &#039;\0&#039;) {_delay_us(1);lcdChar(*str);str++;}}
void lcd(uint8_t sett) {lcdSend(true, sett);}
void lcdChar(const char chr) {lcdSend(false, (uint8_t)chr);}
void e_pin(){i2c_write_1bit(ADDR_1602,led_b |= (1&lt;&lt;E));_delay_us(1);i2c_write_1bit(ADDR_1602,led_b &amp;= ~(1&lt;&lt;E));}
void lcdWrite(byte addr_w, byte wr1,byte wr2,byte wr3,byte wr4,byte wr5,byte wr6,byte wr7,byte wr8){
     lcd(0b01000000|addr_w);lcdChar(wr1);lcdChar(wr2);lcdChar(wr3);lcdChar(wr4);lcdChar(wr5);lcdChar(wr6);lcdChar(wr7);lcdChar(wr8);}
 
 
void lcdCurs(byte str, byte mesto){
  if(str==0){lcd(0b10000000+mesto);}
  if(str==1){lcd(0b11000000+mesto);}
  }  


int i2c_read_i2c_2bit(byte i2c_addr, byte i2c_reg){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
 
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT))); 
   TWDR = (i2c_addr &lt;&lt; 1) | 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
 
   TWCR=(1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWEA); 
  while(~TWCR&amp;(1&lt;&lt;TWINT));
   int i2c_data0 = TWDR; 
 
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while(~TWCR&amp;(1&lt;&lt;TWINT));
  int i2c_data1 = TWDR; 
 
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
  int i2c_data = (i2c_data0&lt;&lt;8)+i2c_data1;
  return i2c_data;
  }  

int i2c_read_1bit(byte i2c_addr, byte i2c_reg){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
 
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT))); 
   TWDR = (i2c_addr &lt;&lt; 1) | 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
 
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWEA); 
  while(~TWCR&amp;(1&lt;&lt;TWINT));
    byte i2c_data = TWDR; 
  TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
 
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
  return i2c_data;
  }   

 void i2c_write(byte i2c_addr, byte i2c_reg, byte i2c_dat){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_dat;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
  } 

 void i2c_write_1bit(byte i2c_addr, byte i2c_reg){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
  }   

void set_time(byte years, byte days, byte monts, byte datas, byte hours ,byte minute, byte second){
    if(second &lt; 255){i2c_write(ADDR_DS3231,0x00,(second/10&lt;&lt;4)+second%10);}
    if(minute &lt; 255){i2c_write(ADDR_DS3231,0x01,(minute/10&lt;&lt;4)+minute%10);} 
    if(hours &lt; 255){i2c_write(ADDR_DS3231,0x02,(hours/10&lt;&lt;4)+hours%10);}
    if(days &lt; 255){i2c_write(ADDR_DS3231,0x03,days);}
    if(datas &lt; 255){i2c_write(ADDR_DS3231,0x04,(datas/10&lt;&lt;4)+datas%10);}
    if(monts &lt; 255){i2c_write(ADDR_DS3231,0x05,(monts/10&lt;&lt;4)+monts%10);}
    if(years &lt; 255){i2c_write(ADDR_DS3231,0x06,(years/10&lt;&lt;4)+years%10);}
  }    

void USART_Init( unsigned int ubrr ){
  UBRR0H = (unsigned char)(ubrr&gt;&gt;8);
  UBRR0L = (unsigned char)ubrr;
  UCSR0B = (1&lt;&lt;RXEN0)|(1&lt;&lt;TXEN0);
  UCSR0C = (1&lt;&lt;USBS0)|(3&lt;&lt;UCSZ00);
}  

void USART_String(char *data){
  for(int i=0;i&lt;strlen(data);i++){
  while(!( UCSR0A &amp; (1 &lt;&lt; UDRE0 )));
  UDR0 = data[i];}
}

void USART_int(int to_int){
  String stringVar = String(to_int, DEC);
  char charVar[sizeof(stringVar)];
  stringVar.toCharArray(charVar, sizeof(charVar));
  USART_String(charVar);} 

// reset
uint8_t therm_reset(){
    uint8_t i;
    PORTB &amp;= ~(1 &lt;&lt; PB2);
    DDRB |= (1 &lt;&lt; PB2);
    _delay_us(480);  
    DDRB &amp;= ~(1 &lt;&lt; PB2);
    _delay_us(60);
    i=((PINB &gt;&gt; PB2) &amp; 1);
    _delay_us(420);
    return i;
}
// write bit
void therm_write_bit(uint8_t bit){
    PORTB &amp;= ~(1 &lt;&lt; PB2);
    DDRB |= (1 &lt;&lt; PB2);
    _delay_us(1);
    if(bit) DDRB &amp;= ~(1 &lt;&lt; PB2);
    _delay_us(60);
    DDRB &amp;= ~(1 &lt;&lt; PB2);
}
// read bit
uint8_t therm_read_bit(void){
    uint8_t bit=0;
    PORTB &amp;= ~(1 &lt;&lt; PB2);
    DDRB |= (1 &lt;&lt; PB2);
    _delay_us(1);
    DDRB &amp;= ~(1 &lt;&lt; PB2);
    _delay_us(14);
    if(PINB &amp; (1 &lt;&lt; PB2)) bit=1;
    _delay_us(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];
    float 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])/1.60;
    return (int)temper;
}  </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2021-12-26T16:05:47Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=429&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[lcd1602 спецсимволы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=416&amp;action=new" />
			<summary type="html"><![CDATA[<div class="codebox"><pre><code>//LCD1602 NANO = RS D2,E D3,D4 D4,D5 D5,D6 D6,D7 D7

void setup(){
  lcdInit();
  lcdWrite(0, 0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000);
  lcdWrite(8, 0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000);
  lcdWrite(16, 0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000);
  
  }

void loop(){
   lcdCurs(0,0);
  // lcdString(&quot;Volume&quot;);
   lcdChar(2);
   
  delay(1000);
  }

void lcdSend(bool rs, byte data) {
    if(rs==0){PORTD |= (1 &lt;&lt; 2);} else{PORTD &amp;= ~(1 &lt;&lt; 2);}//RS
    del();
    if(((data &gt;&gt; 7) &amp; 1) ==1) PORTD |= (1 &lt;&lt; 7); else PORTD &amp;= ~(1 &lt;&lt; 7);
    if(((data &gt;&gt; 6) &amp; 1) ==1) PORTD |= (1 &lt;&lt; 6); else PORTD &amp;= ~(1 &lt;&lt; 6);
    if(((data &gt;&gt; 5) &amp; 1) ==1) PORTD |= (1 &lt;&lt; 5); else PORTD &amp;= ~(1 &lt;&lt; 5);
    if(((data &gt;&gt; 4) &amp; 1) ==1) PORTD |= (1 &lt;&lt; 4); else PORTD &amp;= ~(1 &lt;&lt; 4);
    e_pin();
    if(((data &gt;&gt; 3) &amp; 1) ==1) PORTD |= (1 &lt;&lt; 7); else PORTD &amp;= ~(1 &lt;&lt; 7);
    if(((data &gt;&gt; 2) &amp; 1) ==1) PORTD |= (1 &lt;&lt; 6); else PORTD &amp;= ~(1 &lt;&lt; 6);
    if(((data &gt;&gt; 1) &amp; 1) ==1) PORTD |= (1 &lt;&lt; 5); else PORTD &amp;= ~(1 &lt;&lt; 5);
    if(((data &gt;&gt; 0) &amp; 1) ==1) PORTD |= (1 &lt;&lt; 4); else PORTD &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(){delay(1);}
void e_pin(){PORTD |= (1 &lt;&lt; 3);del();PORTD &amp;= ~(1 &lt;&lt; 3);}
void lcdCurs(byte str, byte mesto){
  if(str==0){lcd(0b10000000+mesto);}
  if(str==1){lcd(0b11000000+mesto);}
  }
void lcdInit(){ 
    DDRD |= (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(4500);
    lcd(0x03);delayMicroseconds(200);
 
    lcd(0b00000010);del();
    lcd(0b00001100);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(0b00000001);}   

void lcdWrite(byte addr_w, byte wr1,byte wr2,byte wr3,byte wr4,byte wr5,byte wr6,byte wr7,byte wr8){
  lcd(0b01000000|addr_w);
  lcdChar(wr1);lcdChar(wr2);lcdChar(wr3);lcdChar(wr4);lcdChar(wr5);lcdChar(wr6);lcdChar(wr7);lcdChar(wr8);
  }</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2021-08-12T09:53:03Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=416&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Энкодер]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=404&amp;action=new" />
			<summary type="html"><![CDATA[<div class="codebox"><pre><code>#include &lt;Encoder.h&gt;           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip  
#include &lt;MsTimer2.h&gt;          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 

Encoder myEnc(8, 9);// DT, CLK

unsigned long oldPosition  = -999,newPosition;
int x;

void setup(){
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  Serial.begin(9600);
  }

void loop(){
   if (newPosition != oldPosition){oldPosition = newPosition;x=x+newPosition;myEnc.write(0);newPosition=0;}
   Serial.println(x);
  }  

void to_Timer(){newPosition = myEnc.read()/4;} </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2021-07-23T01:43:23Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=404&amp;action=new</id>
		</entry>
</feed>
