LCD Rozhraní problém s 16f877a

P

pany2008

Guest
Ahoj
I am using 16x2 LCD a propojení, že se 4 bit módu, já jsem uvedení zdroje naznačují, prosím, co je špatné, na displeji se ukazuje pouze kurzor bliká, ale není to zobrazuje zprávu.

Hlavní program

# Include <pic.h>
# Include "ioports1.h"
# Include "delay.h"
# Include "lcd.h"

__CONFIG (DEBUGDIS & WDTDIS & BORDIS & PWRTDIS & HS & LVPDIS & PROTECT);

extern init_ports ();

neplatné Sec (unsigned int);

void main ()
(

init_ports ();
SEC (200);
lcd_init (); / / LCD inicializován
SEC (100);
lcd_line1 (0); / / LCD adresy uvedené v bodě LINE 1
lcd_string ("PROPOJENÍ LCD"); / / Zobrazí hlášení "LCD PROPOJENÍ"
lcd_line2 (0); / / LCD adresu uvedenou AT linka 2
lcd_string ("PIC 16F877A ");// Zobrazí hlášení" PIC 16f877a "

for (;

<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Mrknutí" border="0" />(

LED1 =! LED1;
SEC (300);
LED1 =! LED1;
SEC (300);
)
)

init_ports ()
(
T_LED1 = 0; / / PIN umožní výstup
LED1 = 1;
T_LED2 = 0; / / PIN umožní výstup
LED2 = 1;
T_LED3 = 0; / / PIN umožní výstup
LED3 = 1;
)

neplatné Sec (unsigned int ITIME)
(
unsigned int i;
unsigned char j;
pro (i = 0; i <ITIME; i )
pro (j = 0; j <165; j );
)

lcd.c kód souboru

# Include <htc.h>
# Include "lcd.h"
# Include "ioports.h"

/ / # Define LCD_RS RB6
/ / # Define LCD_RW RB5
/ / # Define LCD_EN RB4

# Define LCD_DATA PORTB

# Define LCD_STROBE () ((LCD_EN = 1), (LCD_EN = 0))

/ * Zápis byte na LCD v režimu 4 * bit /

neplatný
lcd_write (unsigned char c)
(
unsigned char d;

__delay_us (40);
LCD_DATA = ((c>> 4) & 0x0F);
LCD_STROBE ();
LCD_DATA = (c & 0x0F);
LCD_STROBE ();
__delay_us (40);
)

/ *
* Jasné a doma LCD
* /

neplatný
lcd_clear (void)
(
LCD_RS = 0;
lcd_write (0x1);
__delay_ms (2);
)

/ * Zápis řetězce znaků na LCD * /

neplatný
lcd_string (const char * s)
(
LCD_RS = 1; / / write znaky
while (* s)
lcd_write (* y );
)

/ * Zápis o jeden znak * LCD /

neplatný
lcd_character (char c)
(
LCD_RS = 1; / / write znaky
lcd_write (c);
)/ *
* Jděte na zadanou pozici v řádku 1
* /

neplatný
lcd_line1 (unsigned char POS)
(
LCD_RS = 0;
lcd_write (0x80 POS);
)

/ *
* Jděte na zadanou pozici v řádku 2
* /

neplatný
lcd_line2 (unsigned char POS)
(
LCD_RS = 0;
lcd_write (0xC0 POS);
)
/ *
* Jděte na zadanou pozici v řádku 3
* /

neplatný
lcd_line3 (unsigned char POS)
(
LCD_RS = 0;
lcd_write (0x94 POS);
)
/ *
* Jděte na zadanou pozici v řádku 4
* /

neplatný
lcd_line4 (unsigned char POS)
(
LCD_RS = 0;
lcd_write (0xD4 POS);
)

/ * Inicializace LCD - dát do 4 mód * bit /
neplatný
lcd_init ()
(
char init_value;

T_LCD_RS = 0; / / PIN umožní výstup
LCD_RS = 0;

T_LCD_RW = 0; / / PIN umožní výstup
LCD_RW = 0;

T_LCD_EN = 0; / / PIN umožní výstup
LCD_EN = 0;

T_LCD_D0 = 0; / / PIN umožní výstup
LCD_D0 = 0;
T_LCD_D1 = 0; / / PIN umožní výstup
LCD_D1 = 0;
T_LCD_D2 = 0; / / PIN umožní výstup
LCD_D2 = 0;
T_LCD_D3 = 0; / / PIN umožní výstup
LCD_D3 = 0;

init_value = 0x3;
/ / PORTB = 0x00;
/ / TRISB = 0x00;
LCD_RS = 0;
LCD_EN = 0;
LCD_RW = 0;

__delay_ms (15); / / wait 15mSec po moci použít,
LCD_DATA = init_value;
LCD_STROBE ();
__delay_ms (5);
LCD_STROBE ();
__delay_us (200);
LCD_STROBE ();
__delay_us (200);
LCD_DATA = 2; / / Čtyři bit režim
LCD_STROBE ();

lcd_write (0x28); / / Set interface délka
lcd_write (0xF); / / Display On, kurzor na, kurzor Blink
lcd_clear (); / / Smazat displej
lcd_write (0x6), / / Set vstupní režim
)

lcd.h

/ * Zápis byte na LCD v režimu 4 * bit /

extern neplatné lcd_write (unsigned char);

/ * Jasné a domů * LCD /

extern neplatné lcd_clear (void);

/ * Napsat řetězec znaků * LCD /

extern neplatné lcd_string (const char * s);

/ * Jděte na zadanou pozici v řádku 1 * /
extern neplatné lcd_line1 (unsigned char POS);

/ * Jděte na zadanou pozici v řádku 2 * /
extern neplatné lcd_line2 (unsigned char POS);

/ * Jděte na zadanou pozici v řádku 3 * /
extern neplatné lcd_line3 (unsigned char POS);

/ * Jděte na zadanou pozici v řádku 4 * /
extern neplatné lcd_line4 (unsigned char POS);

/ * Intialize LCD - výzva předtím, než cokoli jiného * /

extern neplatné lcd_init (void);

extern neplatné lcd_character (char);

/ * Nastavení pozice kurzoru * /

# Define lcd_cursor (x) lcd_write (((x) & 0x7F) | 0x80)

ioports.h

# Ifndef BITNUM
# Define BITNUM (ADR, bit) ((nepodepsané) (& ADR) * 8 (bit)) / / - používá se pro port defs
# Endif

statické bit LCD_RS @ BITNUM (PORTB, 6);
statické bit T_LCD_RS @ BITNUM (TRISB, 6);
statické bit LCD_RW @ BITNUM (PORTB, 5);
statické bit T_LCD_RW @ BITNUM (TRISB, 5);
statické bit LCD_EN @ BITNUM (PORTB, 4);
statické bit T_LCD_EN @ BITNUM (TRISB, 4);
statické bit LCD_D0 @ BITNUM (PORTB, 0);
statické bit T_LCD_D0 @ BITNUM (TRISB, 0);
statické bit LCD_D1 @ BITNUM (PORTB, 1);
statické bit T_LCD_D1 @ BITNUM (TRISB, 1);
statické bit LCD_D2 @ BITNUM (PORTB, 2);
statické bit T_LCD_D2 @ BITNUM (TRISB, 2);
statické bit LCD_D3 @ BITNUM (PORTB, 3);
statické bit T_LCD_D3 @ BITNUM (TRISB, 3);

delay.c

neplatný
DelayMs (unsigned char CNT)
(
# Pokud XTAL_FREQ <= 2MHz
do (
DelayUs (996);
) While (- CNT);
# Endif

# Pokud XTAL_FREQ> 2MHz
unsigned char i;
do (
i = 4;
do (
DelayUs (250);
) While (- i);
) While (- CNT);
# Endif
)delay.h

# Ifndef XTAL_FREQ
# Define XTAL_FREQ 12MHz / * Crystal frekvence v MHz * /
# Endif

# Define MHZ * 1000L / * počet kHz v * MHz /
# Define KHZ * 1 / * počet kHz v kHz * /

# Pokud XTAL_FREQ> = 12MHz

# Define DelayUs (x) (unsigned char _dcnt; \
_dcnt = (x) * ((XTAL_FREQ) / (12MHz)); \
while (- _dcnt! = 0) \
continue;)
# Jinak

# Define DelayUs (x) (unsigned char _dcnt; \
_dcnt = (x) / ((12MHz) / (XTAL_FREQ)) | 1, \
while (- _dcnt! = 0) \
continue;)
# Endif

extern neplatné DelayMs (unsigned char);ioports1.h

# Ifndef BITNUM
# Define BITNUM (ADR, bit) ((nepodepsané) (& ADR) * 8 (bit)) / / - používá se pro port defs
# Endif

statické bit LED1 @ BITNUM (PORTD, 7), / / - LED
statické bit T_LED1 @ BITNUM (TRISD, 7);
statické bit LED2 @ BITNUM (PORTD, 3), / / - LED
statické bit T_LED2 @ BITNUM (TRISD, 3);
statické bit LED3 @ BITNUM (PORTD, 2); / / - LED
statické bit T_LED3 @ BITNUM (TRISD, 2);

Prosím, pokud někdo může průvodce mě můj problém

 
Ty by měly upravit své portpins na digitální vysílání
ADCON1 = & 1010, nebo něco na vašem kompilátoru

 
mojtaba_mjtb napsal:

Ty by měly upravit své portpins na digitální vysílání

ADCON1 = & 1010, nebo něco na vašem kompilátoru
 

Welcome to EDABoard.com

Sponsor

Back
Top