Многие, кто подключал Arduino к ЖК-дисплею с параллельным интерфейсом, знают, что для этого требуется 6 линий ввода/вывода. Теперь давайте посмотрим, как мы можем уменьшить количество требуемых линий ввода/вывода с помощью сдвигового регистра 74HC595. Конечно, мы можем уменьшить количество требуемых линий ввода/вывода, используя интерфейсную схему ЖК-дисплея с интерфейсом I2C, но она стоит в десять раз дороже 74HC595.

В этой схеме мы используем сдвиговый регистр 74HC595 для управления ЖК-дисплеем 16 × 2.

Для установки контрастности ЖК-дисплея используется постоянный резистор 1 кОм, обеспечивающий оптимальное значение контрастности. Подключите линию R/W к земле, так как мы не собираемся считывать данные с ЖК-дисплея. Также в нашем случае дисплей подключен в 4-битном режиме.
Далее приведен код Arduino для управления ЖК-дисплеем по трем проводам с помощью сдвигового регистра 74HC595. Здесь мы не используем какую-либо библиотеку для взаимодействия с ЖК-дисплеем.
// Определяем линии 74HC595
const int Clock=7;
const int Data=6;
const int Latch=5;
void LCDinit(void);
void LCDSendByte(char d,char RS);
void LCDPrint(char Line,char string[16]);
//=============================================================
// Настройка
//=============================================================
void setup() {
// Цифровые линии на вывод данных
pinMode(Data, OUTPUT);
pinMode(Clock, OUTPUT);
pinMode(Latch, OUTPUT);
LCDinit(); // Инициализация ЖК-дисплея в 4-битном режиме
}
//=============================================================
// Бесконечный цикл
//=============================================================
void loop() {
LCDPrint(0,"Digitrode");
LCDPrint(1,"Hello There");
delay(500);
}
//=============================================================
// Отправка данных или команд в ЖК-дисплей
//=============================================================
void LCDSendByte(char d,char RS)
{
char dH,dL,temp;
dH = d & 0xF0;
dL = d & 0x0F;
dL = d << 4;
temp=0;
temp=dH | RS | 0x02;
ShiftData(temp);
temp=0;
temp=dH | RS;
ShiftData(temp);
temp=0;
temp=dL | RS | 0x02;
ShiftData(temp);
temp=0;
temp=dL | RS;
ShiftData(temp);
}
//=============================================
void ShiftData(char temp)
{
int i;
for(i=0;i<8;i++)
{
if((temp & 0x80)==0x80) // Отправляем 1 бит в регистр сдвига
{digitalWrite(Data,HIGH);}
else
{digitalWrite(Data,LOW);}
digitalWrite(Clock,LOW);
digitalWrite(Clock,HIGH);
temp=temp<<1;
}
digitalWrite(Latch,LOW);
delay(1);
digitalWrite(Latch,HIGH);
}
//=================================================================
// Функция инициализации ЖК-дисплея
//=================================================================
void LCDinit()
{
int count;
char t[]={0x43,0x03,0x03,0x02,0x28,0x01,0x0C,0x06,0x02,0x02};
for (count = 0; count <= 9; count++)
{
LCDSendByte(t[count],0);
}
}
//=================================================================
// Функция установки строка ЖК-дисплея в желаемом месте
//=================================================================
void LCDPrint(char Line,char string[16])
{
int len,count;
if(Line==0) {
LCDSendByte(0x80,0);
}
else {
LCDSendByte(0xC0,0);
}
len = strlen(string);
for (count=0;count<len;count++)
{
LCDSendByte(string[count],1); //Data RS=1
}
}
© digitrode.ru