Jump to content
ELFORUM - Forumul electronistilor

Interfata LCD in HI-TECH C compiler


Guest jerry7

Recommended Posts

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
  • Replies 3
  • Created
  • Last Reply

Top Posters In This Topic

  • Liviu M

    1

  • MatyC

    1

Top Posters In This Topic

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 RA1
La 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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines