Серийно управление на Трипроводен LCD дисплей чрез Преместващ регистър

Източник:  electronics-lab.com

Автор:  Rajendra Bhatt

Превод: Т.Б.

ВЪВЕДЕНИЕ Символният LCD дисплей HD44780, изисква най-малко 6 Входно/Изходни линии от микроконтролера, за да визуализира информация. Затова, те не са подходящи за ниско-изводните микроконтролери като например серията PIC12F. В този проект, ще Ви покажа как да управлявате LCD дисплея HD44780 със само 3-извода от микроконтролера. Ще Ви демонстрирам това чрез микроконтролера на Microchip PIC12F683. Символната информация и командите от микроконтролера се пренасят последователно към преместващ регистър (74HC595), а съответно паралелния изход от преместващия регистър се подава към изводите на LCD дисплея.

Относно 74HC595 74HC595 е високоскоростен 8-битов преместващ регистър, с сериен вход, с паралелен/сериен изход, със регистър за съхранение и 3-стъпални изходи.  

Преместващият регистър и регистрите за съхранение разполагат с отделни тактови входове, респективно SH_CP и ST_CP. Информацията в преместващия регистър се премества по време на нарастващите фронтове на тактовия сигнал SH_CP, и съдържанието на преместващия регистър ще бъде доставено на регистъра за съхранение при нарастващ фронт на ST_CP. Ако ние свържем двата сигнала заедно, преместващият регистър ще бъде само една честота напред пред регистъра за съхранение. Осем битовата информация от регистърът за съхранение ще се появи на паралелните изходи (Q0-Q7), когато на извод „OE“ (Output Enable) има ниско логическо ниво. В този проект, тактовите изводи SH_CP и ST_CP са свързани заедно (накъсо). Така, ако желаем да получим серийно предадена 8-битова информация в паралелна форма от изводите Q0-Q7, ще ни бъде необходим един допълнителен тактов сигнал след предаването на 8-битовата информация, тъй като двата тактови входа са свързани заедно, а регистъра за съхранение изостава с една честота зад преместващия регистър.

HD44780-Символен LCD дисплей Всички LCD символни дисплеи HD44780 се свързват посредством 14 проводника: 8 информационни линии (D0-D7), 3 линии за контрол (RS, E, R/W), и три токозахранващи линии (Vdd, Vss, Vee). Някои LCD дисплеи, може да разполагат с Светодиодна (LED) подсветка, затова може да имат и допълнителни изводи (обикновенно две: LED+ и LED-).

 

Обяснението целта на на всеки конкретен пин не е задача на този проект. Ако сте начинаещ при работата с LCD дисплеи, Ви препоръчвам да прочетете първо тези две статии от списанието Everyday Practical Electronics: Как да използваме интелигентните LCD дисплеи

Част 1:      http://lcd-linux.sourceforge.net/pdfdocs/lcd1.pdf

Част 2:      http://lcd-linux.sourceforge.net/pdfdocs/lcd2.pdf

Принципна схема

Хардуерната част на проекта е съвсем проста. Предизвикателството тука е да напишете софтуер за управление (т.нар драйвер), който е отговорен за правилната поредица от операции, които се изискват, за да предадете серийно символна информация и командите към преместващия регистър 74HC595. Паралелните изходи на преместващият регистър след това се свързват към информационните линии (шини) на LCD дисплея (D4-D7) и контролния извод RS. Тази подредба изисква 3-извода от микроконтролера, за да визуализира символна информация върху паралелен LCD дисплей: 2 извода за осигуряване на тактуването и информацията към 74HC595,и 1-извод за Разрешаване на Контрола (E) на LCD модула. Тъй като информационният обмен използва 4-битов режим, всяка 8-битова команда или символна-информация се изпраща последователно на две стъпки. Изводът за четене/запис е заземен, и затова не е възможно да се прочете никаква информация или статус от LCD модула в този случай.

 

/* 3-wire Serial LCD using 74HC595
Rajendra Bhatt, Sep 6, 2010
*/

sbit Data_Pin at GP5_bit;
sbit Clk_Pin at GP1_bit;
sbit Enable_Pin at GP2_bit;

// Always mention this definition statement
unsigned short Low_Nibble, High_Nibble, p, q, Mask, N,t, RS, Flag, temp;

void Delay_50ms(){
Delay_ms(50);
}

void Write_LCD_Nibble(unsigned short N){
Enable_Pin = 0;
// ****** Write RS *********
Clk_Pin = 0;
Data_Pin = RS;
Clk_Pin = 1;
Clk_Pin = 0;
// ****** End RS Write

// Shift in 4 bits
Mask = 8;
for (t=0; t<4; t++){
Flag = N & Mask;
if(Flag==0) Data_Pin = 0;
else Data_Pin = 1;
Clk_Pin = 1;
Clk_Pin = 0;
Mask = Mask >> 1;
}
// One more clock because SC and ST clks are tied
Clk_Pin = 1;
Clk_Pin = 0;
Data_Pin = 0;
Enable_Pin = 1;
Enable_Pin = 0;
}
// ******* Write Nibble Ends

void Write_LCD_Data(unsigned short D){
RS = 1; // It is Data, not command
Low_Nibble = D & 15;
High_Nibble = D/16;
Write_LCD_Nibble(High_Nibble);
Write_LCD_Nibble(Low_Nibble);
}

void Write_LCD_Cmd(unsigned short C){
RS = 0; // It is command, not data
Low_Nibble = C & 15;
High_Nibble = C/16;
Write_LCD_Nibble(High_Nibble);
Write_LCD_Nibble(Low_Nibble);
}

void Initialize_LCD(){
Delay_50ms();
Write_LCD_Cmd(0x20); // Wake-Up Sequence
Delay_50ms();
Write_LCD_Cmd(0x20);
Delay_50ms();
Write_LCD_Cmd(0x20);
Delay_50ms();
Write_LCD_Cmd(0x28); // 4-bits, 2 lines, 5×7 font
Delay_50ms();
Write_LCD_Cmd(0x0C); // Display ON, No cursors
Delay_50ms();
Write_LCD_Cmd(0x06); // Entry mode- Auto-increment, No Display shifting
Delay_50ms();
Write_LCD_Cmd(0x01);
Delay_50ms();
}

void Position_LCD(unsigned short x, unsigned short y){
temp = 127 + y;
if (x == 2) temp = temp + 64;
Write_LCD_Cmd(temp);
}

void Write_LCD_Text(char *StrData){
q = strlen(StrData);
for (p = 0; p temp = StrData[p];
Write_LCD_Data(temp);
}

}

char Message1[] = „3-Wire LCD“;
char Message2[] = „using 74HC595“;

void main() {
CMCON0 = 7; // Disable Comparators
TRISIO = 0b00001000; // All Outputs except GP3
ANSEL = 0x00; // No analog i/p

Initialize_LCD();

do {
Position_LCD(1,4);
Write_LCD_Text(Message1);
Position_LCD(2,2);
Write_LCD_Text(Message2);
Delay_ms(1500);
Write_LCD_Cmd(0x01); // Clear LCD
delay_ms(1000);
} while(1);

}

 Тестване на Схемата и Резултат

>>>  Свали в DOC формат от тук (в оригинал на английски език)  <<<