1 (2025-01-17 05:34:46 отредактировано klause)

Тема: Attiny10 + TM1637

Плата Attiny10Core Arduino 1МГц

  #include <avr/io.h>
  // TM1637 Macros
  #define TM1637_DIO_HIGH() (PORTB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_LOW() (PORTB &= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_OUTPUT() (DDRB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_INPUT() (DDRB &= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_READ() (((PINB & _BV(TM1637_DIO_PIN)) > 0) ? 1 : 0)
  #define TM1637_CLK_HIGH() (PORTB |= _BV(TM1637_CLK_PIN))
  #define TM1637_CLK_LOW() (PORTB &= ~_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 'H', segments=0b01110110
  * - for character '-', segments=0b01000000
  * - etc.
  */
  void TM1637_display_segments(const uint8_t position, const uint8_t segments);
  
  /**
  * Display digit ('0'..'9') 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__("NOP");
}

  void delay1sec(void)
  {
  
  asm volatile (
  " ldi r18, 6" "\n"
  " ldi r19, 19"  "\n"
  " ldi r20, 174" "\n"
  "1: dec r20"  "\n"
  " brne 1b"  "\n"
  " dec r19"  "\n"
  " brne 1b"  "\n"
  " dec r18"  "\n"
  " brne 1b"  "\n"
  " rjmp 1f"  "\n"
  "1:"  "\n"
  );
  };
  
  
  //  TM1637 library 
  
  void
  TM1637_init(const uint8_t enable, const uint8_t brightness)
  {
  
  DDRB |= (_BV(TM1637_DIO_PIN)|_BV(TM1637_CLK_PIN));
  PORTB &= ~(_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 & TM1637_BRIGHTNESS_MAX);
  }
  
  void
  TM1637_set_brightness(const uint8_t value)
  {
  
  TM1637_send_config(_config & TM1637_SET_DISPLAY_ON,
  value & 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 & (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 < 10 ? _digit2segments[(digit)]  : 0x00);
 // uint8_t segments = (digit < 10 ? pgm_read_byte_near((uint8_t *)&_digit2segments + digit) : 0x00);
  if (position == 0x01) {
  segments = segments | (_segments & 0x00);//tochka 0x80
  _segments = segments;
  }
  
  TM1637_display_segments(position, segments);
  }
  
  void
  TM1637_display_colon(const uint8_t value)
  {
  if (value) {
  _segments |= 0x80;
  } else {
  _segments &= ~0x80;
  }
  TM1637_display_segments(0x01, _segments);
  }
  
  void
  TM1637_clear(void)
  {
  uint8_t i;
  
  for (i = 0; i < 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 > 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 < 8; ++i, value >>= 1) {
  TM1637_CLK_LOW();
   dly();
  if (value & 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<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<5;i++){ delay1sec();}//delay 5s.
   
  };
  
  }
  

Вольтметр 5в. PB2 input.

  #include <avr/io.h>
  // TM1637 Macros
  #define TM1637_DIO_HIGH() (PORTB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_LOW() (PORTB &= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_OUTPUT() (DDRB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_INPUT() (DDRB &= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_READ() (((PINB & _BV(TM1637_DIO_PIN)) > 0) ? 1 : 0)
  #define TM1637_CLK_HIGH() (PORTB |= _BV(TM1637_CLK_PIN))
  #define TM1637_CLK_LOW() (PORTB &= ~_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 'H', segments=0b01110110
  * - for character '-', segments=0b01000000
  * - etc.
  */
  void TM1637_display_segments(const uint8_t position, const uint8_t segments);
  
  /**
  * Display digit ('0'..'9') 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__("NOP");
}

  void delay1sec(void)
  {
  
  asm volatile (
  " ldi r18, 6" "\n"
  " ldi r19, 19"  "\n"
  " ldi r20, 174" "\n"
  "1: dec r20"  "\n"
  " brne 1b"  "\n"
  " dec r19"  "\n"
  " brne 1b"  "\n"
  " dec r18"  "\n"
  " brne 1b"  "\n"
  " rjmp 1f"  "\n"
  "1:"  "\n"
  );
  };
  
  
  //  TM1637 library 
  
  void
  TM1637_init(const uint8_t enable, const uint8_t brightness)
  {
  
  DDRB |= (_BV(TM1637_DIO_PIN)|_BV(TM1637_CLK_PIN));
  PORTB &= ~(_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 & TM1637_BRIGHTNESS_MAX);
  }
  
  void
  TM1637_set_brightness(const uint8_t value)
  {
  
  TM1637_send_config(_config & TM1637_SET_DISPLAY_ON,
  value & 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 & (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 < 10 ? _digit2segments[(digit)]  : 0x00);
 // uint8_t segments = (digit < 10 ? pgm_read_byte_near((uint8_t *)&_digit2segments + digit) : 0x00);
  if (position == 0x01) {
  segments = segments | (_segments & 0x00);//tochka 0x80
  _segments = segments;
  }
  
  TM1637_display_segments(position, segments);
  }
  
  void
  TM1637_display_colon(const uint8_t value)
  {
  if (value) {
  _segments |= 0x80;
  } else {
  _segments &= ~0x80;
  }
  TM1637_display_segments(0x01, _segments);
  }
  
  void
  TM1637_clear(void)
  {
  uint8_t i;
  
  for (i = 0; i < 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 > 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 < 8; ++i, value >>= 1) {
  TM1637_CLK_LOW();
   dly();
  if (value & 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<<DDB3;                  
          
  TM1637_init(1/*enable*/, 1/*brightness*/);
  
 for(byte i=0;i<5;i++){TM1637_display_segments(i,0b01000000);}
  // delay 1 for diagnostic
  delay1sec();

 
  while (1) {
  PrepareADC(ADC2);
  ADCSRA |= (1<<ADSC); //  start reading
  while ((ADCSRA & (1<<ADIF))==0);
  ADCSRA|=(1<<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<5;i++){ delay1sec();}//delay 5s.
  
  
  };
  
  }
  void PrepareADC( uint8_t ADCF ) 
{
  PRR &= ~(1<<PRADC); // ADC power enable
  ADMUX = ADCF;
  ADCSRB = 0;
  ADCSRA = (1<<ADEN) | (0<<ADATE) | (0<<ADIE) |   (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // ADC on, AutoTrigger off, Interrupt off, divider = 2
  dly();
}

+ds18b20 . Работает не стабильно.

  #include <avr/io.h>
  // TM1637 Macros
  #define TM1637_DIO_HIGH() (PORTB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_LOW() (PORTB &= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_OUTPUT() (DDRB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_INPUT() (DDRB &= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_READ() (((PINB & _BV(TM1637_DIO_PIN)) > 0) ? 1 : 0)
  #define TM1637_CLK_HIGH() (PORTB |= _BV(TM1637_CLK_PIN))
  #define TM1637_CLK_LOW() (PORTB &= ~_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 'H', segments=0b01110110
  * - for character '-', segments=0b01000000
  * - etc.
  */
  void TM1637_display_segments(const uint8_t position, const uint8_t segments);
  
  /**
  * Display digit ('0'..'9') 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 (
"    rjmp 1f \n"
"1:  rjmp 2f  \n"
"2: \n"
);
}

  void delay1sec(void)
  {
  
  asm volatile (
  " ldi r18, 6" "\n"
  " ldi r19, 19"  "\n"
  " ldi r20, 174" "\n"
  "1: dec r20"  "\n"
  " brne 1b"  "\n"
  " dec r19"  "\n"
  " brne 1b"  "\n"
  " dec r18"  "\n"
  " brne 1b"  "\n"
  " rjmp 1f"  "\n"
  "1:"  "\n"
  );
  };
  
  
  //  TM1637 library 
  
  void
  TM1637_init(const uint8_t enable, const uint8_t brightness)
  {
  
  DDRB |= (_BV(TM1637_DIO_PIN)|_BV(TM1637_CLK_PIN));
  PORTB &= ~(_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 & TM1637_BRIGHTNESS_MAX);
  }
  
  void
  TM1637_set_brightness(const uint8_t value)
  {
  
  TM1637_send_config(_config & TM1637_SET_DISPLAY_ON,
  value & 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 & (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 < 10 ? _digit2segments[(digit)]  : 0x00);
 // uint8_t segments = (digit < 10 ? pgm_read_byte_near((uint8_t *)&_digit2segments + digit) : 0x00);
  if (position == 0x01) {
  segments = segments | (_segments & 0x00);//tochka 0x80
  _segments = segments;
  }
  
  TM1637_display_segments(position, segments);
  }
  
  void
  TM1637_display_colon(const uint8_t value)
  {
  if (value) {
  _segments |= 0x80;
  } else {
  _segments &= ~0x80;
  }
  TM1637_display_segments(0x01, _segments);
  }
  
  void
  TM1637_clear(void)
  {
  uint8_t i;
  
  for (i = 0; i < 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 > 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 < 8; ++i, value >>= 1) {
  TM1637_CLK_LOW();
   dly();
  if (value & 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<<PRADC);// ADC off    
  TM1637_init(1/*enable*/, 1/*brightness*/);
  
 for(byte i=0;i<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<5;i++){ delay1sec();}//delay 5s.
  
  
  };
  }
 /////////////////////

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


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

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

  //  delayMicroseconds(1);
    if(bit) DDRB &= ~(1 << OUT);
    asm volatile (
"    ldi  r18, 20  \n"
"1:  dec  r18 \n"
"    brne 1b  \n"
);  
   // delayMicroseconds(60);
    DDRB &= ~(1 << OUT);
}
// read bit
uint8_t therm_read_bit(void){
    uint8_t bit=0;
    PORTB &= ~(1 << OUT);
    DDRB |= (1 << OUT);
       asm volatile (
"    nop  \n"
);
   // delayMicroseconds(1);
    DDRB &= ~(1 << OUT);
    asm volatile (
"    ldi  r18, 4  \n"
"1:  dec  r18 \n"
"    brne 1b  \n"
"    rjmp 1f  \n"
"1: \n"
);

   // delayMicroseconds(14);
    if(PINB & (1 << OUT)) bit=1;
    asm volatile (
"    ldi  r18, 15  \n"
"1:  dec  r18 \n"
"    brne 1b  \n"
);
  //  delayMicroseconds(45);
    return bit;
}
 
// read byte
uint8_t therm_read_byte(void){
    uint8_t i=8, n=0;
    while(i--){n>>=1;n|=(therm_read_bit()<<7);}
    return n;
}
 
// write byte
void therm_write_byte(uint8_t byte){
    uint8_t i=8;
    while(i--){therm_write_bit(byte&1);byte >>= 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] << 8 | temperature[0])*10/16;
    return (int)temper;
}

+DHT11

  #define DHT_PIN PB2
  byte data_dht[5];
  
  // TM1637 Macros
  #define TM1637_DIO_HIGH() (PORTB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_LOW() (PORTB &= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_OUTPUT() (DDRB |= _BV(TM1637_DIO_PIN))
  #define TM1637_DIO_INPUT() (DDRB &= ~_BV(TM1637_DIO_PIN))
  #define TM1637_DIO_READ() (((PINB & _BV(TM1637_DIO_PIN)) > 0) ? 1 : 0)
  #define TM1637_CLK_HIGH() (PORTB |= _BV(TM1637_CLK_PIN))
  #define TM1637_CLK_LOW() (PORTB &= ~_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 'H', segments=0b01110110
  * - for character '-', segments=0b01000000
  * - etc.
  */
  void TM1637_display_segments(const uint8_t position, const uint8_t segments);
  
  /**
  * Display digit ('0'..'9') 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 (
  " ldi r18, 6" "\n"
  " ldi r19, 19"  "\n"
  " ldi r20, 174" "\n"
  "1: dec r20"  "\n"
  " brne 1b"  "\n"
  " dec r19"  "\n"
  " brne 1b"  "\n"
  " dec r18"  "\n"
  " brne 1b"  "\n"
  " rjmp 1f"  "\n"
  "1:"  "\n"
  );
  };
  
  
  
  // -------------------------------------------------------------------------------------------------------
  // ---------------------------------------- TM1637 library CODE ------------------------------------------
  // -------------------------------------------------------------------------------------------------------
  
  
  void
  TM1637_init(const uint8_t enable, const uint8_t brightness)
  {
  
  DDRB |= (_BV(TM1637_DIO_PIN)|_BV(TM1637_CLK_PIN));
  PORTB &= ~(_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 & TM1637_BRIGHTNESS_MAX);
  }
  
  void
  TM1637_set_brightness(const uint8_t value)
  {
  
  TM1637_send_config(_config & TM1637_SET_DISPLAY_ON,
  value & 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 & (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 < 10 ? _digit2segments[(digit)]  : 0x00);
  
  if (position == 0x01) {
  segments = segments | (_segments & 0x00);//0x80
  _segments = segments;
  }
  
  TM1637_display_segments(position, segments);
  }
  
  void
  TM1637_display_colon(const uint8_t value)
  {
  if (value) {
  _segments |= 0x80;
  } else {
  _segments &= ~0x80;
  }
  TM1637_display_segments(0x01, _segments);
  }
  
  void
  TM1637_clear(void)
  {
  uint8_t i;
  
  for (i = 0; i < 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 > 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 (
"    rjmp 1f  \n"
"1:  rjmp 2f  \n"
"2: \n"
);
  TM1637_DIO_LOW();
  }
  
  void
  TM1637_stop(void)
  {
  
  TM1637_CLK_LOW();
  asm volatile (
"    rjmp 1f  \n"
"1:  rjmp 2f  \n"
"2: \n"
);
  TM1637_DIO_LOW();
  asm volatile (
"    rjmp 1f  \n"
"1:  rjmp 2f  \n"
"2: \n"
);
  TM1637_CLK_HIGH();
 asm volatile (
"    rjmp 1f \n"
"1:  rjmp 2f  \n"
"2: \n"
);
  TM1637_DIO_HIGH();
  }
  
  uint8_t
  TM1637_write_byte(uint8_t value)
  {
  uint8_t i, ack;
  
  for (i = 0; i < 8; ++i, value >>= 1) {
  TM1637_CLK_LOW();
  asm volatile (
"    rjmp 1f  \n"
"1:  rjmp 2f  \n"
"2: \n"
);
  if (value & 0x01) {
  TM1637_DIO_HIGH();
  } else {
  TM1637_DIO_LOW();
  }
  
  TM1637_CLK_HIGH();
  asm volatile (
"    rjmp 1f  \n"
"1:  rjmp 2f  \n"
"2: \n"
);
  }
  
  TM1637_CLK_LOW();
  TM1637_DIO_INPUT();
  TM1637_DIO_HIGH();
 asm volatile (
"    rjmp 1f \n"
"1:  rjmp 2f  \n"
"2: \n"
);
  ack = TM1637_DIO_READ();
  if (ack) {
  TM1637_DIO_OUTPUT();
  TM1637_DIO_LOW();
  }
 asm volatile (
"    rjmp 1f \n"
"1:  rjmp 2f  \n"
"2: \n"
);
  TM1637_CLK_HIGH();
  asm volatile (
"    rjmp 1f  \n"
"1:  rjmp 2f  \n"
"2: \n"
);
  TM1637_CLK_LOW();
  asm volatile (
"    rjmp 1f  \n"
"1:  rjmp 2f  \n"
"2: \n"
);
  TM1637_DIO_OUTPUT();
  
  return ack;
  }
  
  int main(void)
  {
  uint8_t firstdig, seconddig;
    ACSR ^= ~_BV(ACIE);//comparator off
    ACSR |= ACD;           
    PRR |= (1<<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 < 5;ii++){data_dht[ii] = 0;}                  
        DDRB |=(1 << DHT_PIN); 
        PORTB &= ~(1 << DHT_PIN); 
        asm volatile (
"    ldi  r18, 24  \n"
"    ldi  r19, 95 \n"
"1:  dec  r19 \n"
"    brne 1b  \n"
"    dec  r18 \n"
"    brne 1b  \n"
"    rjmp 1f  \n"
"1: \n"
);

        //delay(18); 
        PORTB |= (1 << DHT_PIN);
asm volatile (
"    ldi  r18, 13  \n"
"1:  dec  r18 \n"
"    brne 1b  \n"
"    nop  \n"
);
        
       // delayMicroseconds(40); 
        DDRB &= ~(1 << DHT_PIN);
asm volatile (
"    ldi  r18, 26  \n"
"1:  dec  r18 \n"
"    brne 1b  \n"
"    rjmp 1f  \n"
"1: \n"
);
        
         
       // delayMicroseconds(80); 
    while(PINB & (1 << DHT_PIN));
      for (ii = 0; ii < 5; ii++){
        data_dht[ii]=0;
      for (i1=0; i1<8; i1++){
    while(!(PINB & (1 << DHT_PIN)));
asm volatile (
"    ldi  r18, 10  \n"
"1:  dec  r18 \n"
"    brne 1b  \n"
);
      
        //delayMicroseconds(30);
      if (PINB & (1 << DHT_PIN)){data_dht[ii] |= 1 << (7-i1);}
    while(PINB & (1 << DHT_PIN));  
}}return 1;}

2 (2025-01-17 05:45:25 отредактировано klause)

Re: Attiny10 + TM1637

Для расчета примерной задержки delay() в миллисекундах.

void delay (int millis) {
  for (volatile unsigned int i = 34*millis; i>0; i--);
}

Или http://darcy.rsgc.on.ca/ACES/TEI4M/AVRdelay.html
Или

 #include <util/delay.h>
 _delay_ms(1000);

Для определения входа - выхода.

DDRB = 0b0101;         // равнозначно pinMode(1, OUTPUT); pinMode(3, OUTPUT);

Включение подтягивающие резисторов

PUEB = 0b0010;         //равнозначно  pinMode(2, INPUT_PULLUP);

Состояние выхода

PORTB = 0b0100;        //равнозначно  digitalWrite(1, LOW); digitalWrite(3, HIGH);

Для ШИМа

TCCR0A = 2<<COM0A0 | 3<<WGM00; // 10-bit PWM on OC0A (PB0), неинвертирующий режим
TCCR0B = 0<<WGM02 | 1<<CS00;   // Делим на 1
DDRB = 0b0001;                 //  PB0 на выход
OCR0A = 1000;                  // равнозначно analogWrite(0, 1000)

Для АЦП

ADMUX = 0<<MUX0;               // ADC0 (PB0)
ADCSRA = 1<<ADEN | 3<<ADPS0;   // Enable ADC, 125kHz clock

Считать значение АЦП

ADCSRA = ADCSRA | 1<<ADSC;     // Начало
while (ADCSRA & 1<<ADSC);      // ждем завершения
int temp = ADCL;               // Копируем в temp

Изменение частоты МК в программе. Можно в плате Attiny10Core ардуино.

 #define F_CPU 8000000UL 
 int main(void)
  {
     CCP=0xD8;
     CLKPSR =0; //Предделитель 8, чтобы запустить на 8МГц.Для того чтобы _delay_ms() работали правильно.
}

3 (2025-01-23 07:26:13 отредактировано klause)

Re: Attiny10 + TM1637

Attiny10 + lcd0,96 (128x64)/lcd0,91(128x32). Линии SDA и SCL подключать через резисторы 470 Ом при 5в питания.

#include <avr/io.h>
#include <util/delay.h>

#define PI2C_SDA    PB0
#define PI2C_SCL    PB2

#define OUT_REG PORTB
#define IN_REG PINB

#define SDA_ON (OUT_REG |= (1<< PI2C_SDA))
#define SDA_OFF (OUT_REG &= ~(1<< PI2C_SDA))
#define SCL_ON (OUT_REG |= (1<< PI2C_SCL))
#define SCL_OFF (OUT_REG &= ~(1<< PI2C_SCL))

#define SDA_READ (IN_REG & (1<<PI2C_SDA))
#define SCL_READ (IN_REG & (1<<PI2C_SCL))

#define I2C_READ 0x01
#define I2C_WRITE 0x00

#define ADDR 0b01111000 //OLED Address plus write bit

inline void dly(){__asm__("NOP");}; 

const uint8_t font[50] ={
  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
};



int main(void){ 
   DDRB = 0b0101;
   
   oled_init();
   clrScreen();    
  for(byte i=0;i<10;i++){drawChar2(i,1, i);
     _delay_ms(10);
    drawChar2(i,4, i); _delay_ms(10);}
    _delay_ms(100);
    clrScreen();  
   while(1){ 
    byte n; n++;
    drawChar2(n/100,4, 3);
    drawChar2((n/10)%10,4, 4);
    drawChar2(n%10,4, 5);
     _delay_ms(1000);
    }
    
    

}
/////I2C/////

/*  i2c start sequence */
void startBit(){
   SDA_ON;
    dly();
    SCL_ON;
    dly();
    SDA_OFF;
    dly();
    SCL_OFF;
    dly();
}


/*  i2c stop sequence */
void stopBit(){
  SDA_OFF;
    dly();
    SCL_ON;
    dly();
    SDA_ON;
    dly();
}



void command( unsigned char comm){
    
    startBit();
    sendData(ADDR);            // address
    sendData(0x00);
    sendData(comm);             // command code
    stopBit();
}
void sendData(unsigned char dataB){
 for(uint8_t i = 0; i<8; i++){
        (dataB & 0x80) ? SDA_ON : SDA_OFF;
        dataB<<=1;    
        dly();
        SCL_ON;
        dly();
        SCL_OFF;
        dly();
    }

    SDA_ON;
    SCL_ON;
    dly();
    bool ack = !SDA_READ;    // Acknowledge bit
    SCL_OFF;
}

///display///
void drawChar2(char fig, unsigned char y, unsigned char x)
{
    unsigned char i, line, btm, top;    //
    
    command(0x20);    // vert mode
    command(0x01);

    command(0x21);     //col addr
    command(13 * x); //col start
    command(13 * x + 9);  //col end
    command(0x22);    //0x22
    command(y); // Page start
    command(y+1); // Page end
    
    startBit();
    sendData(ADDR);            // address
    sendData(0x40);
    for (i = 0; i < 5; i++){
        line=font[5*(fig)+i];
        btm=0; top=0;
            // expend char    
        if(line & 64) {btm +=192;}
        if(line & 32) {btm +=48;}
        if(line & 16) {btm +=12;}           
        if(line & 8) {btm +=3;}

        if(line & 4) {top +=192;}
        if(line & 2) {top +=48;}
        if(line & 1) {top +=12;}        

         sendData(top); //top page
         sendData(btm);  //second page
         sendData(top);
         sendData(btm);
    }
    stopBit();
        
    command(0x20);      // horizontal mode
    command(0x00);    
        
}

void clrScreen()    //fill screen with 0
{
    unsigned char y, i;
    
    for ( y = 0; y < 8; y++ ) {
        command(0x21);     //col addr
        command(0); //col start
        command(127);  //col end
        command(0x22);    //0x22
        command(y); // Page start
        command(y+1); // Page end    
        startBit();
        sendData(ADDR);            // address
        sendData(0x40);
        for (i = 0; i < 128; i++){
             sendData(0x00);
        }
        stopBit();
    }    
}
void oled_init() {
    
    command(0xAE);   // DISPLAYOFF
    command(0x8D);         // CHARGEPUMP *
    command(0x14);     //0x14-pump on
    command(0x20);         // MEMORYMODE
    command(0x0);      //0x0=horizontal, 0x01=vertical, 0x02=page
    command(0xA1);        //SEGREMAP * A0/A1=top/bottom 
    command(0xC8);     //COMSCANDEC * C0/C8=left/right
    command(0xDA);         // SETCOMPINS *
    command(0x12);   //0x22=4rows lcd0,91(128x32), 0x12=8rows lcd0,96 (128x64)
    command(0x81);        // SETCONTRAST
    command(0xFF);     //0x8F
    command(0xAF);          //DISPLAYON

}

Шрифт покрупнее

#include <avr/io.h>
#include <util/delay.h>

#define PI2C_SDA    PB0
#define PI2C_SCL    PB1

#define OUT_REG PORTB
#define IN_REG PINB

#define SDA_ON (OUT_REG |= (1<< PI2C_SDA))
#define SDA_OFF (OUT_REG &= ~(1<< PI2C_SDA))
#define SCL_ON (OUT_REG |= (1<< PI2C_SCL))
#define SCL_OFF (OUT_REG &= ~(1<< PI2C_SCL))

#define SDA_READ (IN_REG & (1<<PI2C_SDA))
#define SCL_READ (IN_REG & (1<<PI2C_SCL))

#define I2C_READ 0x01
#define I2C_WRITE 0x00

#define ADDR 0b01111000 //OLED Address plus write bit

inline void dly(){__asm__("NOP");}; 

const uint8_t font[50] ={
  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
};



int main(void){ 
   DDRB = 0b0011;
   
   oled_init();
   clrScreen();    
 
   while(1){ 
    byte n; n++;
    drawChar4(n/100,1, 17);
    drawChar4((n/10)%10,1, 35);
    drawChar4(n%10,1, 53);
     _delay_ms(1000);
    }
    
    

}
/////I2C/////

/*  i2c start sequence */
void startBit(){
   SDA_ON;
    dly();
    SCL_ON;
    dly();
    SDA_OFF;
    dly();
    SCL_OFF;
    dly();
}


/*  i2c stop sequence */
void stopBit(){
  SDA_OFF;
    dly();
    SCL_ON;
    dly();
    SDA_ON;
    dly();
}



void command( unsigned char comm){
    
    startBit();
    sendData(ADDR);            // address
    sendData(0x00);
    sendData(comm);             // command code
    stopBit();
}
void sendData(unsigned char dataB){
 for(uint8_t i = 0; i<8; i++){
        (dataB & 0x80) ? SDA_ON : SDA_OFF;
        dataB<<=1;    
        dly();
        SCL_ON;
        dly();
        SCL_OFF;
        dly();
    }

    SDA_ON;
    SCL_ON;
    dly();
    bool ack = !SDA_READ;    // Acknowledge bit
    SCL_OFF;
}

///display///
void drawChar4(char fig, unsigned char y, unsigned char x)
{
   unsigned char i, j, line, b1, b2, b3, b4;    //
    
    command(0x20);    // vert mode
    command(0x01);

    command(0x21);     //col addr
    command(x); //col start
    command(x + 14);  //col end
    command(0x22);    //0x22
    command(y); // Page start
    command(y+3); // Page end
    
        startBit();
        sendData(ADDR);            // address
        sendData(0x40);
        
        for (i = 0; i < 5; i++){
            line=font[5*(fig)+i];
            b1=0; b2=0; b3=0; b4=0;
                // expend char    
            if(line & 64) {b4 +=240;}
            if(line & 32) {b4 +=15;}
            if(line & 16) {b3 +=240;}           
            if(line & 8) {b3 +=15;}
            
            if(line & 4) {b2 +=240;}
            if(line & 2) {b2 +=15;}
            if(line & 1) {b1 +=240;}
            for(j=0;j<3;j++){
                sendData(b1); //top page
                sendData(b2);  //second page
                sendData(b3);
                sendData(b4);
            } 
        }
        stopBit();
        
    command(0x20);      // horizontal mode
    command(0x00);    
        
        
}

void clrScreen()    //fill screen with 0
{
    unsigned char y, i;
    
    for ( y = 0; y < 8; y++ ) {
        command(0x21);     //col addr
        command(0); //col start
        command(127);  //col end
        command(0x22);    //0x22
        command(y); // Page start
        command(y+1); // Page end    
        startBit();
        sendData(ADDR);            // address
        sendData(0x40);
        for (i = 0; i < 128; i++){
             sendData(0x00);
        }
        stopBit();
    }    
}
void oled_init() {
    
    command(0xAE);   // DISPLAYOFF
    command(0x8D);         // CHARGEPUMP *
    command(0x14);     //0x14-pump on
    command(0x20);         // MEMORYMODE
    command(0x0);      //0x0=horizontal, 0x01=vertical, 0x02=page
    command(0xA1);        //SEGREMAP * A0/A1=top/bottom 
    command(0xC8);     //COMSCANDEC * C0/C8=left/right
    command(0xDA);         // SETCOMPINS *
    command(0x12);   //0x22=4rows, 0x12=8rows
    command(0x81);        // SETCONTRAST
    command(0xFF);     //0x8F
    command(0xAF);          //DISPLAYON

}

4 (2025-01-21 05:48:00 отредактировано klause)

Re: Attiny10 + TM1637

Attiny10+lcd1602

#include <avr/io.h>
#include <util/delay.h>

#define ADDR    0x27
#define SDA 0 // PB1
#define SCL 1 // PB0
#define RS      0
#define E       2
#define LED     3

byte led_b,h[8];

void setup() {
DDRB=3;
    i2c_write(led_b |= (1<<LED));// включаем подсветку
    lcdInit();
}

void loop() {
   lcdCurs(0,3);
   lcdString("ATtiny__10");
   lcdCurs(1,3);
   lcdLong(1234567890);  
  
}

void lcdSend(bool rs, byte data) {
    if(rs==0){led_b |= (1<<RS);} else {led_b &= ~(1<<RS);}//RS
    
    del();
    if(((data >> 7) & 1) ==1){i2c_write(led_b |= (1<<7));} else {i2c_write(led_b &= ~(1<<7));}
    if(((data >> 6) & 1) ==1){i2c_write(led_b |= (1<<6));} else {i2c_write(led_b &= ~(1<<6));}
    if(((data >> 5) & 1) ==1){i2c_write(led_b |= (1<<5));} else {i2c_write(led_b &= ~(1<<5));}
    if(((data >> 4) & 1) ==1){i2c_write(led_b |= (1<<4));} else {i2c_write(led_b &= ~(1<<4));}
    e_pin();
    if(((data >> 3) & 1) ==1){i2c_write(led_b |= (1<<7));} else {i2c_write(led_b &= ~(1<<7));}
    if(((data >> 2) & 1) ==1){i2c_write(led_b |= (1<<6));} else {i2c_write(led_b &= ~(1<<6));}
    if(((data >> 1) & 1) ==1){i2c_write(led_b |= (1<<5));} else {i2c_write(led_b &= ~(1<<5));}
    if(((data >> 0) & 1) ==1){i2c_write(led_b |= (1<<4));} else {i2c_write(led_b &= ~(1<<4));}
    e_pin();
}

void lcdInit(){ 
    del();
    lcd(0x03);_delay_ms(5);
    lcd(0x03);_delay_ms(5);
    lcd(0x03);_delay_us(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 != '\0') {del();lcdChar(*str);str++;}}
void del(){_delay_ms(1);}
void e_pin(){i2c_write(led_b |= (1<<E));del();i2c_write(led_b &= ~(1<<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[10];
   long int_y=int_x;
   int i,i_kol;
  if(int_x<0){int_x=abs(int_x);lcdChar('-');}    // если минус
  for(i_kol=0;int_x>0;i_kol++){int_x=int_x/10;}  // определяем кол-во цифр в long
  for(i=0;i<i_kol;i++){h[i]=int_y%10; int_y=int_y/10;}// разбиваем число на отдельные цифры
  for(i=i_kol-1;i>=0;i--){lcdChar(h[i] +'0');} // преобразуем числа в char
  if(i_kol==0){lcdChar('0');} // если long = 0, то выводить ноль
  }  

bool i2c_read_bit() {
    bool i2c_bit = 1;        
    DDRB &= ~(1 << SDA);            
    dly(); 
    DDRB &= ~(1 << SCL);                
    if((PINB >> SDA) & 1) i2c_bit=0;                            
    dly();  
    DDRB |= (1 << SCL);              
    return i2c_bit;  
}
 
byte i2c_write_byte(byte data){
    for (byte i=0; i<8; i++){i2c_write_bit((data&0x80)==0);data<<=1;}    
    return i2c_read_bit(); 
}
 
void i2c_write_bit(byte b){
   dly();
    if(b){DDRB |= (1 << SDA);}else{DDRB &= ~(1 << SDA);}
   dly();
    DDRB &= ~(1 << SCL);       
    dly();
    DDRB |= (1 << SCL);
}
 
void i2c_start(){
     dly();  
     DDRB &= ~(1 << SDA); DDRB &= ~(1 << SCL); 
     dly(); 
     DDRB |= (1 << SDA);  PORTB &= ~(1 << SDA);
     dly(); 
     DDRB |= (1 << SCL);  PORTB &= ~(1 << SCL);   
     dly();
}
 
void i2c_stop()  {
     DDRB |= (1 << SDA);            
    dly();
     DDRB &= ~(1 << SCL);               
    dly(); 
     DDRB &= ~(1 << SDA);             
}
 

 
void i2c_write(byte lcd){
     i2c_start();
     i2c_write_byte(ADDR<<1);
     i2c_write_byte(lcd);
     i2c_stop();
  } 

 inline void dly(){__asm__("NOP");};   

+ds18b20

#include <avr/io.h>
#include <util/delay.h>

#define ADDR    0x27
#define SDA 0 // PB1
#define SCL 1 // PB0
#define RS      0
#define E       2
#define LED     3
#define OUT 2 // PB0
byte led_b,h[8];
int t;
void setup() {
DDRB=3;
    i2c_write(led_b &= ~(1<<LED));// выключаем подсветку
    _delay_ms(1000);
    i2c_write(led_b |= (1<<LED));// включаем подсветку
    lcdInit();
}

void loop() {
   t = read_temp();
   lcdCurs(0,3);
   lcdString("TEMPERATURA");
   lcdCurs(1,3); 
   lcdChar(t/100 +'0');
   lcdChar(t/10%10 +'0');
   lcdChar(46);
   lcdChar(t%10 +'0');
   lcdChar(32);lcdChar(67);
   _delay_ms(1000);
}

void lcdSend(bool rs, byte data) {
    if(rs==0){led_b |= (1<<RS);} else {led_b &= ~(1<<RS);}//RS
    
    del();
    if(((data >> 7) & 1) ==1){i2c_write(led_b |= (1<<7));} else {i2c_write(led_b &= ~(1<<7));}
    if(((data >> 6) & 1) ==1){i2c_write(led_b |= (1<<6));} else {i2c_write(led_b &= ~(1<<6));}
    if(((data >> 5) & 1) ==1){i2c_write(led_b |= (1<<5));} else {i2c_write(led_b &= ~(1<<5));}
    if(((data >> 4) & 1) ==1){i2c_write(led_b |= (1<<4));} else {i2c_write(led_b &= ~(1<<4));}
    e_pin();
    if(((data >> 3) & 1) ==1){i2c_write(led_b |= (1<<7));} else {i2c_write(led_b &= ~(1<<7));}
    if(((data >> 2) & 1) ==1){i2c_write(led_b |= (1<<6));} else {i2c_write(led_b &= ~(1<<6));}
    if(((data >> 1) & 1) ==1){i2c_write(led_b |= (1<<5));} else {i2c_write(led_b &= ~(1<<5));}
    if(((data >> 0) & 1) ==1){i2c_write(led_b |= (1<<4));} else {i2c_write(led_b &= ~(1<<4));}
    e_pin();
}

void lcdInit(){ 
    del();
    lcd(0x03);_delay_us(4500);
    lcd(0x03);_delay_us(4500);
    lcd(0x03);_delay_us(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 != '\0') {del();lcdChar(*str);str++;}}
void del(){_delay_ms(1);}
void e_pin(){i2c_write(led_b |= (1<<E));del();i2c_write(led_b &= ~(1<<E));}


void lcdCurs(byte str, byte mesto){
  if(str==0){lcd(0b10000000+mesto);}
  if(str==1){lcd(0b11000000+mesto);}
  }  

bool i2c_read_bit() {
    bool i2c_bit = 1;        
    DDRB &= ~(1 << SDA);            
    dly(); 
    DDRB &= ~(1 << SCL);                
    if((PINB >> SDA) & 1) i2c_bit=0;                            
    dly();  
    DDRB |= (1 << SCL);              
    return i2c_bit;  
}
 
byte i2c_write_byte(byte data){
    for (byte i=0; i<8; i++){i2c_write_bit((data&0x80)==0);data<<=1;}    
    return i2c_read_bit(); 
}
 
void i2c_write_bit(byte b){
   dly();
    if(b){DDRB |= (1 << SDA);}else{DDRB &= ~(1 << SDA);}
   dly();
    DDRB &= ~(1 << SCL);       
    dly();
    DDRB |= (1 << SCL);
}
 
void i2c_start(){
     dly();  
     DDRB &= ~(1 << SDA); DDRB &= ~(1 << SCL); 
     dly(); 
     DDRB |= (1 << SDA);  PORTB &= ~(1 << SDA);
     dly(); 
     DDRB |= (1 << SCL);  PORTB &= ~(1 << SCL);   
     dly();
}
 
void i2c_stop()  {
     DDRB |= (1 << SDA);            
    dly();
     DDRB &= ~(1 << SCL);               
    dly(); 
     DDRB &= ~(1 << SDA);             
}
 

 
void i2c_write(byte lcd){
     i2c_start();
     i2c_write_byte(ADDR<<1);
     i2c_write_byte(lcd);
     i2c_stop();
  } 

 inline void dly(){__asm__("NOP");}; 

//////// ds18b20 /////////////

// reset
uint8_t therm_reset(){
    uint8_t i;
    PORTB &= ~(1 << OUT);
    DDRB |= (1 << OUT);
   _delay_us(480);  
    DDRB &= ~(1 << OUT);
    _delay_us(60);
    i=((PINB >> OUT) & 1);
    _delay_us(420);;
    return i;
}
// write bit
void therm_write_bit(uint8_t bit){
    PORTB &= ~(1 << OUT);
    DDRB |= (1 << OUT);
    _delay_us(1);
    if(bit) DDRB &= ~(1 << OUT);
   _delay_us(60);
    DDRB &= ~(1 << OUT);
}
// read bit
uint8_t therm_read_bit(void){
    uint8_t bit=0;
    PORTB &= ~(1 << OUT);
    DDRB |= (1 << OUT);
   _delay_us(1);
    DDRB &= ~(1 << OUT);
   _delay_us(14);
    if(PINB & (1 << OUT)) bit=1;
    _delay_us(45);
    return bit;
}
 
// read byte
uint8_t therm_read_byte(void){
    uint8_t i=8, n=0;
    while(i--){n>>=1;n|=(therm_read_bit()<<7);}
    return n;
}
 
// write byte
void therm_write_byte(uint8_t byte){
    uint8_t i=8;
    while(i--){therm_write_bit(byte&1);byte >>= 1;
    }
}
// read temp
int read_temp(){
    uint8_t temperature[2];
    int 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] << 8 | temperature[0])*10/16;
    return (int)temper;
}   

   

5

Re: Attiny10 + TM1637

ATtiny10Core add-on
============
Дополнение к ядру ATtiny10Core (https://github.com/technoblogy/attiny10core)

### Установка

* Установить ядро ATtiny10Core (https://github.com/technoblogy/attiny10core)
* Перейти по пути **C:\Users\username\AppData\Local\Arduino15\packages\ATtiny10Core**
* Скачать архив этого репозитория
* Заменить папку **hardware** той, что лежит в архиве
* Перезапустить Arduino IDE

### Возможности
Добавляет все стандартные функции ввода-вывода, привычные пользователям Arduino.
Список реализованных функций:

* **pinMode()**
* **digitalWrite()**
* **digitalRead()**
* **analogWrite()**
* **analogRead()**
* **millis()**
* **micros()**
* **delay()**
* **delayMicroseconds()**
* **shiftOut()**
* **shiftIn()**

Дополнительно реализованы функции управления тактированием:
* **setSystemPrescaler()** - установить предделитель системной частоты
* **CORE_PRESCALER_1**
* **CORE_PRESCALER_2**
* **CORE_PRESCALER_4**
* **CORE_PRESCALER_8**
* **CORE_PRESCALER_16**
* **CORE_PRESCALER_32**
* **CORE_PRESCALER_64**
* **CORE_PRESCALER_128**
* **CORE_PRESCALER_256**
* **CORE_PRESCALER_DEFAULT**

* **setSystemClock()** - выбрать источник тактирования
* **CORE_CLOCK_INTERNAL**     - Внутренний источник 8 МГц
* **CORE_CLOCK_WDT**             - Внутренний источник WDT, 128 кГц
* **CORE_CLOCK_EXTERNAL**        - Внешнее тактирование, до 12 МГц

Дополнительно в меню платы можно:
* Выбрать частоту тактирования
* Отключить и включить инициализацию АЦП (**analogRead()**)
* Отключить и включить инициализацию таймера 0 (**analogWrite()**)
* Выбрать вариант реализации **millis()** и **micros()**

Данный контент доступен только зарегистрированным пользователям.
От автора этой добавки проект диммера
Данный контент доступен только зарегистрированным пользователям.