4x20 lcd ekranda 3 ve4. satırları kullanma

tunahurgh

Üye
Katılım
2 Mar 2021
Mesajlar
26
Puanları
1
Yaş
41
Merhaba arkadaşlar. 4x20 LCD ekrana yazı yazdıracağım ama sadece ilk iki satıra yazabiliyorum. CCS in lcd420.c kütüphanesini kullanınca lcd ye hiçbirşey yazamıyorum. lcd.c kütüphanesini kullanınca da sadece 2 satır aktif oluyor. Sorun ne olabilir.

Kod:
#include <16f877A.h>
#use delay(clock=20000000)
#fuses HS, NOWDT, NOPUT, NOLVP, NOCPD, NOPROTECT, NODEBUG, NOBROWNOUT, NOWRT

#define LCD_ENABLE_PIN PIN_D3
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#include <LCD.c> //LCD kütüphanesi ekleniyor
//#include <LCD420.c> //LCD kütüphanesi ekleniyor

void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
    
  
   set_tris_a(0xFF);

   lcd_init();
   delay_ms(100);
   lcd_gotoxy(1,1);  // calisiyor
   delay_ms(50);
   lcd_putc("BEN");  // çalismiyor 
   lcd_gotoxy(3,1);
   delay_ms(50);
   lcd_putc("BEN");  // çalismiyor 
   delay_ms(100);
/*    lcd_gotoxy(4,4); //calismiyor
    delay_ms(50);

  
   while(1)
   {   

   }
 
lcd.c 2x16 lcd için yani 3. 4. satırlara bir şey yazamaz.

LCD420.c yi çalıştırman lazım.
pin tanımlarını LCD420.c dosyası içinde yapman gerekiyor olabilir,
LCD420.c dosyasını buraya eklersen bakabiliriz.


Olmazsa şuradakini dene:
Bundada pin tanımlarını .c dosyasında yapman gerekiyor.
Aslında basit bir yöntemle bu halledilebilir ama kafa karıştırmayalım şimdi.
Flex_LCD420.c
https://www.ccsinfo.com/forum/viewtopic.php?t=28268
 
Merhaba,
LCD420.c aşağıdaki gibidir.



Kod:
////////////////////////////////////////////////////////////////////////////
////                             LCD420.C                               ////
////            Driver for common 4x20 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,1997 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:
//     B0  enable
//     B1  rs
//     B2  rw
//     B4  D4
//     B5  D5
//     B6  D6
//     B7  D7
//
//   LCD pins D0-D3 are not used and PIC B3 is not used.

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;

#locate lcd = getenv("SFR:PORTB")                        // This puts the entire structure
                                     // on to port B

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


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 lcdline;

BYTE lcd_read_byte() {
      BYTE low,high;

      set_tris_b(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_b(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_b(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;

   switch(y) {
     case 1 : address=0x80;break;
     case 2 : address=0xc0;break;
     case 3 : address=0x94;break;
     case 4 : address=0xd4;break;
   }
   address+=x-1;
   lcd_send_byte(0,address);
}

void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   lcdline=1;
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,++lcdline);        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);
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}
 
// As defined in the following structure the pin connection is as follows:
// B0 enable
// B1 rs
// B2 rw
// B4 D4
// B5 D5
// B6 D6
// B7 D7
//
// LCD pins D0-D3 are not used and PIC B3 is not used.
Yukarıda yorum olarak Lcd nin PortB de hangi pinlere bağlı olduğunu söylemiş.

Burada E RS RW nin sırayla x0 x1 x2 pinlerine denk geleceği tanımlanmış,
aşağıdaki tanımla beraber B0 B1 B2
pinlerine denk gelecek demek.
Ve
lcd data pinleri x4 x5 x6 x7 pinlerine denk gelecek yani B4 B5 B6 B7 pinleri olacak.
ve x3 yani B3 e denk gelecek, pini kullanılmıyor boşta demiş.

#locate lcd = getenv("SFRORTB") // This puts the entire structure
// on to port B


[/CODE]
burada yukarıdaki structre için PortB kullanılacak şekilde tanımlama yapılmış.

Kısaca bu programla
Lcd nin tüm pinleri aynı mcu portunda ve aşağıdakine uygun sıralı olacak şekilde
yani
x0 x1 x2 E RS Rw pinlerine
x3 boş
x4 x5 x6 x7 lcd D4 D5 D6 D7 data pinlerine
denk gelecek şekilde bağlanarak kullanılabilir.
 
Teşekkür ederim karaapak.
Dün gece uğraşarak kendimce bir çözüm buldum.
Yine lcd.c yi kullandım. Problemim 3. ve 4. satırlara inemememdi.
3. satıra yazmak için lcd_gotoxy(21,1) e imleci getirip 3. satırın başından itibaren yazıyorum. 4. satıra yazı yazmak için ise lcd_gotoxy(21,2) ile 4. satırın başına geliyorum.
Programı yaptım 6 sayfalık bir menü oluşturdum. Herhangi bir problemle karşılaşmadım.
 
Çözüm çözümdür.

Yinede kulağını tersten göstermek yerine bahsettiğim flexlcd kütüphanesini tavsiye ederim.
 
Çözüm çözümdür.

Yinede kulağını tersten göstermek yerine bahsettiğim flexlcd kütüphanesini tavsiye ederim.
Önerdiğin yolları denedim ama çalışmadı. Belki de benim kullandığım LCD ile ilgili bir durumdur. Çünkü yaptığım araştırmalarda gördüğüm birçok yöntem denediğim halde hiçbiri de çözüm olmadı.
Yardımın için çok teşekkür ederim
 
Biraz daha dene çalışır.

Senelerdir bu işle uğraşıyorum halen lcd çalıştıramadığım oluyor,
hata yapılabilecek onlarca nokta var
birçoğunda hata yapıyoruz ve çalışmıyor.

İyi çalışmalar.
 
Ozaman şöyle güzel bir mühendislik adına sorgulamaya devam edeyim. Bana ilk yanıtınızda lcd420.c de lcd pinlerinin girecegi bacaklari aciklamissiniz ama sıkıntı şu ki ben devreyi kurup lehimledim ve bacaklari degistiremiyorum. lcd420.c de degisiklik yapip bu bacakları montaj yaptigim devrenin bacaklarina uydurmam mümkün olmaz mı.
 

Mcu hangi pin lcd hangi pine lehimli?

Diğer seçenek ise yine bahsettiğim flex..lcd kütüphanesini kullanmak.
Onunla hangi pin hangi porta bağlı sıralı mı önemli değil.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…