Lcd'ye yazı yazdırma sorunu

Başlatan Chan86, 09 Mayıs 2008, 21:41:21

Chan86

Arkadaşlar lcd ile yazdırılması gereken bir projem var ancak lcd ile komutları yazmama rağmen yazım yapamıyorum.Yardımcı olursanız sevinirim.Altta program ve devre şeması bulunmaktadır.

#include <pic.h>
#include <lcd.c>
#include <stdio.h>
#include <delay.c>
main (void)
{
TRISB=0;
TRISA=0;
DelayMs(250);
lcd_init();
DelayMs(250);
lcd_clear();
lcd_goto(0x00);
lcd_puts("Elektronik");
}


http://rapidshare.com/files/113735106/ads__305_z.JPG.html

mustafa_cmbz

lcd'nin 5 nolu ucunu şaşeye ver devren çalışacaktır..

Chan86

Şaseye bağlantıyı yaptım ama hala çalışmıyor devre

ibrsel

lcd.c dosyanı kontrol et. LCD nin data uçları senin bağladığın düzendemi tanımlanmış.

Chan86

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):
*   
*   PORTB bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
*   PORTA bit 2 is connected to the LCD RS input (register select)
*   PORTA bit 3 is connected to the LCD EN bit (enable)
*   
*   To use these routines, set up the port I/O (TRISA, TRISB) then
*   call lcd_init(), then other routines as required.


Bunlar yazmakta yani bağlantılar yaptığım gibi ama sonuç alamıyorum hala

kostebek

LCD.C nin içerisinde ingilizce olarak (şu anda kendi bilgisayarımda değilim) PORT B YÜ KULLANMAK İÇİN #  işaretini kaldırın gibi bir açıklamanın altında

#use_portb_lcd gibi bir kod var.

Onun önündeki yorum karakterini(#) kaldırırsan artık portb ye bağladığın LCD çalışacaktır ;)

Chan86

/*
*   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):
*   
*   PORTB bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
*   PORTA bit 2 is connected to the LCD RS input (register select)
*   PORTA bit 3 is connected to the LCD EN bit (enable)
*   
*   To use these routines, set up the port I/O (TRISA, TRISB) then
*   call lcd_init(), then other routines as required.
*   
*/

#include   <pic.h>
#include   "lcd.h"
#include   "delay.h"

static bit LCD_RS   @ ((unsigned)&PORTA*8+2);   // Register select
static bit LCD_EN   @ ((unsigned)&PORTA*8+3);   // Enable

#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)
{
   PORTB = (PORTB & 0xF0) |  (c >> 4);
   LCD_STROBE;
   PORTB = (PORTB & 0xF0) |  (c & 0x0F);
   LCD_STROBE;
   DelayUs(40);
}

/*
*    Clear and home the LCD
*/

void
lcd_clear(void)
{
   LCD_RS = 0;
   lcd_write(0x1);
   DelayMs(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
   PORTB = (PORTB & 0xF0) |  (c >> 4);
   LCD_STROBE;
   PORTB = (PORTB & 0xF0) |  (c & 0x0F);
   LCD_STROBE;
   DelayUs(40);
}


/*
* 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(void)
{
   LCD_RS = 0;   // write control bytes
   DelayMs(15);   // power on delay
   PORTB = 0x3;   // attention!
   LCD_STROBE;
   DelayMs(5);
   LCD_STROBE;
   DelayUs(100);
   LCD_STROBE;
   DelayMs(5);
   PORTB = 0x2;   // set 4 bit mode
   LCD_STROBE;
   DelayUs(40);
   lcd_write(0x28);   // 4 bit mode, 1/16 duty, 5x8 font
   lcd_write(0x08);   // display off
   lcd_write(0x0F);   // display on, blink curson on
   lcd_write(0x06);   // entry mode
}


Bendeki lcd.c nin içinde yazanların tamamı ben öyle bir şey göremedim yoksa eklemem mi gerekiyor?

kostebek

Hangi versiyonunu kullanıyorsun bilmiyorum ama ben PCWD kullanıyorum.

LCD.C dosyası şu şekilde

///////////////////////////////////////////////////////////////////////////
////                             LCDD.C                                ////
////                 Driver for common LCD modules                     ////
////                                                                   ////
////  lcd_init()   Must be called before any other function.           ////
////                                                                   ////
////  lcd_putc(c)  Will display c on the next position of the LCD.     ////
////                     The following have special meaning:           ////
////                      \f  Clear display                            ////
////                      \n  Go to start of second line               ////
////                      \b  Move back one position                   ////
////                                                                   ////
////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)    ////
////                                                                   ////
////  lcd_getc(x,y)   Returns character at position x,y on LCD         ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2007 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
// #define use_portb_lcd TRUE


struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN enable;           // on to an I/O port to gain
           BOOLEAN rs;               // access to the LCD pins.
           BOOLEAN rw;               // The bits are allocated from
           BOOLEAN unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;


#if defined use_portb_lcd
   //#locate lcd = getenv("sfr:PORTB")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf81
   #else
    #locate lcd = 6
   #endif
   #define set_tris_lcd(x) set_tris_b(x)
#else
   //#locate lcd = getenv("sfr:PORTD")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf83
   #else
    #locate lcd = 8
   #endif
   #define set_tris_lcd(x) set_tris_d(x)
#endif

#ifndef lcd_type
#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#endif

#define lcd_line_two 0x40    // LCD RAM address for the second line


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in



BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}


void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}


void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}


void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;

   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}

void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}

char lcd_getc( BYTE x, BYTE y) {
   char value;

    lcd_gotoxy(x,y);
    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}



kodun üstünde gördüğün

// #define use_portb_lcd TRUE



satırındaki // işaretini kaldırmak yeterli.

Chan86

Teşekkür ederim yardımcı olduğun için.

kostebek

Alıntı yapılan: "Chan86"Teşekkür ederim yardımcı olduğun için.

Özel mesaj kutunu kontrol et bu arada :)

Chan86

Ettim sanada bir mesaj yolladım nasıl kullanılır nereye atıyor hex kodlarını onu bulamadım

Chan86

Yazdığım komutu aynen yeni derleyiciye aktarıyorum dediğin değişikliğide yapmama rağmen hata veriyor derlemede anlayamadım sorunu

Chan86

CCS yi kullanamadım.Benim bu sorunu nasıl çözebilirim? Bağlantıları ve programı verdim üstadlar inceleyip yardımcı olurlarsa çok sevinirim.

aliveli

sen sanırım hi tech c de yazmışsın programını
ccs ile cevap vermişler
hangi compilerı kullanıyorsun?

Chan86

high teck kullanıyorum.Ama hatamı buldum.A portunun veri giriş çıkışı için ADCON1=0x06 komutunu yazmadığımdan lcd çalışmıyormuş.Yardımlarınız için çok teşekkür ederim.