Vizitator jerry7 Postat Februarie 19, 2012 Partajează Postat Februarie 19, 2012 Salut! As avea nevoie de putin ajutor in intelegerea unei interfete al "PIC"-ului cu un LCD 2x16...de fapt codul este scris de catre cei de la HI-TECH C (bineinteles in limbajul C) si vine in directorul de exemple al acestuia: Una din nelamuriri ar fii: ce mai exact face fctia asta: strobe() si de ce apare c-am asa: LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0)) Nu inteleg de ce LCD_EN este initializat cu 1 ca apoi sa treaca in 0 ...care e logica ei? Mai jos am atasat intreg codul, sper ca e OK /* * LCD interface example * Uses routines from delay.c * This code will interface to a standard LCD controller * like the Hitachi HD44780. It uses it in 4 bit mode, with * the hardware connected as follows (the standard 14 pin * LCD connector is used): * * PORTD bits 0-3 are connected to the LCD data bits 4-7 (high nibble) * PORTA bit 3 is connected to the LCD RS input (register select) * PORTA bit 1 is connected to the LCD EN bit (enable) * * To use these routines, set up the port I/O (TRISA, TRISD) then * call lcd_init(), then other routines as required. * */ #ifndef _XTAL_FREQ // Unless specified elsewhere, 4MHz system frequency is assumed #define _XTAL_FREQ 4000000 #endif #include #include "lcd.h" #define LCD_RS RA3 #define LCD_RW RA2 #define LCD_EN RA1 #define LCD_DATA PORTD #define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0)) /* write a byte to the LCD in 4 bit mode */ void lcd_write(unsigned char c) { __delay_us(40); LCD_DATA = ( ( c >> 4 ) & 0x0F ); LCD_STROBE(); LCD_DATA = ( c & 0x0F ); LCD_STROBE(); } /* * Clear and home the LCD */ void lcd_clear(void) { LCD_RS = 0; lcd_write(0x1); __delay_ms(2); } /* write a string of chars to the LCD */ void lcd_puts(const char * s) { LCD_RS = 1; // write characters while(*s) lcd_write(*s++); } /* write one character to the LCD */ void lcd_putch(char c) { LCD_RS = 1; // write characters lcd_write( c ); } /* * Go to the specified position */ void lcd_goto(unsigned char pos) { LCD_RS = 0; lcd_write(0x80+pos); } /* initialise the LCD - put into 4 bit mode */ void lcd_init() { char init_value; ADCON1 = 0x06; // Disable analog pins on PORTA init_value = 0x3; TRISA=0; TRISD=0; LCD_RS = 0; LCD_EN = 0; LCD_RW = 0; __delay_ms(15); // wait 15mSec after power applied, LCD_DATA = init_value; LCD_STROBE(); __delay_ms(5); LCD_STROBE(); __delay_us(200); LCD_STROBE(); __delay_us(200); LCD_DATA = 2; // Four bit mode LCD_STROBE(); lcd_write(0x28); // Set interface length lcd_write(0xF); // Display On, Cursor On, Cursor Blink lcd_clear(); // Clear screen lcd_write(0x6); // Set entry Mode } Link spre comentariu
MatyC Postat Februarie 20, 2012 Partajează Postat Februarie 20, 2012 Una din nelamuriri ar fii: ce mai exact face fctia asta: strobe() si de ce apare c-am asa:LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))Nu inteleg de ce LCD_EN este initializat cu 1 ca apoi sa treaca in 0 ...care e logica ei?Logica functiei se intelege daca cunosti cum lucreaza afisajul LCD alfanumeric. In cazul de fata este vorba de un LCD bazat pe controlerul HD44780 sau derivat din el. Intrebare: ce se intampla in situatia cand pe intrarile D0-D7 de la LCD se tot modifica anapoda? Cum faci sa nu afiseze cine stie ce dar nimic util? Pentru a evita astfel de fenomene sa adaugat la controler un pin de confirmare ENABLE sau EN prescurtat. In datasheet-ul lui HD44780 se specifica ca dupa ce pregatesti biti pe portul de intrare trebuie facuta o confirmare prin activare pinului EN. Trebuie un impuls scurt. In exemplul de mai sus pinul EN se conecteaza la pinul RA1 din PIC16.#define LCD_EN RA1La display sunt doua tipuri de informatii care se transmit: comenzi si date de afisat. Diferentierea se face cu pinul RS (Register Selelect). Link spre comentariu
Vizitator jerry7 Postat Februarie 20, 2012 Partajează Postat Februarie 20, 2012 Va multumesc de ajutor! Link spre comentariu
Liviu M Postat Februarie 20, 2012 Partajează Postat Februarie 20, 2012 Strobe e semnalul care ii zice "acum" LCD-ului, semnalul care determina actualizarea datelor in LCD (banui ca e clockul registrului de intrare in LCD). Pana cand LCD-ul nu primeste un semnal strobe, nu modifica nici un pixel pe "ecran"/nici un registru indiferent de ce se intampla pe ceilalti pini. Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum