2x16 LCD 'yi 4 bit Modunda Pic 'in 0-3 bitleri ile kotrol etmek

Başlatan Kazım, 03 Ekim 2012, 20:07:09

Kazım

Arkadaşlar projem için 20 pinli işlemci seçtim . 2*16 Lcd 'de kullanacağım.Ancak 4 bit Modunda sürekli Pic 'in 4 ve 7. Bitleri ile kontrol edilmiş.Ben ise 0-3 arası pinler ile kontrol etmek istiyorum.Buna uygun port maskeleme kodlarını yazdım ancak çalışmıyor. Baktığım örneklede hep 4-7 bitler kullanılmış bu şartmıdır.Bir de Hi-tech ile yazılmış kod varsa buraya eklermisiniz karşılaştırmak istiyorum.

JKramer

Şart değil, lcd'yi uygun kodla mikrodenetleyicinin istediğiniz bacağına bağlayabilirsiniz.

AsHeS

74hc595 ile sürme yöntemim bu 3 bacak ile sürülüyor bacaklar senin kontrolün altında.İlla da denetleyici ile sürecem diyorsan bir karıştayım onun da bende duruyor olması lazım ama 6 bacaktansa 50 kuruşluk farkla 3 bacağın sende kalması daha güzel olur.(R/W ucu toprağa bağlı lcd nin)
Şema da burada
http://a1210.hizliresim.com/12/3/dmlvw.png
#include <pic.h>
#include "delay.h" 
#include "lcd595.h"
#define clk RB1
#define cik595 RB2
#define mask RB3
void hc595(unsigned char data)
{
unsigned char kontrol=1;
unsigned char i=1;
mask=0;
i=8;
kontrol=kontrol<<(i-1);
while(kontrol)
{
cik595=(data&kontrol)&&0x01;
clk=0;
DelayUs(10);
clk=1;
kontrol=kontrol>>1;
}
mask=1;
}
void lcd595_komut(unsigned char komut)
{
DelayMs(4);
hc595((komut&0xF0)&0xFB|0x08);//LCD RS pini 0 E pini 1 yüksek byte gidişi
hc595((komut&0xF0)&0xFB);//LCD RS pini 0 E pini 0(düşen kenar üretimi)
DelayMs(1);
hc595((((((komut&0x0F)<<4)&0xF0)&0xFB))|0x08);
hc595((((komut&0x0F)<<4)&0xF0)&0xFB);
}
void lcd595_veri (unsigned char veri)
{
DelayMs(4);
hc595((veri&0xF0)|0x0C);
hc595(((veri&0xF0)|0x0C)&0xF7);
DelayMs(4);
hc595(((veri&0x0F)<<4)|0x0C);
hc595((((veri&0x0F)<<4)|0x0C)&0xF7);
DelayMs(2);
}
void lcd595_yazi(unsigned char *q){
while(*q)
	lcd595_veri(*q++);
}
void lcd595_temiz(){
lcd595_komut(0x01);
}
void lcd595_kur(void){
DelayMs(100);
lcd595_komut(0x02);
lcd595_komut(0x28);
lcd595_komut(0x0F);
lcd595_komut(0x06);
lcd595_komut(0x01);
}
void imlecyeri595(unsigned char x,unsigned char y){
if (x==1)
	lcd595_komut((0x80)+((y-1)%16));
	else
	lcd595_komut((0xC0)+((y-1)%16));
}

Kazım

Teşekkür ederim arkadaşlar . Evet hc595 ile de sürebilirim sanırım ama elinde kod varsa eklersen sevinirim. Extra pine ihityacım yok.Çok basit gibi görünüyor yazıyorum deniyorum çalışmıyor. Proteusta pinleri logic probla Önce High sonra Low nibble olarak doğruluğu kontrol ediyorum.Data doğru görünüyor( RC0-> D4 ,RC1->D5 şeklinde bağladım ).ENABLE  pinini datayı PORTA eşitledikten sonra LOW->High yapıyorum.yada İNİTİALIZE kısmında ayarları yanlış yapıyorum çok yoruldum 2-3 saattir uğraşıyorum.Nerde yanlış yapıyorum hiçbir fikrim yok.Youtube bakıyorum adam DİPSWİTCH ile çalıştırıyor ben MCU ile yapamıyorum.Anlamadım gitti.Arkadaşlar konuya yarın devam edeceğim.Bugünlük yardımlarınız için teşekkür edrim.

AsHeS

Alıntı yapılan: graski - 03 Ekim 2012, 21:53:11
Teşekkür ederim arkadaşlar . Evet hc595 ile de sürebilirim sanırım ama elinde kod varsa eklersen sevinirim. Extra pine ihityacım yok.Çok basit gibi görünüyor yazıyorum deniyorum çalışmıyor. Proteusta pinleri logic probla Önce High sonra Low nibble olarak doğruluğu kontrol ediyorum.Data doğru görünüyor( RC0-> D4 ,RC1->D5 şeklinde bağladım ).ENABLE  pinini datayı PORTA eşitledikten sonra LOW->High yapıyorum.yada İNİTİALIZE kısmında ayarları yanlış yapıyorum çok yoruldum 2-3 saattir uğraşıyorum.Nerde yanlış yapıyorum hiçbir fikrim yok.Youtube bakıyorum adam DİPSWİTCH ile çalıştırıyor ben MCU ile yapamıyorum.Anlamadım gitti.Arkadaşlar konuya yarın devam edeceğim.Bugünlük yardımlarınız için teşekkür edrim.
Anlayamadım orada 1 sayfa kod var zaten sürmek için ha kullanım için diyorsun onun prototiplerini sana yazayım aşağıda :
extern void hc595(unsigned char data);
extern void lcd595_komut(unsigned char komut);
extern void lcd595_veri (unsigned char veri);
extern void lcd595_yazi(unsigned char *q);
extern void lcd595_temiz();
extern void lcd595_kur();
extern void imlecyeri595(unsigned char x,unsigned char y);
Çözemediğin kısmı anlayamadım açıkçası

Kazım

Yok ben senin kodunu anlamadım demedim.kendi kodumun neden çalışmadığını anlamadım diyorum.Neyse şu dönüşümü nasıl yaparım 

00001000 sayısını 00000001 sayısına nasıl dönüştürürüm 3210 bitleri 0123 olmalı Low nibble göndermek için

0-3. bitler arasında Low nibble LCD pinlerine ters yerleşiyor yada ben yukarıda yazdığım dönüşümü yapamıyorum.Olur dediğiniz için uğraşıyorum  ama olmuyor
7-4 bitleri arasına MCU nun 3210 bitlerini maskeleyip HİGH nibblr direk gönderilip.Low nibble ise sola 4 shift kayabildiğinden böyle çalışıyor ancak.BEn mcunu 7654 pinerini SPİ için kullandığımdan zaten Low nibble sola yada sağa ( ki zaten kaymaz ) kaydıramıyorum

Arkadaşlar Sorunu Çözdüm İlgilenen Bütün arkadaşlara teşekkür ederim.