Ovládání LCD MC0802A pomocí tří signálů? Posuvné registry?

Zdravím, potřeboval bych LCD MC0802A-SYL/H připojit k MCU. Můj problém je v tom že už mám k dispozici pouze tři volné piny. Jediné co mě napadá je využití posuvných registrů. Je to takto možné? Máte s tím někdo zkušenosti?

:arrow_right: administrator: přejmenováno z "Ovládání LCD pomocí tří signálů"

pouzi posuvny register napr 4094 a este ti zvysi 1 pin na ovladanie podsvietenia :smiley:

dík…jak jsem si koukal tak potřebuje 3 řídící signály takže by to mělo být oki. A ještě jsem se chtěl zeptat jak hodně se tím zkomplikuje program pro zobrazování údajů na LCD.

Ale to už ti nezbude nic na ovládání E a RS u LCD.

som v tom ze podporuje HD44780 ci ako sa to vola tj aj 4bit komunikaciu …<<<< ???

velmi sa neskomplikuje. ak sa bavime o mojej verzii tak poslel 8bit slovo do radica…

unsigned char r1=0;

#define bsf_RS (bsfr(0))
#define bsf_E (bsfr(2))
#define bsf_RW (bsfr(1))

#define bsf_DB4 (bsfr(4))
#define bsf_DB5 (bsfr(5))
#define bsf_DB6 (bsfr(6))
#define bsf_DB7 (bsfr(7))

#define bcf_RS (bcfr(0))
#define bcf_E (bcfr(2))
#define bcf_RW (bcfr(1))

#define bcf_DB4 (bcfr(4))
#define bcf_DB5 (bcfr(5))
#define bcf_DB6 (bcfr(6))
#define bcf_DB7 (bcfr(7))

#define ledoff (bsfr(3));
#define ledon (bcfr(3));

#define bsfr(pins) r1 |= 1<<pins //nastav bit
#define bcfr(pins) r1 &= ~(1<<pins) //nuluj bit

#define bsf_clk (bsf(PORTD,PD1))
#define bsf_dat (bsf(PORTD,PD2))
//#define bsf_str (bsf(PORTD,PD0))
#define bsf_str (bsf(PORTB,PB6))

#define bcf_clk (bcf(PORTD,PD1))
#define bcf_dat (bcf(PORTD,PD2))
//#define bcf_str (bcf(PORTD,PD0))
#define bcf_str (bcf(PORTB,PB6))

#define bsf(port,pin) port |= 1<<pin //nastav bit
#define bcf(port,pin) port &= ~(1<<pin) //nuluj bit
#define negb(port,pin) port ^= 1<<pin //neguj bit

#define wrcmd(data) (bcf_RS);wrdata(data)

unsigned char cmd=2;

//;LCD********
void prenosLCD (void) //;prenosLCD
{
unsigned char a;

for(a=0b10000000;a>0;a>>=1)
	{
bcf_clk;
bcf_dat;
if	(r1&a)	 
bsf_dat; 
bsf_clk;
	}
		
bsf_str;
_delay_us(2);
bcf_str;
_delay_us(2);
return;
}

//++++++++++++++ podprogram prenosu do lcd ++++++++++++++++

void wrdata(unsigned char data)
{ unsigned char a,i=0b10000000;

for (a=0;a<cmd;a++)
      	{
		 bcf_DB4;
		 bcf_DB5;
		 bcf_DB6;
		 bcf_DB7;
		 if	(i&data) bsf_DB7;
		 i>>=1;
		 if	(i&data) bsf_DB6;
		 i>>=1;
		 if	(i&data) bsf_DB5;
		 i>>=1;
		 if	(i&data)bsf_DB4;			 			
		 i>>=1;
		 bsf_E;
		 prenosLCD();
		 bcf_E;
		 prenosLCD();
		} 

_delay_us(40);
bsf_RS; 
return;
}

//*********************************************************************
//---------------------------------------------------------------------

void inilcd (void)
{ _delay_ms(15);
cmd=1;
wrcmd(0x20); //4 bit comunikacia
cmd=2;
wrcmd(0x28); //5x7,2 riadky
wrcmd(0x01); //zmaze displey
_delay_ms(4);
wrcmd(0x0C); //zapne displey
wrcmd(0x06); //normlny mod inkrement.
_delay_ms(4);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

no asi budu muset i E a RS napojit na ten register…

Použil bych 74HC595 (SPI, pouze zápis) nebo MCP23008 (I2C, plnohodnotný port), podobných obvodů je hodně, stačí si jen vybrat.

Osobně jsem realizoval projekt, kde ovládám LCD přes I2C 8bit bránu (MCP23008) se 4bit datovou sběrnicí LCD + 4bit řízení = 8bit, I2C jsem v projektu využíval hojně, nebyl důvod nevyužít ho i na LCD.

Pokud si napíšeš “drivery” můžeš v programu komunikovat s LCD jako s LCD se standartní 8bit sběrnicí.

SPI ani I2C k dispozici nemám. Ale udělat si třeba SPI softvérově by neměl být zas tak velekej problém.

Atlan:
jestli to dobře chápu, tak bude potřeba pro zapsání jednoho byte do LCD čtyřikrát naplnit posuvný registr, je to tak ?
Nebude komunikace příliš pomalá ?

No tak když použiješ tu 595-ku, tak ti stačej 3 piny: data, clock a latch, přičemž data a clock můžeš v aplikaci využívat ještě s něčím jiným … třeba jako dva z pinů datové sběrnice atd…

taky se dají data i clock ovládat jedním pinem :wink:

dají, ale k čemu to potom bude? :slight_smile:

když se šetří piny tak jsem chtěl nastínit že to jde i takhle. A mimochodem, se dá celý LCD ovládat pomocí jednoho pinu :wink::wink:

a bez použití pinů to náhodou taky nejde? :slight_smile:

Jinak určitě by mě zajímalo, jak to funguje s použitím pouze 1 pinu? :slight_smile:

Když zkombinuješ tyto dvě možnosti
zajic.cz/comptest/comptest.pdf

zajic.cz/esr/esr_metr.pdf

Ano 4 x. Ale to neriesim relativne sa to tam da nasukat dost rychlo. Urcite rychlejsie ako to zvladne spracovat ten displej. A ide o zobrazovanie tj zapisujes len ked potrebujes. Ak potrebujes rychlost tak si vyhrad piny na to . Zapisuje to ta max rychlostou caka sa len 2 x 2 us aj to by sa snad dalo zmenit treba vyskusat.