2 veya 3 pin kullanarak LCD sürmek ?

Başlatan Nedenler, 15 Aralık 2010, 10:27:38

Nedenler

Arkadaşlar linkte vermiş olduğum örneklere bakınız. Shift registerlarla denetleyicinin 2 yada 3 pinini kullanarak LCD sürüyorlar. Elimde c ile yapılmış bir örnek var. Bunuda aşağıda veriyorum. Soracağım şey şu; Ben C den pek anlamıyorum ve bunu basic ile yapmak istiyorum. Bunun mantığı nedir ? Ne yapmam gerek. SHIFTOUT ile mi LCDOUT ile mi göndereceğim tanımlamam gereken şeyler neler ? Bunu PIC16F877 ve mümkünse 4094 ile yapmak istiyorum.

Burası kütüphaneye eklenmesi gereken yer(miş)
// flex_lcd_3_pins.c

//Modificación de Flex_lcd por Duende_Azul y Akenafab
//Trabaja con 3 pines y 74VHC164
//8-Bit Serial-In, Parallel-Out Shift Register

//La LCD se usa en modo 4bits
//Revisar diagrama de conexion Adjunto
//Se ha utilizado a una velocidad de @40MHz sin ningun problema

//No esta habilitada la lectura del LCD
//RW debe ir a gnd

//Definir pines antes de llamar libreria//
//#define LCD_E     PIN_A0
//#define LCD_CK    PIN_A1
//#define LCD_DAT   PIN_A2

//========================================
int RS_bit;
#define lcd_type 2        // 0=5×7, 1=5×10, 2=2 lines
#define lcd_line_two 0×40 // LCD RAM address for the 2nd line


int8 const LCD_INIT_STRING[4] =
{
 0×20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5×8 dots
 0xc,                    // Display on
 1,                      // Clear display
 6                       // Increment cursor
 };


//————————————-
void lcd_send_nibble(int8 nibble, int rs_bit)
{

int x;
if(RS_bit==1)
   nibble=nibble|0×10;

for(x=0;x<5;x++){
         output_bit(LCD_DAT,shift_right(&nibble,1,0));
         delay_cycles(1);
         output_low(LCD_CK);
         delay_us(1);
         output_high(LCD_CK);}

 output_high(LCD_E);
 delay_us(2);
 output_low(LCD_E);
}

//———————————–
//—————————————-
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
//output_low(LCD_RS);
RS_bit=0;
delay_us(100);


if(address)
   //output_high(LCD_RS);
   RS_bit=1;
else
   //output_low(LCD_RS);
   RS_bit=0;

 delay_cycles(1);


output_low(LCD_E);

lcd_send_nibble(n >> 4,RS_bit);
lcd_send_nibble(n & 0xf,RS_bit);
}

//—————————-
void lcd_init(void)
{
int8 i;

//output_low(LCD_RS);
RS_bit=0;

output_low(LCD_E);

delay_ms(20);

for(i=0 ;i < 3; i++)
   {
    lcd_send_nibble(0×03,RS_bit);
    delay_ms(5);
   }

lcd_send_nibble(0×02,RS_bit);

for(i=0; i < sizeof(LCD_INIT_STRING); i++)
   {
    lcd_send_byte(0, LCD_INIT_STRING[i]);

    delay_ms(5);

   }

}

//----------------------------

void lcd_gotoxy(int8 x, int8 y)
{
int8 address;

if(y != 1)
   address = lcd_line_two;
else
   address=0;

address += x-1;
lcd_send_byte(0, 0×80 | address);
}

//—————————–
void lcd_putc(char c)
{
 switch(c)
   {
    case '\f':                //limpia pantalla
      lcd_send_byte(0,1);
      delay_ms(8);
      break;

    case '\n':                //cambio de linea
       lcd_gotoxy(1,2);
       break;

    case '\b':                //retrocede 1 caracter
       lcd_send_byte(0,0×10);
       break;

    default:
       lcd_send_byte(1,c);
       break;
   }
}

//------------------------------

void lcd_setcursor_vb(short visible, short blink) {
  lcd_send_byte(0, 0xC|(visible<<1)|blink);


Burasıda ana program bloğu

#include <16F877.h>

#FUSES INTRC_IO,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP,NOPROTECT,NODEBUG,CCPB0,NOFCMEN,NOIESO
#use delay(Internal=8M)
//———— Pines del LCD ———————//
#define LCD_E     PIN_B0
#define LCD_CK    PIN_B1
#define LCD_DAT   PIN_B2
//————————————————–// #include "flex_lcd_3pins.c"            // Cargamos libreria del lcd
void main(){
delay_ms(100);

            output_a(0);
            output_b(0);            lcd_init();              // inicializamos el LCD
            lcd_setcursor_vb(1,1);  //cursor visible,papadeo while(1){

         printf(lcd_putc,"\f-LCD 3 pin Mode-\n* !.|.|..|.|.! *");
         delay_ms(1000);
         printf(lcd_putc,"\f* Duende_Azul  *\n *  Akenafab  *");
         delay_ms(1000);

         }//end while

}//end main

Tagli

LCDOUT komutunu kullanamayacağın kesin. SHIFTOUT komutunu bilmiyorum, işine yarayabilir belki ama tek başına LCDOUT'un işini yapmasını bekleme. İlgili kodu senin yazman gerekir. PicBasic'te kütüphane kavramı var mı bilmiyorum. LCDOUT normalde LCD'yi sürmek için gereken komutları PIC'in öntanımlı bacaklarından paralel olarak yolluyor. Bu komutları seri olarak yollamak kolay, tabi ne yollayacağını biliyorsan. Bunun için de LCD'nin çalışma prensibini ve komutlarını iyi bilmen gerekiyor. Ancak ondan sonra kendi kütüphaneni oluşturabilirsin. Belki eklediğin kütüphane dosyası, yazman gereken PicBasic kodu hakkında fikir verebilir.
Gökçe Tağlıoğlu

Nedenler

İşte bende o şekilde düşündüm burdaki kütüphane kodları gibi benimde birşeyler tanımlamam gerek ancak dediğim gibi C den pek çakmıyorum inceledim ama işime yarar bir fikir edinemedim. Bayada uzun yazılmış öyle deneme yanılmaylada bulunabilcek gibi değil. İnternette çok örnek var hepsi C ile nasıl bir mantık kullanmışlar anlayamadım doğrusu


Nedenler

Alıntı yapılan: rck8942 - 15 Aralık 2010, 14:14:44
http://www.fxdev.org/one-wire-lcd/

Anlatan arkadaş çok iyi anlatmış bilmiyorum site sizin mi ama bende hala eksik olan şeyler var. Bu tarz devreleri bende bulmuştum zaten fakat hepsi C ile yazılmış. Anlamaya çalışıyorum ama..

Mesela bu nedir:
if((temp<<(i))&0x80)


ben basic ile yazıyorum orda ki kütüphane kodlarını nasıl kullanacağım ? Ekrana yazı göndermek için ne yapacağım bunlar açıklanmamış


Tagli

temp değişkeni i kadar sola kaydırılmış ve h'80' ile AND işlemine sokulmuş. Sonra da sonucun 0 olup olmadığına bakılmış.

Bu site HD44780 karakter LCD'nin çalışmasını oldukça güzel anlatmış. Burada görülen komut setiyle LCD sürülebilir. Burada da bir simülatör var. Konuyu iyice çalışıp kavrarsan hazır derleyici fonksiyonlarına bağlı kalmak zorunda kalmazsın. Başlangıçta biraz zorlanacaksın tabi. Ancak kodu bir kez yazdıktan sonra istedğin yere kopyala yapıştır yapıp kullanırsın ve içinde bulunduğun duruma göre istediğin şekilde değiştirebilirsin. Normal (paralel) LCD kodunu yazdıktan sonra çok kolay bir şekilde seri (3 bacaklı) şekle dönüştürebileceğini göreceksin.

PicBasic bilmiyorum, bu sebeple kütüphanesi var mıdır yok mudur hiç bir fikrim yok. Ama C'de kütüphane oluşturabilirsin ki bu durumda kopyala yapıştır derdinden de kurtulursun.
Gökçe Tağlıoğlu

Nedenler

Valla açıkçası bundanda pek bişey anlamadım o kadarda saf değilimdir oysa.. Kendi dilimde görsem bi kod anlicam ordan ama böyle ya başka bir dilde örnek görüyorum yada yada bana çalışması falan anlatılıyor. Tamam iyi güzelde bu bilgiyi öğrenince bana ilham gelmiyorki nasıl yapiyim? Yokmudur bunun yolu budur böyle yapılır diyicek olan?

Tagli

Anlatmaya çalıştığım şey PicBasic'te seri yolla LCD'ye yazım işlemi yapacak doğrudan bir komut yok. Kendi kodunu kendin yazmalısın, ki bunun için işin temelini bilmen gerek, ya da bir yerden yazılmışını bulup kopyala yapıştır yapacaksın.
Gökçe Tağlıoğlu

Nedenler

İşte evet o konuda haklısınız o mantığı tam kapamadım ben o yüzdende ne yapacağımı bilmiyorum

X-Fi

hazır bi sebep varken C'ye geçebilirsiniz.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Maxim

Alıntı yapılan: Tagli - 15 Aralık 2010, 18:05:34
temp değişkeni i kadar sola kaydırılmış ve h'80' ile AND işlemine sokulmuş. Sonra da sonucun 0 olup olmadığına bakılmış.


if((temp<<(i))&0x80)

aslında aynı işlem protonda yapılır heralde, tek satır olmaz belki
şu derleyici dünyasında eksik olan şey bence derleyi-çevirici programları yok

mesela yukarıdaki c kodunu picbasice veya proton+ çevirecek bir program olamazmı sizce ?
(tabi mümkün olduğu kadar)

TA2CMC

temp = ( temp << i )  & $80 '' temp değişkeni i kadar sola kaydırılmış ve h'80' ile AND işlemine sokulmuş.
if temp = 0 then ....   'Sonra da sonucun 0 olup olmadığına bakılmış.

Nedenler

Alıntı yapılan: X-Fi - 16 Aralık 2010, 09:29:12
hazır bi sebep varken C'ye geçebilirsiniz.

Elimde ki C dökümanlarını bitirdim ama yetersiz kaldı Serdar ÇİÇEK'in kitabını alıp başlıyacığm en kısa sürede.
Sanırım C'yi kapana kadarda kalıcak bu iş :)


X-Fi

ben cdernek kitabından öğrenmiştim kendim upload ettim sizede yardımı olacaktır.

http://rapidshare.com/files/437248242/CFull3_11-cdernek.pdf

şifre: cdernek
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Nedenler

Vay bu derneği biliyorum sağolun. Fakat pic için özel yazılmış değil bildiğimiz C yani bunu pic için kullanırken öğrenemediğimiz şeyler olmayacak mı ? picin özel değimleri, lcd kullanımı, input, output işlemleri vs vs ?