Большой шрифт цифр.
#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();
}