b c ve de portlari için 2x16 lcd sürücü

Başlatan asadam, 14 Aralık 2007, 01:02:08

asadam

CCS ile gelen klasik 2x16 lık sürücüyü b c ve d portları ile kullanılmak üzere düzenledim. fonksiyon isimleri Türkçe'ye çevrildi.
Gerekli açıklamakar yorum satırlarında bulunmakta. Yeni başlayan arkadaşlara yardımcı olabilir.

//  pin baglantilari asagidaki gibi olmali
//  D="data ucu"
//  D0 = RS
//  D1 = RW
//  D2 = Enable
//  D4 = LCD D4
//  D5 = LCD D5
//  D6 = LCD D6
//  D7 = LCD D7

///////////////////////////////////////////////////////////////////////////
////                             LCD.C                                 ////
////                 Genel LCD modül sürücüsü                          ////
////                     düzenleme "asadam"                            ////
////                  web: www.picproje.com                            ////
////  lcd_init()   program basinda mutlaka cagrilmali      .           ////
////                                                                   ////
////  lcd_putc("c")  LCD ye karakter gönderme (örnekte c gönderildi.   ////
////                     Asagidaki isaretler özel mana tasir           ////
////                      \f  LCD yi temizler                          ////
////                      \n  ikinci satirin basina gider              ////
////                      \b  bir posizyon geri gelir                  ////
////                                                                   ////
////  lcd_gotoxy(x,y) LCD yazma bölgesi ayarlanir                      ////
////                                                                   ////
////  lcd_getc(x,y) LCD den karakter çeker (x,y bölgesindeki  degeri   ////
////                                                          alir     ////
////                                                                   /////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////

// #define use_portb_lcd TRUE      ////     Hangi port kullanilmak isteniyorsa burada // isareti
// #define use_portc_lcd true      ////     cümlenin basindan kaldirilmali  
// #define use_portd_lcd true      ////     örn c portu icin 2. satirin basindaki // kaldirilmali 



struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN rs;           // on to an I/O port to gain
           BOOLEAN rw;               // access to the LCD pins.
           BOOLEAN enable;               // 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)
   #endif


#if defined use_portc_lcd
  #ifdef __pch__
  #locate lcd = 0x82
  #else
  #locate lcd = 7
   #endif
  #define set_tris_lcd(x) set_tris_c(x);
#endif

#if defined use_portd_lcd
  #ifdef __pch__
 #locate lcd = 0x83
  #else
 #locate lcd = 8
  #endif
  #define set_tris_lcd(x) set_tris_d(x);
#endif

   

#ifndef lcd_type
#define lcd_type 2           // LCD tipi seçme  >> 0=5x7, 1=5x10, 2=2 satir 
#endif

#define lcd_line_two 0x40    // ikinci satir için LCD RAM adresi


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // LCD yi, baslatmak için gönderilen bitler
                             


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

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // yazma modu için tüm pinler çikis
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // Okuma modu için tüm pinler giris



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);
}