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.

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.

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:
Komentarai
Skelbti naują komentarą