Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Полезная статья. Несколько раз мне пригодился бы такой подход.
Автор конечно мастер скриншотов :)
коммутировать ему приходится всего 200 мА.Ардуино потребляет 17 ма и подсветка 40 мА (максимальный ток выхода). Как получилось 200 мА?


Нога порта атмеги легко вытягивает питание и передачу данных и даже подсветку трем экранам.На все экраны выводится одинаковая информация?
void LcdWireOut(unsigned char a)
{
unsigned char b=0;
//unsigned char mask = 1;
for(b=0;b<8;b++)
{
if(a&(0b00000001<<b))
{
OwDisp=1;
delay_us(1);
#asm("cli");
OwDisp=0;
//delay_us(1);
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
OwDisp=1;
#asm("sei");
}
else
{
OwDisp=1;
OwDisp=0;
delay_us(20);
OwDisp=1;
}
//mask=mask<<1;
}
delay_us(200);
OwDisp=0;
}
void UpdLcdWire()
{
unsigned char a=0;
if(LCD_B0)
a |= 1 << 7;
if(LCD_BKL)
a |= LCD_BKL << 6;
if(LCD_DB7)
a |= LCD_DB7 << 5;
if(LCD_DB6)
a |= LCD_DB6 << 4;
if(LCD_DB5)
a |= LCD_DB5 << 3;
if(LCD_DB4)
a |= LCD_DB4 << 2;
if(LCD_DE)
a |= LCD_DE << 1;
if(LCD_RS)
a |= LCD_RS;
LcdWireOut(a);
}
void lcd_init(void)
{
LCD_B0=0;
LCD_BKL = 1;
LCD_DE=0;
LCD_RS=0;
LCD_DB4=0;
LCD_DB5=0;
LCD_DB6=0;
LCD_DB7=0;
UpdLcdWire();
delay_ms(50);//wait for LCD internal initialization
lcd_init_write(0x30);
lcd_init_write(0x30);
lcd_init_write(0x30);
lcd_init_write(0x20);//set 4-bit mode
lcd_write_command(0x28);//4 bit mode, 2 strings
lcd_write_command(0x04);//AC=decrement, S=no shift screen
lcd_write_command(0x85);
lcd_clear();
}
void lcd_init_write(char cmd)
{
LCD_DE=0;
LCD_RS=0;//command mode
LCD_DB4=(cmd&16)>>4;
LCD_DB5=(cmd&32)>>5;
LCD_DB6=(cmd&64)>>6;
LCD_DB7=(cmd&128)>>7;
UpdLcdWire();
LCD_DE=1;
UpdLcdWire();
LCD_DE=0;
UpdLcdWire();
}
void lcd_write_command(char cmd)
{
LCD_RS=0;//command mode
lcd_send_data(cmd);
}
/// Send to data register ///
void lcd_write_data(char data)
{
LCD_RS=1;//data mode
lcd_send_data(data);
}
/// Send prepared data ///
void lcd_send_data(unsigned char dta)
{
LCD_DE=0;
LCD_DB4=(dta&16)>>4;//out higher nibble
LCD_DB5=(dta&32)>>5;
LCD_DB6=(dta&64)>>6;
LCD_DB7=(dta&128)>>7;
LCD_DE=1;//latch-up
UpdLcdWire();
LCD_DE=0;
UpdLcdWire();
LCD_DB4=(dta&1);//out lower nibble
LCD_DB5=(dta&2)>>1;
LCD_DB6=(dta&4)>>2;
LCD_DB7=(dta&8)>>3;
LCD_DE=1;
UpdLcdWire();
LCD_DE=0;
UpdLcdWire();
}
void lcd_putchar(char chr)
{
#ifdef WithoutXYControl
if(chr<31)
return;
#else
if((chr<31)||(lcd_x_cnt>=20))
return;
#endif
lcd_write_data(chr);
#ifndef WithoutXYControl
lcd_x_cnt+=1;
#endif
}
void lcd_puts(char *str)
{
char k;
while (k=*str++) lcd_putchar(k);
}


Прекрасно это все реализуется одной примитивной микрухой 74hc595. более того я так делал и оно работает!точно два провода, вместе с питанием?

Управление HD44780 по линии питания