1

Тема: ATtiny2313 + LCD1602_I2C

#define ADDR    0x27
#define SDA 2 // PB3
#define SCL 3 // PB2
#define RS      0
#define E       2
#define LED     3

byte led_b;

void setup() {

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

void loop() {
   
   lcdCurs(0,3);
   lcdString("ATtiny2313");
   lcdCurs(1,3);
   lcdLong(1234567891);
   delayMicroseconds(10000);
   

}

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(){ 
    delayMicroseconds(10000);
    lcd(0x03);delayMicroseconds(4500);
    lcd(0x03);delayMicroseconds(4500);
    lcd(0x03);delayMicroseconds(200);
    
    lcd(0b00000010);del();
    lcd(0b00001100);del();
    lcdClear();
  } 

void lcdClear(){lcd(0b00000001);} 
void lcd(uint8_t cmd) {lcdSend(true, cmd);}
void lcdChar(const char chr) {lcdSend(false, (uint8_t)chr);}
void lcdString(const char* str) {while(*str != '\0') {del();lcdChar(*str);str++;}}
void del(){delayMicroseconds(1000);}
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[8];
   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);            
    delayMicroseconds(10); 
    DDRB &= ~(1 << SCL);                
    if((PINB >> SDA) & 1) i2c_bit=0;                            
    delayMicroseconds(10);  
    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){
    delayMicroseconds(5);
    if(b){DDRB |= (1 << SDA);}else{DDRB &= ~(1 << SDA);}
    delayMicroseconds(5);
    DDRB &= ~(1 << SCL);       
    delayMicroseconds(10);
    DDRB |= (1 << SCL);
}
 
void i2c_start(){
     delayMicroseconds(10);  
     DDRB &= ~(1 << SDA); DDRB &= ~(1 << SCL); 
     delayMicroseconds(10); 
     DDRB |= (1 << SDA);  PORTB &= ~(1 << SDA);
     delayMicroseconds(10); 
     DDRB |= (1 << SCL);  PORTB &= ~(1 << SCL);   
     delayMicroseconds(10);
}
 
void i2c_stop()  {
     DDRB |= (1 << SDA);            
     delayMicroseconds(10);
     DDRB &= ~(1 << SCL);               
     delayMicroseconds(10); 
     DDRB &= ~(1 << SDA);             
}
 

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

2

Re: ATtiny2313 + LCD1602_I2C

Создание своих символов.

#define ADDR    0x27
#define SDA 2 // PB3
#define SCL 3 // PB2
#define RS      0
#define E       2
#define LED     3
byte led_b;
char smile[]={0x00,0x00,0x0a,0x00,0x11,0x0e,0x00,0x00};
char plus[]={0x04,0x04,0x1f,0x04,0x04,0x00,0x1f,0x00};
char gradus[] = {B00110,B01001,B01001,B00110,B00000,B00000,B00000,B00000};
void setup() {

    i2c_write(led_b |= (1<<LED));// включаем подсветку
    lcdInit();
  lcd(0x40);
  for( byte i=0;i<8;i++)lcdSend(0,smile[i]);
  lcd(0x40+8);
  for( byte i=0;i<8;i++)lcdSend(0,plus[i]);
  lcd(0x40+16);
  for( byte i=0;i<8;i++)lcdSend(0,gradus[i]);  
}

void loop() {
   
   lcdCurs(0,3);
   lcdString("ATtiny2313");
   lcdCurs(1,3);
   lcdSend(0,0); 
   lcdCurs(1,5);
   lcdSend(0,1);
   lcdCurs(1,7);
   lcdSend(0,2);
   delayMicroseconds(10000);
   

}

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(){ 
    delayMicroseconds(10000);
    lcd(0x03);delayMicroseconds(4500);
    lcd(0x03);delayMicroseconds(4500);
    lcd(0x03);delayMicroseconds(200);
    
    lcd(0b00000010);del();
    lcd(0b00001100);del();
    lcdClear();
  } 

void lcdClear(){lcd(0b00000001);} 
void lcd(uint8_t cmd) {lcdSend(true, cmd);}
void lcdChar(const char chr) {lcdSend(false, (uint8_t)chr);}
void lcdString(const char* str) {while(*str != '\0') {del();lcdChar(*str);str++;}}
void del(){delayMicroseconds(1000);}
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[8];
   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);            
    delayMicroseconds(10); 
    DDRB &= ~(1 << SCL);                
    if((PINB >> SDA) & 1) i2c_bit=0;                            
    delayMicroseconds(10);  
    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){
    delayMicroseconds(5);
    if(b){DDRB |= (1 << SDA);}else{DDRB &= ~(1 << SDA);}
    delayMicroseconds(5);
    DDRB &= ~(1 << SCL);       
    delayMicroseconds(10);
    DDRB |= (1 << SCL);
}
 
void i2c_start(){
     delayMicroseconds(10);  
     DDRB &= ~(1 << SDA); DDRB &= ~(1 << SCL); 
     delayMicroseconds(10); 
     DDRB |= (1 << SDA);  PORTB &= ~(1 << SDA);
     delayMicroseconds(10); 
     DDRB |= (1 << SCL);  PORTB &= ~(1 << SCL);   
     delayMicroseconds(10);
}
 
void i2c_stop()  {
     DDRB |= (1 << SDA);            
     delayMicroseconds(10);
     DDRB &= ~(1 << SCL);               
     delayMicroseconds(10); 
     DDRB &= ~(1 << SDA);             
}
 

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

http://forum.rcl-radio.ru/uploads/images/2025/02/54928f83e6d2d243f70f7cb32a7df94b.jpg

3

Re: ATtiny2313 + LCD1602_I2C

Большой шрифт цифр.

#define ADDR    0x27
#define SDA 0 // PB0
#define SCL 1 // PB1
#define RS      0
#define En      2
#define LED     3
byte led_b;
byte A[8] = {0b00111,0b01111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111};
byte B[8] = {0b11111,0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000};
byte C[8] = {0b11100,0b11110,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111};
byte D[8] = {0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b01111,0b00111};
byte E[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111,0b11111};
byte F[8] = {0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11110,0b11100};
byte G[8] = {0b11111,0b11111,0b11111,0b00000,0b00000,0b00000,0b11111,0b11111};
byte H[8] ={0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111};

void setup() {
  i2c_write(led_b |= (1<<LED));// включаем подсветку
  lcdInit();
    create(0,A);
    create(1,B);
    create(2,C);
    create(3,D);
    create(4,E);
    create(5,F);
    create(6,G);
    create(7,H);
   lcdCurs(0,7);
   lcdSend(0,0xa5); 
   lcdCurs(1,7);
   lcdSend(0,0xa5);  
  }
 
void loop() {
 
   displayC(0,0);
   displayC(4,1);
   displayC(8,2);
   displayC(12,3);
   
   delay(100);
}

///////////////////////////////////////////////////////////////////////////////////////////
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 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(){delayMicroseconds(1000);}
void e_pin(){i2c_write(led_b |= (1<<En));del();i2c_write(led_b &= ~(1<<En));}

void lcdCurs(byte str, byte mesto){
  if(str==0){lcd(0b10000000+mesto);}
  if(str==1){lcd(0b11000000+mesto);}
  }
void lcdInit(){ 
    DDRB |= (1 << 2)| (1 << 3)| (1 << 4)| (1 << 5) | (1 << 6) | (1 << 7);  
    delay(100);
    lcd(0x03);
    delayMicroseconds(4500); 
    lcd(0x03);
    delayMicroseconds(200);
    lcd(0b00000010);del();
    lcd(0b00001100);del();
    lcd(0b00101000);del();
    lcdClear();
  } 
void lcdInt(long int_x){
   byte h[8];
   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, то выводить ноль
  }
void lcdClear(){lcd(0x01);} 
void create( byte loc, byte charA[]) {
  loc &= 0x7; 
  lcd(0x40 | (loc << 3));
  for (byte i=0; i<8; i++) {
    lcdSend(0,charA[i]);
  }
} 
void displayC(byte col, byte fig){
  
  switch (fig) {
      case 0:
        lcdCurs(0,col); 
        lcdSend(0,0); 
        lcdSend(0,1); 
        lcdSend(0,2); 
        lcdCurs(1,col);
        lcdSend(0,3); 
        lcdSend(0,4); 
        lcdSend(0,5); 
        break;
      case 1:
        lcdCurs(0,col); 
        lcdSend(0,1); 
        lcdSend(0,2); 
        lcdSend(0,0x20); 
        lcdCurs(1,col);
        lcdSend(0,4); 
        lcdSend(0,7); 
        lcdSend(0,4); 
        break;
      case 2:
        lcdCurs(0,col); 
        lcdSend(0,6); 
        lcdSend(0,6); 
        lcdSend(0,2); 
        lcdCurs(1,col);
        lcdSend(0,3); 
        lcdSend(0,4); 
        lcdSend(0,4); 
        break;
      case 3:
        lcdCurs(0,col); 
        lcdSend(0,6); 
        lcdSend(0,6); 
        lcdSend(0,2); 
        lcdCurs(1,col);
        lcdSend(0,4); 
        lcdSend(0,4); 
        lcdSend(0,5); 
        break;
      case 4:
        lcdCurs(0,col); 
        lcdSend(0,3); 
        lcdSend(0,4); 
        lcdSend(0,7); 
        lcdCurs(1,col);
        lcdSend(0,0x20); 
        lcdSend(0,0x20); 
        lcdSend(0,7); 
        break;
      case 5:
       lcdCurs(0,col); 
        lcdSend(0,3); 
        lcdSend(0,6); 
        lcdSend(0,6); 
        lcdCurs(1,col);
        lcdSend(0,4); 
        lcdSend(0,4); 
        lcdSend(0,5); 
        break;
      case 6:
        lcdCurs(0,col); 
        lcdSend(0,0); 
        lcdSend(0,6); 
        lcdSend(0,6); 
        lcdCurs(1,col);
        lcdSend(0,3); 
        lcdSend(0,4); 
        lcdSend(0,5); 
        break;
      case 7:
       lcdCurs(0,col); 
        lcdSend(0,1); 
        lcdSend(0,1); 
        lcdSend(0,2); 
        lcdCurs(1,col);
        lcdSend(0,0x20); 
        lcdSend(0,0x20); 
        lcdSend(0,7); 
        break;
      case 8:
        lcdCurs(0,col); 
        lcdSend(0,0); 
        lcdSend(0,6); 
        lcdSend(0,2); 
        lcdCurs(1,col);
        lcdSend(0,3); 
        lcdSend(0,4); 
        lcdSend(0,5); 
        break;
      case 9:
        lcdCurs(0,col); 
        lcdSend(0,0); 
        lcdSend(0,6); 
        lcdSend(0,2); 
        lcdCurs(1,col);
        lcdSend(0,0x20); 
        lcdSend(0,0x20); 
        lcdSend(0,7); 
        break;                                

    }

}
 /////////////////////////////////////
bool i2c_read_bit() {
    bool i2c_bit = 1;        
    DDRB &= ~(1 << SDA);            
    delayMicroseconds(10); 
    DDRB &= ~(1 << SCL);                
    if((PINB >> SDA) & 1) i2c_bit=0;                            
    delayMicroseconds(10);  
    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){
    delayMicroseconds(5);
    if(b){DDRB |= (1 << SDA);}else{DDRB &= ~(1 << SDA);}
    delayMicroseconds(5);
    DDRB &= ~(1 << SCL);       
    delayMicroseconds(10);
    DDRB |= (1 << SCL);
}
 
void i2c_start(){
     delayMicroseconds(10);  
     DDRB &= ~(1 << SDA); DDRB &= ~(1 << SCL); 
     delayMicroseconds(10); 
     DDRB |= (1 << SDA);  PORTB &= ~(1 << SDA);
     delayMicroseconds(10); 
     DDRB |= (1 << SCL);  PORTB &= ~(1 << SCL);   
     delayMicroseconds(10);
}
 
void i2c_stop()  {
     DDRB |= (1 << SDA);            
     delayMicroseconds(10);
     DDRB &= ~(1 << SCL);               
     delayMicroseconds(10); 
     DDRB &= ~(1 << SDA);             
}
  
void i2c_write(byte lcd){
     i2c_start();
     i2c_write_byte(ADDR<<1);
     i2c_write_byte(lcd);
     i2c_stop();
  }    
   

http://forum.rcl-radio.ru/uploads/images/2025/04/50618c80521cd901c9ba1dab39823460.jpg