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![Wink ;) ;)](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
# Jinak
# Define DelayUs (x) (unsigned char _dcnt; \
_dcnt = (x) / ((12MHz) / (XTAL_FREQ)) | 1, \
while (- _dcnt! = 0) \
continue![Wink ;) ;)](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
# 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
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