Guest jerry7 Posted February 19, 2012 Share Posted February 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 to comment
MatyC Posted February 20, 2012 Share Posted February 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 to comment
Guest jerry7 Posted February 20, 2012 Share Posted February 20, 2012 Va multumesc de ajutor! Link to comment
Liviu M Posted February 20, 2012 Share Posted February 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 to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now