Sari la conținut
ELFORUM - Forumul electronistilor

pic si lcd


aghora17

Postări Recomandate

ai folosit si reset-ul soft, (initializarea "totala")eventual fara test de busy, timing-ul din DS 44780cum arata display-ul neinitializat? trebuie sa ai innegrit primul rand(la mine asa era).

Acum am incercat resetul soft folosind timingurile care le-am gasit intr-un alt cod destinat unui LCD cu controler identic cu acesta KS0066U. Si degeaba... Tot ramane innegrit primul rand.
Link spre comentariu
  • Răspunsuri 33
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • aghora17

    8

  • Filipone

    6

  • diaconuliviu

    3

  • cristianp

    2

ai folosit si reset-ul soft, (initializarea "totala")eventual fara test de busy, timing-ul din DS 44780cum arata display-ul neinitializat? trebuie sa ai innegrit primul rand(la mine asa era).

Acum am incercat resetul soft folosind timingurile care le-am gasit intr-un alt cod destinat unui LCD cu controler identic cu acesta KS0066U. Si degeaba... Tot ramane innegrit primul rand.
Daca mi se permite rectificarea... MERGEEEE! De fapt era un "b" uitat de mine la setarea "trisb" si mi-am dat seama ca era ceva in neregula cu ajutorul unui Debugger fain de tot: Voltmetrul (aveam pinul RS in permanenta 1 logic ). Multumesc pentru ajutor!Bitul busy il citeste foarte bine si am observat diferenta intre comanda folosind delay-uri si folosind flag-ul BUSY, adica de la melc la Speedy Gonzales. :shock:
Link spre comentariu

pai da-ne si noua codul (doar partea de lcd, ca sa nu mor prost degeaba)

Asta este codul. Eu folosesc compilatorul acesta: http://www.picant.com/c2c/download.html . Nu cred ca iti va veni greu sa transformi codul C in asm daca nu folosesti compilatoare C. BAFTA!

 

MAIN

lcd_reset();//Reset prin instructiunilcd_init();//Initializare interfata, display, cursor.. etclcd_putstr("FORUM IZATECH");
RUTINE LCD

 

DB7-DB0 sunt legati la PORTCRS legat la PORTB.3R/W legat la PORTB.4E legat la PORTB.5 const char on = 1;const char off = 0;void delayms(char nr); // Asteapta nr milisecunde folosind tmr0void lcd_init(); // Initializeaza LCD-ulvoid lcd_rs(char set); // Controleaza pinul RS al LCD-uluivoid lcd_rw(char set); // Controleaza pinul R/W al LCD-uluivoid lcd_e(char set); // Controleaza pinul E al LCD-uluivoid test_busy(); // Verifica Flag Busyvoid lcd_putcmd(char cmd);// Trimite comanda LCD-uluivoid lcd_putchar(char chr);// Scrie un caractervoid lcd_reset(); // Reseteaza LCD-ulvoid lcd_putstr( const char *lcdptr );// Scrie un string pe afisajvoid lcd_rs(char set){	if (set == on)	{		set_bit(portb, 3);	}	else	{		clear_bit(portb, 3);	}}void lcd_rw(char set){	if (set == on)	{		set_bit(portb, 4);	}	else	{		clear_bit(portb, 4);	}}void lcd_e(char set){	if (set == on)	{		set_bit(portb, 5);	}	else	{		clear_bit(portb, 5);	}}void lcd_putcmd(char cmd){	test_busy();	portc = cmd;	lcd_rs(off);	lcd_rw(off);	lcd_e(on);	lcd_e(off);}void test_busy(){	char busy;	busy = 1;// presupunem ca este ocupat		char buf; // buffer pentru busy flag	buf = 0;		trisc = 0xFF; //pinii legati la DB7-DB0 sunt setati ca intrare	while(busy == 1) // atata timp cat este ocupat stai in bucla	{		lcd_rs(off);		lcd_rw(on);// setezi rs si r/w pentru citirea Flag-ului 		lcd_e(on);// ridici linia E		buf = portc; // incarci intr-un buffer ce ti-a trimis LCD-ul		lcd_e(off);// cobori linia E		if ((buf & 10000000b) == 10000000b) // testezi daca bitul 7 din buffer este 1		{			busy = 1; // daca da lcd-ul este ocupat		}		else		{			busy = 0; // daca nu lcd-ul este liber si iesi din bucla		}	}	lcd_rw(off);// setezi inapoi rw = 0 pentru scriere	trisc = 0;// portul c este configurat ca iesire}void lcd_reset(){	lcd_e(off);	lcd_rw(off);	lcd_rs(off);		delayms(100);	portc = 00110000b;//DB7-DB0 = 00110000b		lcd_e(on);	delayms(5);	lcd_e(off);	delayms(200);		lcd_e(on);	delayms(5);	lcd_e(off);	delayms(50);		lcd_e(on);	delayms(5);	lcd_e(off);	delayms(10);}void lcd_init(){	lcd_putcmd(00111000b);		delayms(1);		lcd_putcmd(00001100b);		delayms(1);		lcd_putcmd(00000001b);		delayms(1);		lcd_putcmd(00000110b);		delayms(1);	}void lcd_putchr(char chr){	test_busy();	portc = chr;	lcd_rs(on);	lcd_rw(off);	lcd_e(on);	lcd_e(off);	lcd_rs(off);}void lcd_putstr( const char *lcdptr ){  char pi;  pi = 0;                                            // Check for end of string    while( lcdptr[pi] !=  0 )         {            lcd_putchr( lcdptr[pi++] );// Display on LCD          }} void lcd_putnr(int nr){	lcd_putchr('0'+nr/100);	nr = nr % 100;	lcd_putchr('0'+nr/10);	lcd_putchr('.');	lcd_putchr('0'+nr%10);}

EDITAT: Vroiam sa fie o supriza.. oricum o sa mai postez in sectiunea DIY codul complet cu schema, poze etc... deoarece am o promisiune mai veche de respectat (Cristiano stie despre ce este vorba :d)

Link spre comentariu

cred ca as prefera varianta hex. e mai simplu.

Eu cred ca nu e mai simplu deoarece codul apartine unei aplicatii mai mari (adica butoane, adc-uri etc) si hexul generat nu va contine doar rutina de lcd.Daca tot nu te descurci cu codul de C fac in pseudo-cod (un limbaj mai pe intelesul tuturor) pasii de initializare ai LCD-ului, o descriere mai amanuntita a interfetei de comanda (inclusiv cum sa testezi flag-ul BUSY) sau mai pot sa iau ASM-ul creat de compilator si sa extragi tu portiunile pentru LCD.Cum doresti!EDITAT: Am adaugat comentarii la codul de mai sus in functia test_busy().
Link spre comentariu

sal...sory ca ma bag shi eu un pic cam offtopic dar stie careva vre-un program mai complet in asm (eventual shi cu cateva explicatii) sa scrie ceva pe modulul lcd conectat pe 4 biti la un PIC16F84?mi-ar trebui sa fie complet sa pot intelege si eu ceva (sa fie si rutinele de initializare, delay, etc)am gasit pe la aplicatii la microchip sau la mikroelektronika insa programu e separat de subrutinele de initializare, uneori cu notatii diferite si nu inteleg nimic

Link spre comentariu

Am si eu nevoie de datasheetul afisorului PVC 160203P, il are cineva?Am o schema de stroboscop care utilizeaza PIC 16F628 si "LCD 2x16 paralel", nu se specifica tipul, eu am acest afisor(PVC 160203P) si conexiunile sint numerotate altfel, in plus are si doi "pini" in plus, "A" si "K".

Link spre comentariu

Pinii A si K pe care ii ai in plus sunt anod si respectiv catod pentru LED-urile de iluminare a display-ului. Le poti lasa neconectate fara nici o problema daca nu vrei iluminarea LCd-ului.

Link spre comentariu
  • 2 luni mai târziu...

Mie inca nu imi merge afisarea. Folosesc 16F876 si LCD Ampire 2x16. Conectez D0,D1,D2,D3 de la LCD cu PortB0,B1,B2,B3 de la PIC si RS,RW,EN cu C0,C1,C2. Bineinteles si alimentarile pe LCD.Deci vreau 4 biti mode, low. Filipone vad ca foloseste 8 biti. Tot ce vad sunt cele 16 matrici de 5x8 pixeli afisate pe primul rand al LCD-ului. Am incercat mai multe variante de soft, de exemplu si LCD.C din directorul "Drivers" al lui CCS PIC C compiler, dupa ce am modificat assignmenturile de pini. Si nu vrea. Recunostinta vesnica celui ce ma ajuta...

Link spre comentariu
Vizitator alex

Problema e simpla. Pentru modul 4biti se folosesc liniile D7:D4 unde D7=MSB si D4 e LSB (si nu D0:D3 asa cum ai folosit tu)

Codul postat de mine mai sus poate fi foarte usor convertit in C.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări