LCD modulio prijungimas prie mikrokontrolerio naudojant 2 laidus

Daugelyje atvejų gali iškilti situacija, kai nebeužtenka mikrokontrolerio išvadų LCD valdymui. Kaip žinia LCD gali būti valdomas 4 arba 8 bitu režimais. Pirmu atveju reika bent 6 mikrokontrolerio kojų,o kitu – bent 10 (skaitoma, kad LCD išvadas RW įžemintas).

Siūlau išbandyti LCD jungimo variantą, kuriame tarp kontrolerio ir LCD stovi paprasčiausias nuoseklus-lygiagretus postūmio registras 74HC164. Pavyzdyje yra pateikiamas konkreti realizuota ir išbandyta schema su Atmega8 mikrovaldiliu.

LCD_Schema.png

  1. pav. LCD modulio jungimo schema.

Kaip matote iš pateiktos schemos registrui valdyti pakanka dviejų mikrovaldiklio išvadų: PC0 – dauomenims perduoti ir PC1- sinchronizavimui. Regsitro išvadai atitinkamai sujungti su LCD moduliu:

Q0 ->NC

Q1 ->LCD_D7

Q2 ->LCD_D6

Q3 ->LCD_D5

Q4 ->LCD_D4

Q5 ->NC

Q6 ->LCD_RS

Q7 ->LCD_E

Kodėl būtent toks jungimas ir kodėl Q0 registro išvadas paliktas neprijungtas? Visa esmė susiveda į LCD E (Enable) išvado valdymą. Kadangi Registro perkrovimo išvadas R yra šiuo atveju nevaldomas, tai registro išvalymas vyskta siunčiant „0“ per 8 ciklus. Valant registrà esami duomenys yra išstumiami lauk pro E išvadà. O reikia kad šie duomenys nepaveiktų LCD E išvado, kitaip valdymas tampa neįmanomas.

Laikines.png

2 pav. LCD valdymo laikinës diagramos

Kad išvengti daugkartinio signalo padavimo į LCD E išvadą shemoje yra naudojamas diodas, kuris atlieka AND elemento vaidmenį. Veikimas paprastas: LCD E signalas bus aukšto lygio „1“ jeigu duomenų linijoje (PC0) ir registro Q7 lygiai bus „1“ jeigu bent vienas iš jų bus „0“ tai į LCD E išvadą bus paduodamas „0“ nes pavyžiui esant tik Q7 „1“ tai jo signalas yra blokuojamas diodo, jeigu tik PC0 yra „1“, o Q7 „0“, tai įtampa kris ant diodo ir liks apie 0,6V kuris LCD išvadui reikš „0“.

Laikinėje diagramoje galite matyti, kokie signalai dalyvauja LCD valdyme: pirmiausia yra išvalomas registras siunčiant 8 sinchroimpulsus kai duomenų linijoje yra „0“, po to yra siunčiamas baitas su sekančiais sinchroimpulsais. Ir paskutiniu etapu yra valdomas LCD E išvadas paduodant „1“ į duomenų kanalą be sinchro impulso kuris kartu su su Registro Q7 loginiu vienetu valdo LCD E išvadą.

Žemiau pateikiu algoritmą, kuris yra išbandytas ir veikia. O archyve pateikiu WinAVR visus reikiamus failus (programos failą, Makefile, hex) reikalingus tolimesniam tobulinimui.

/*********************

#include <inttypes.h>

#include <avr/io.h>

#include <avr/interrupt.h>

#include <avr/signal.h>

#include <avr/delay.h>

#include <avr/iom8.h>

#define datapin 0 // duomenų išvadas iš atmega8 į 74HC164

#define clockpin 1 // sinchronizacijos išvadas iš atmega8 į 74HC164

/*

LCD Jungimas prie 74HC164:

Q0 ->NC

Q1 ->LCD_D7

Q2 ->LCD_D6

Q3 ->LCD_D5

Q4 ->LCD_D4

Q5 ->NC

Q6 ->LCD_RS

Q7 ->LCD_E

*/

void atmega8init(void)

{

PORTC&=~((1<<datapin)|(1<<clockpin));//Nustatome nulius á PC0 ir PC1

DDRC|=(1<<datapin)|(1<<clockpin);//Nustatome C porto išvadus kaip išejimus

}

void sendByteToLCD(uint8_t LCDdata)

{

uint8_t i, temp;

PORTC&=~_BV(datapin); // duomenų išvada nustatome į „0“

for (i=0;i<=7;i++) //Išvalome 74HC164 registrą

{

PORTC|=_BV(clockpin);

_delay_ms(1);

PORTC&= ~_BV(clockpin);

_delay_ms(1);

}

temp=LCDdata;

for (i=0;i<=7;i++) //siunèiame 8bitus į 74HC164 registrą

{

PORTC |= (LCDdata&1);

_delay_ms(1);

PORTC |= _BV(clockpin);

_delay_ms(1);

PORTC&= ~_BV(clockpin);

_delay_ms(1);

PORTC&=~_BV(datapin);

_delay_ms(1);

LCDdata=temp>>1;

temp=LCDdata;

}

PORTC|=_BV(datapin);

_delay_ms(10);

PORTC&=~_BV(datapin);

}

void sendChar(uint8_t topack) //Simbolio siuntimo į LCD procedûra

{

uint8_t packed, temp;

temp=topack;

packed=((temp>>1)&0x78)|0x03;

sendByteToLCD(packed);

_delay_ms(1);

packed=(((temp<<3)|0x03)&0x7F);

sendByteToLCD(packed);

_delay_ms(1);

}

void sendCommand(uint8_t topack) //Komandos siuntimo į LCD procedûra

{

uint8_t packed, temp;

temp=topack;

packed=((temp>>1)&0x78)|0x01;

sendByteToLCD(packed);

_delay_ms(1);

packed=(((temp<<3)|0x01)&0x7F);

sendByteToLCD(packed);

_delay_ms(1);

}

void LCDinit(void)

{

_delay_ms(30); //LCD inicializavimas

sendByteToLCD(0x19);//1

_delay_ms(5);

sendByteToLCD(0x19);//2

_delay_us(150);

sendByteToLCD(0x19);//3

_delay_ms(10);

sendByteToLCD(0x11);//siunciamas valdymo signalas įgalinantis 4 bitų režimą

_delay_ms(5);

sendCommand(0x28);

sendCommand(0x2C);

sendCommand(0x0F);

sendCommand(0x01);

}

int main (void)

{

atmega8init();

LCDinit();

sendChar(‘T’);

sendChar(‘E’);

sendChar(‘S’);

sendChar(‘T’);

sendChar(‘!’);

for (;;)

return (0);

}

*********************/

Sėkmės.

Projekto bylos guli 2wirelcd_programa.zip:

Skelbta Elektronika Pažymėti: , , ,
One comment on “LCD modulio prijungimas prie mikrokontrolerio naudojant 2 laidus
  1. linasg parašė:

    Nelabai aisku del siunciamu komandu:
    su 0x28 kaip ir aisku: nustato 4 bitu syna, 2 eilutes, 5×7 sriftas,
    o kaip su kitomis
    0x2C
    0x0F
    0x01 -> isvalo ekrana
    nes as gaunu visai kitokias reiksme pagal mane tai 0x2C turetu buti 0x0C, 0x0F-> 0x07
    ar as cia kazko nesuprantu….?

Parašykite komentarą