ccs nin bütün sürümlerini denedim,en son elimde 4.57 var.lcd.c yi başka yerlerden bularak da değiştirdim ama sanırım sorun onda değil.kaç gündür bu sorunla uğraşıorum.karşıma hep 2 durumdan biri çıkıyor.
resimlerini ekkliyorum.Hatam nerde yardım ederseniz sevinirim.(kafayı yemek üzereyim).yoksa ccs yi bırakıp tekrar assembly e dönücem :(
hata1:
(http://img69.yukle.tc/images/6251adsiz.JPG) (http://www.yukle.tc)
hata2:
(http://img69.yukle.tc/images/2545aaa.JPG) (http://www.yukle.tc)
Yardımlarıınız için şimdiden teşekkürler
merhaba kolay gelsın arkadas,
Hemen zoru gorup derleyıcı degıstırmek olurmu. Bence bıraz daha ınat et yoluna devam et. Yapamadıgın zaman bıraz bırak baska ıslerle ugras yoksa kafan ıyıce karısır o zaman hıc yapamazsın.
Umarım asagıdakı ornek ısıne yarar. Ben denedım calısıyor. Similasyonda.
Kolay gelsın.
M_B
#include <16F628.h>
#use delay(clock=4000000)
#define use_portb_lcd TRUE //lcd bilgisi için port b'yi kullanıyoruz
#include <LCD.C>
void main()
{
lcd_init(); //lcd ekranımızı kuruyoruz
delay_ms(6);
lcd_gotoxy(1,1);
lcd_putc("M_B");//Ekrana M_B yazar.
}
M_B kardeşim çok teşekkür ederim.Gönderdiğin programı denedim,ccs güzelce derledi.simülasyonda da çalışıyor.Peki benim sorunum ne olabilir.Neden hep aynı hatayı alıyordum.Başka lcd ye yazdırma programlarında da hep aynı sorunu veriyordu,sadece o yazdığım programda değil.
sorun resimden de anlaşılacağı gibi 16f84 de D portunun olmayışından kaynaklanıyor yani sen lcd.c dosyasında D portunu kullanıosun ama ana programda 16f84 e göre derliyorsun bence sorun orda birde 16f877.h dosyası ile dene yada lcd.c dosyasını kullanacağın işlemciye göre yeniden yaz
#define use_portb_lcd TRUE //lcd bilgisi için port b'yi kullanıyoruz
satırını yazmadıgın ıcın olabılır.
Ben bu satırı cıkardıgımda bahsettıgın tur hatalar oluyor.
Sanırım hata bu olsa gerek ıstersen bır dene.
Kolay gelsın
bu lcd hadderini kullan sorunsuz çalışıyor.
/* 4x20 LCD icin
* Filename : lcd.h
* Hardware : Controller -> 18F452
*/
/**** LCD pinleri ****/
#define LCD_en PIN_C1 //lcdyi yetkilendirmek icin
#define LCD_rs PIN_C0 //konut yada kod yapmak icin
#define LCD_D7 PIN_C5 //lcd veri yolu pin tasarrufu için 4 bit kullandık
#define LCD_D6 PIN_C4
#define LCD_D5 PIN_C3
#define LCD_D4 PIN_C2
/*********************/
/* LCD'de kullanılan komutların tanımlanması */
#define Sil 1 // Ekranı temizler
#define BasaDon 2 // İmleci sol üst köşeye getirir
#define SolaYaz 4 // İmlecin belirttiği adres azalarak gider
#define SagaYaz 6 // İmlecin belirttiği adres artarak gider
#define ImlecGizle 12 // Göstergeyi aç, kursör görünmesin
#define ImlecYanSon 15 // Yanıp sönen blok kursör
#define ImlecGeri 16 // Kursörü bir karakter geri kaydır
#define KaydirSaga 24 // Göstergeyi bir karakter sağa kaydır
#define KaydirSola 28 // Göstergeyi bir karakter sola kaydır
#define EkraniKapat 8 // Göstergeyi kapat (veriler silinmez)
#define BirinciSatir 128 // LCD'nin ilk satir başlangıç adresi
// (DDRAM adres)
#define IkinciSatir 192 // İkinci satırın başlangıç adresi
#define KarakUretAdres 64 // Karakter üreteci adresini belirle
// (CGRAM adres)
/* LCD'de Kullanılan Fonksiyon Seçimi */
#define CiftSatir8Bit 56 // 8 bit ara birim, 2 satır, 5*7 piksel
#define CiftSatir4Bit 48 // 8 bit ara birim, 1 satır, 5*7 piksel
#define TekSatir8Bit 40 // 4 bit ara birim, 2 satır, 5*7 piksel
#define TekSatir4Bit 32 // 4 bit ara birim, 1 satır, 5*7 piksel
//LCD_rw ucu 0'a bagli
#define LCD_DELAY 250 /* yaklasik 1 ms */
#define LCD_clear() LCD_command(0x01) /* Clear display LCD */
#define LCD_origin() LCD_command(0x2) /* Set to origin LCD */
#define lcd_line_bir 0x80 // LCD RAM address 1. satir
#define lcd_line_iki 0xC0 // LCD RAM address 2. satir
#define lcd_line_uc 0x94 // LCD RAM address 3. satir
#define lcd_line_dort 0xD4 // LCD RAM address 4. satir
/***************************************************
* Prototype(s) *
***************************************************/
void LCD_enable(); // LCD yetkilendirme
void LCD_command(unsigned char command); // LCD komut
void LCD_putc(unsigned char ascii); // LCD tek karakter yazma
void LCD_puts(unsigned char *lcd_string); // LCD string yazma
void LCD_init();
void LCD_gotoxy(unsigned char x,unsigned char y);
/***************************************************
* Sources *
***************************************************/
//===================================================
void LCD_enable()
//===================================================
{
output_bit( LCD_en,0); /* Clear bit en */ //lcd yi bir kere yetki,lendirmek için
delay_ms(1);
output_bit( LCD_en,1); /* Set bit en */
}
//===================================================
void LCD_command(unsigned char command) //lcdye komut gönder
//===================================================
{
unsigned char nibble;
output_bit( LCD_rs, 0); /* Clear bit P2.5 */
nibble = (command>>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_enable();
nibble = command & 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_enable();
delay_ms(1);
}
//===================================================
void LCD_putc(unsigned char ascii) //karakter gönderir. tek karakter
//===================================================
{ unsigned char nibble;
output_bit( LCD_rs, 1); /* Set bit P2.5 *///veri gönderdiğin için 1 oldu.
nibble = (ascii>>4) & 0x0F;//0x0f ile maskeliyor.
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_enable();
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_enable();
delay_ms(1);
}
//===================================================
void LCD_puts(unsigned char *lcd_string)
//===================================================
{
while (*lcd_string)
{
LCD_putc(*lcd_string++);
}
}
void LCD_init()
{
output_bit( LCD_en, 1); /* Set bit P2.4 */
output_bit( LCD_rs, 0); /* Clear bit P2.5 */
LCD_command(0x33);
LCD_command(0x32);
LCD_command(0x28);
LCD_command(0x0C); //Kursörü gizle demek
LCD_command(0x06);
LCD_command(0x01); /* Clear */
delay_ms(256);
}
//===================================================
void LCD_gotoxy(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 address; //ramdeki adresi tutar
switch( y )
{
case 1:
address = lcd_line_bir;
break;
case 2:
address = lcd_line_iki;
break;
case 3:
address = lcd_line_uc;
break;
case 4:
address = lcd_line_dort;
break;
}
address += x-1;
LCD_command(address); //lcdye veri gönderiyor
}