Haberler:

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

Ana Menü

kod dönüşümü

Başlatan x-tol, 06 Eylül 2007, 12:11:06

x-tol

merhaba
aşağıdaki kod hitech pic c ile yazılmış 16f628 için bir 2*16 lcd ekranı 4 pinden kontrol kodu.
#include	<pic.h>
#include	"lcd.h"
#include	"delay.h"

#define	LCD_RS RA1
#define	LCD_RW RA2
#define LCD_EN RA3

#define LCD_DATA	PORTB

#define	LCD_STROBE()	((LCD_EN = 1),(LCD_EN=0))

/* write a byte to the LCD in 4 bit mode */

void
lcd_write(unsigned char c)
{
	DelayUs(40);
	LCD_DATA = ( ( c >> 4 ) & 0x0F );
	LCD_STROBE();
	LCD_DATA = ( c & 0x0F );
	LCD_STROBE();
}

/*
 * 	Clear and home the LCD
 */

void
lcd_clear(void)
{
	LCD_RS = 0;
	lcd_write(0x1);
	DelayMs(2);
}

/* write a string of chars to the LCD */

void
lcd_puts(const char * s)
{
	LCD_RS = 1;	// write characters
	while(*s)
		lcd_write(*s++);
}

/* write one character to the LCD */

void
lcd_putch(char c)
{
	LCD_RS = 1;	// write characters
	lcd_write( c );
}


/*
 * Go to the specified position
 */

void
lcd_goto(unsigned char pos)
{
	LCD_RS = 0;
	lcd_write(0x80+pos);
}
	
/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
	char init_value;

	CMCON = 0x07;	// Disable analog pins on PORTA

	init_value = 0x3;
	TRISA=0;
	TRISB=0;
	LCD_RS = 0;
	LCD_EN = 0;
	LCD_RW = 0;
	
	DelayMs(15);	// wait 15mSec after power applied,
	LCD_DATA	 = init_value;
	LCD_STROBE();
	DelayMs(5);
	LCD_STROBE();
	DelayUs(200);
	LCD_STROBE();
	DelayUs(200);
	LCD_DATA = 2;	// Four bit mode
	LCD_STROBE();

	lcd_write(0x28); // Set interface length
	lcd_write(0xF); // Display On, Cursor On, Cursor Blink
	lcd_clear();	// Clear screen
	lcd_write(0x6); // Set entry Mode
}

ben portb'nin rb4,rb5,rb6rb7 pinlerine lcd'nin 4 pinini bağlamak istiyorum fakat bu kod rb0, rb1, rb2,rb3 pinlerinden çıkış veriyor. bu kodu benim istediğim şekle nasıl çevirebilirim?(yüklenen bilgileri diğer pinlere gelecek şekilde arttırarak yapılır ama ben o tür yükseltecek bir yer göremedim)

salih18200

Alıntı Yap
void
lcd_write(unsigned char c)
{
 
  DelayUs(40);
  LCD_DATA = ( ( c >> 4 ) & 0x0F ) >>4;
  LCD_STROBE();
  LCD_DATA = ( c & 0x0F ) >>4;
  LCD_STROBE();
}
Bu fonksiyonda ilgili yerdeki değişimi yap umarım işini görür.

salih18200

#include	<pic.h>
#include	"lcd.h"
#include	"delay.h"

#define	LCD_RS RA3
#define	LCD_RW RA2
#define LCD_EN RA1

#define LCD_DATA	PORTB

#define	LCD_STROBE()	((LCD_EN = 1),(LCD_EN=0))

/* write a byte to the LCD in 4 bit mode */

void
lcd_write(unsigned char c)
{
	DelayUs(40);
	LCD_DATA =( ( ( c >> 4 ) & 0x0F )<<4);  //##########
	LCD_STROBE();
	LCD_DATA = (( c & 0x0F )<<4);          //##########
	LCD_STROBE();
}

/*
 * 	Clear and home the LCD
 */

void
lcd_clear(void)
{
	LCD_RS = 0;
	lcd_write(0x1);
	DelayMs(2);
}

/* write a string of chars to the LCD */

void
lcd_puts(const char * s)
{
	LCD_RS = 1;	// write characters
	while(*s)
		lcd_write(*s++);
}

/* write one character to the LCD */

void
lcd_putch(char c)
{
	LCD_RS = 1;	// write characters
	lcd_write( c );
}


/*
 * Go to the specified position
 */

void
lcd_goto(unsigned char pos)
{
	LCD_RS = 0;
	lcd_write(0x80+pos);
}
	
/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
	char init_value;

		// Disable analog pins on PORTA

	init_value = 0x3;
	TRISA=0;
	TRISB=0;
	LCD_RS = 0;
	LCD_EN = 0;
	LCD_RW = 0;
	
	DelayMs(15);	// wait 15mSec after power applied,
	LCD_DATA	 = init_value>>4;         //##########
	LCD_STROBE();
	DelayMs(5);
	LCD_STROBE();
	DelayUs(200);
	LCD_STROBE();
	DelayUs(200);
	LCD_DATA = 32;	// Four bit mode          //##########
	LCD_STROBE();

	lcd_write(0x28); // Set interface length
	lcd_write(0xF); // Display On, Cursor On, Cursor Blink
	lcd_clear();	// Clear screen
	lcd_write(0x6); // Set entry Mode
}

Bir kaç değişiklik deha yapılması gerekiyordu değişen yerleri //##########  şeklinde gösterdim.Denedim ve bu kod düzgün bir şekilde çalışıyo

x-tol

evet bu şekilde oldu. mantığını anlatabilir misiniz? nasıl yaptınız bu işi?

muuzoo

Bir arkadaş için bende bu kodla bayağı uğraşmıştım. Şİmdi sen 4 pinle iletişim kurarken aşağıdaki kodda görüleceği gibi 8 bitlik bilgi iki parça halinde gönderilir. ,lk önce yüksek değerlikli 4 bit sağa kaydırılarak ve 0f le maskelenrek 4 bitlik bilgi elde edilir ve o gönderilir. daha sonra aynı 8 bitlik bilgi kaydırılmadan 0f le maskelendiğinde düşük değerlikli 4 biti elde edip onu gönderirsiniz bu sayede 8 bitlik bilginiz gönderilmiş olur.

Arkadaşın orda yaptığı çözümde ise ilk satırdaki sağa kaydırılan bilgiyi tekrar sola kaydırmış bu sayede normalde rb3 ve aşağısından çıkacak bilgi rb7ve aşağısından çıkmıştır. ve yine tekrar sadece 0f ile filtrelenenbilgiyi de tekrar sola kaydırarak düşük değerlikli 4 biti göndermiştir.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

conqueror_tr

Slm arkadarşlar peki lcd'nin RS,RW,E,D4,D5,D6,D7 uçlarını tek portta mesala portb den sürebilirmiyiz.2 gündür ugraşıyorum yapamadım. yapan veya yapabilecek arkadaşların yardımını bekliyorum.
Teşekürler..

muuzoo

Alıntı yapılan: "conqueror_tr"Slm arkadarşlar peki lcd'nin RS,RW,E,D4,D5,D6,D7 uçlarını tek portta mesala portb den sürebilirmiyiz.2 gündür ugraşıyorum yapamadım. yapan veya yapabilecek arkadaşların yardımını bekliyorum.
Teşekürler..


Daha önce bir arkadaşıma yapmıştım. Bütün uçları b portundan sürmüştük. Fakat kütüphane dosyaısını bulabilir miyim? Bilmiyorum. Bilgisayarımı formatlamak zorunda kaldığım için o kütüphane dosyasını da kaybettim. Bulursam eklerim.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

arslan74

Merhaba,

Alıntı Yap

Slm arkadarşlar peki lcd'nin RS,RW,E,D4,D5,D6,D7 uçlarını tek portta mesala portb den sürebilirmiyiz.2 gündür ugraşıyorum yapamadım. yapan veya yapabilecek arkadaşların yardımını bekliyorum.
Teşekürler..



Aslında olurda lcd kodunu fazladan bir sürü kod yazman gerek. Öncelikle bilgileri ekrana göndermeden önce onu bir registerde işlemen gerek. işledikten sonra cıkış portlarına gönderebilirsin. Yada 4 bitlik bilgileri portlara bit bit gönderirsende olur. Zor bir şey değil, LCD çalışma mantığı bildikten sonra cok rahat yapabilirsin. Ama ben buna hiç gerek duymadım. Data ile control cıkışlarını ayrı portlardan veriyorum ve Data portlarının diğer bacaklarını kullanacağım zaman sadece giriş pini olarak tanımlıyorum, o zaman sorunsuz çalışıyor.

Selamlar