Sari la conținut
ELFORUM - Forumul electronistilor

Interfata LCD in HI-TECH C compiler


Vizitator jerry7

Postări Recomandate

Vizitator jerry7

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
  • Răspunsuri 3
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    1

  • MatyC

    1

Top autori în acest subiect

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 spre comentariu

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

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