4x16 LCD kütüphanesi satır problemi ve çözümü

Başlatan klutch, 23 Nisan 2011, 16:37:26

klutch

selamlar.

CCS nin kütüphanesindeki LCD420.c  sürücüsünde 3. ve 4. satır adresleri ile ilgili problemle karşılaştım.

lcd_gotoxy(sutun, satır); komutu ile imleci 1. ve 2. satırlara doğru konumlandırma yapılırken ccs nin driver klasöründeki LCD420.c dosyası 3. ve 4. satırlarda hep imlec 5. sutundan başlıyor. LCD420.c dosyasının içindeki lcd_gotoxy() fonkuna bakarsanız 3.satır 5.sutun adresi olan 0x94 kodunu 0x90 olarak değiştirdiğinizde sorun çözülüyor. aynı mantıkla 4. satır içinde 0xD0 yapmanız yeterli.

hd44870 tabanlı 4x16 alphanumeric lcd ler için ccs LCD420.c driverını yukardaki düzeltmeleri yapıp LCD416.C olarak driver klasörüne farklı kaydet yapıp çalışmaya devam edebilirsiniz. faydalı olması dileğiyle. kolay gelsin.




LCD416.c kodu

////////////////////////////////////////////////////////////////////////////
////                             LCD416.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          ////
////                                                                    ////
////////////////////////////////////////////////////////////////////////////
////                        free licence                                ////
////////////////////////////////////////////////////////////////////////////

// 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] = {0x28 | (lcd_type << 2), 0x0C, 1, 6};
                             // 0x28 = 5x8 dot matrix
                             // 0x0C = display kapalı ve imlec alt çizgi gözükmez ve yanıp sönmez
                             // 1 lcd yi temizle
                             // 6 imleci sağa kaydır


                             // 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;   // 1. satır ilk adresi
     case 2 : address=0xc0;break;   // 2. satır ilk adresi
     case 3 : address=0x90;break;   // 3. satır ilk adresi 0x94 yerine 0x90 olmalı
     case 4 : address=0xd0;break;   // 4. satır ilk adresi 0xd4 yerine 0xd0 olmalı
   }
   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);
}



örnek ccs c kodu

#if defined(__PCM__)
#include <16F877.h>
#use delay(clock=4000000)
#fuses XT, NOWDT, NOPROTECT, NOLVP, NOBROWNOUT, NOPUT, NOWRT, NODEBUG, NOCPD
#define use_portb_lcd TRUE             // lcd bilgisi için port b'yi kullanıyoruz
#include <LCD416.c>                    // lcd için gerekecek fonksiyonların bulunduğu dosya lcd.c
#endif


void main()
{
   setup_PSP(PSP_DISABLED);
   setup_spi(SPI_SS_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);
   
   lcd_init();
   
   lcd_gotoxy(1,1);        // 1.sutun 1.satır 
   printf(lcd_putc, "1.SATIR");
   delay_ms(500);
   lcd_gotoxy(1,2);        // 1.sutun 2.satır 
   printf(lcd_putc, "2.SATIR");   
   delay_ms(500);
   lcd_gotoxy(1,3);        // 1.sutun 3.satır 
   printf(lcd_putc, "3.SATIR");
   delay_ms(500);
   lcd_gotoxy(1,4);        // 1.sutun 4.satır 
   printf(lcd_putc, "4.SATIR");
      
   while(TRUE){}
}