Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

CCS YARDIM

Başlatan SEONE, 12 Mart 2009, 19:08:27

SEONE

HERKESE MERHABA!
CCS'de 16x2 lcd uygulaması yapıyorumda. Uygulamama LCD.Bas include ettiğimde doğal olarak LCD.BAS'da ayarlanmış D portunu kullanmak istiyor. Benim sorunum tasarımdan kaynaklanan engeller yüzünden şu şekilde sürmek istiyorum. Tasarımımda lcdnin RS pini picde C5'de, lcdnin RW pinini direk grounda çekiyorum, lcdnin E pini picde C4'de, LCD data portumda D portunun ilk dört biti (0,1,2,3) yani lcdnin DB4'ünden başlayarak sırayla DB7'ye kadar picin D0'dan başlayarak D3 portuna sırayla bağlıyorum fakat bir türlü çalışmıyor. Aslında neden çalışmadığınıda biliyorum ccs'de use lcd dediğimde çıkan ekranda lcdnin E ve RS ucunun hangi portlar olduğunu ayarlayabiliyorum fakat data portunun ayarını d portu ve sıfırıncı bitinden başlamasını gerektiğini bir türlü ayarlayamadığımdan CCS'de haklı olarak d portunun 4.bitinden başlıyor sürmeye. D portunun 0'ncı pininden başlaması için lcd use dediğimde çıkan ekranda data portunu ayarlamak için nasıl yazıldığı hakkında CCS kullanan arkadaşlardan yardım bekliyorum biraz uzun ve devrik oldu ama artık idare edin.Şimdiden teşekkürler.

zafzaf82

/* for 4x20 LCD
 * Filename : lcd.c
 * Hardware : Controller  -> all pic series
 */

/**** LCD pinleri ****/
#define LCD_en PIN_D2  //lcdyi yetkilendirmek icin
#define LCD_rs PIN_D3  //konut yada kod yapmak icin 
#define LCD_D7 PIN_D7  //lcd veri yolu pin tasarrufu için 4 bit kullandık 
#define LCD_D6 PIN_D6
#define LCD_D5 PIN_D5
#define LCD_D4 PIN_D4
/*********************/
//LCD_rw ucu 0'a bagli

#define lcd_line_bir  0x80 // LCD RAM adres 1. satir
#define lcd_line_iki  0xC0 // LCD RAM adres 2. satir
#define lcd_line_uc   0x94 // LCD RAM adres 3. satir
#define lcd_line_dort 0xD4 // LCD RAM adres 4. satir

/***************************************************
 * Prototype(s)                                    *
 ***************************************************/
void LCD_yetkilendirme();                          // LCD yetkilendirme
void LCD_komut(unsigned char komut);               // LCD komut 
void LCD_putc(unsigned char ascii);                // LCD tek karakter yazma 
void LCD_string_yaz(unsigned char *lcd_string);    // LCD string yazma
void LCD_init();
void LCD_goto_xy(unsigned char x,unsigned char y);

/***************************************************
 * Sources                                         *
 ***************************************************/

//===================================================
void LCD_yetkilendirme()
//===================================================
{
    output_bit( LCD_en , 0); /* Clear bit EN */   //lcd yi bir kere yetki,lendirmek için 
    delay_ms(2);
    output_bit( LCD_en , 1); /* Set bit EN */
}

//===================================================
void LCD_komut(unsigned char komut)   //lcdye komut gönder
//===================================================
{
   unsigned char nibble;
   output_bit( LCD_rs , 0); /* Clear bit RS */
   nibble = (komut>>4) & 0x0F;  //ilk 4 bitini gönderdik 
   output_bit(LCD_D4 , (nibble & 0x01) );       //pinlere tek tek gönderdik. buton tek seferde göndermediği için 
   output_bit(LCD_D5 , (nibble>>1 & 0x01) ); 
   output_bit(LCD_D6 , (nibble>>2 & 0x01) );
   output_bit(LCD_D7 , (nibble>>3 & 0x01) );
   LCD_yetkilendirme();
   nibble = komut & 0x0F;
   output_bit(LCD_D4 , (nibble & 0x01) );       
   output_bit(LCD_D5 , (nibble>>1 & 0x01) ); 
   output_bit(LCD_D6 , (nibble>>2 & 0x01) );
   output_bit(LCD_D7 , (nibble>>3 & 0x01) );
   LCD_yetkilendirme();
   delay_ms(2);
   }
//===================================================
void LCD_putc(unsigned char ascii)   //karakter gönderir. tek karakter 
//===================================================
{   
   unsigned char nibble;
   output_bit( LCD_rs , 1); /* Set bit RS *///veri gönderdiğin için 1 oldu. 
   nibble = (ascii>>4) & 0x0F;//0x0f ile maskeliyor. 
   output_bit(LCD_D4 , (nibble & 0x01) );       //pinlere tek tek gönderdik. buton tek seferde göndermediği için 
   output_bit(LCD_D5 , (nibble>>1 & 0x01) ); 
   output_bit(LCD_D6 , (nibble>>2 & 0x01) );
   output_bit(LCD_D7 , (nibble>>3 & 0x01) );
   LCD_yetkilendirme();
   nibble = ascii & 0x0F;
   output_bit(LCD_D4 , (nibble & 0x01) );   
   output_bit(LCD_D5 , (nibble>>1 & 0x01) ); 
   output_bit(LCD_D6 , (nibble>>2 & 0x01) );
   output_bit(LCD_D7 , (nibble>>3 & 0x01) );
   LCD_yetkilendirme();
   delay_ms(2);
}

//===================================================
void LCD_string_yaz(unsigned char *lcd_string)
//===================================================
{
   while (*lcd_string) 
   {
      LCD_putc(*lcd_string++);
   }
}

void LCD_init()
{
    output_bit( LCD_en , 1); /* Set bit EN */ 
    output_bit( LCD_rs , 0); /* CLr bit RS */  
    LCD_komut(0x33);
    LCD_komut(0x32);
    LCD_komut(0x28);
    LCD_komut(0x0C);
    LCD_komut(0x06);
    LCD_komut(0x01); /* Clear */
    delay_ms(100);
}

//===================================================
void LCD_goto_xy(unsigned char x, unsigned char y)   //lcdye istediğimiz yere veri yazmamızı sağlar. satir ve sütün olarak 
//x ,y=sutun,satir
//===================================================
{
int adres;  //ramdeki adresi tutar 

   switch( y )
   {
   case 1:
   adres = lcd_line_bir;
   break;
   case 2:
   adres = lcd_line_iki;
   break;
   case 3:
   adres = lcd_line_uc;
   break;
   case 4:
   adres = lcd_line_dort;
   break;
   }

   adres += x-1;     
   LCD_komut(adres); //lcdye veri gönderiyor
}


istediğin pini kullan
istediğin portun istedigin pinini kullan kod yukarda
Mikroişlemci bi araçtır, amaç değil.....