LCD sayici

Başlatan ferhat.bayraktar, 26 Kasım 2011, 02:07:18

ferhat.bayraktar

C dili kullanıyorum.ccs C degil.
ne yaptıysam LCD de sayıcı yapamadım.
yardımcı olursanız sevinirm.

arslan74

Alıntı yapılan: ferhat.bayraktar - 26 Kasım 2011, 02:07:18
C dili kullanıyorum.ccs C değil.
ne yaptıysam LCD de sayıcı yapamadım.
yardımcı olursanız sevinirm.

Neler yaptın anlat.

ferhat.bayraktar

Aslında istegim sayıcıyı bir butonla kontrol etmek.

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

şeklinde LCD ayarlarını yaptım ve sonra program ;

int sayi=0;


void main() {


    Lcd_Init();                     
    Lcd_Cmd(_LCD_CURSOR_OFF);       
    Lcd_Cmd(_LCD_CLEAR);             


    while (1)
    {
                 if(portd.f0==0)
                 {delay_ms(200);
                 sayi++;

                 Lcd_Out(2,1,sayi);                       
                 }


    }
}

kurdugum devre : http://b1111.hizliresim.com/r/u/rk6p.jpg
görüldüğü üzre VSS kararsız gorunuyor. Onunda sebebini cozemedim.

şimdiden teşekkürler..

Kabil ATICI

şemada bir hata var görünüyor.

Buradaki eleman karakter LCD olması durumunda.
Verdiğin şemada Vss bildiğim kadarıyla (GND) toprak  olması gerekir. Vee olarak belirtilen uç da LCD kontrant ayarı olması gerekir. (trimpotun orta ucu)

LCD veri kağıtlarını bir daha incelemen gerekebilir.
ambar7

ferhat.bayraktar

tam tersinide yaptım. bir değişiklik yok.
micro C nin help'indeki örnek lerden kurdum devreyi. ordaki örnekleride yaptım ve çalıştılar.

ancak kendi devremde hala bir değişiklik yok.

Kabil ATICI

buton döngüsüne girmeden önce ekrana bir şey yazdır.  (örneğin sayacın ilk değerini)

Yazıyorsa buton döngüsünde veya buton algılamasında sorun olabilir.

Böyle durumlar için devreye seri bağlı bir direçle bir led bağlamak devrenin etkileşimli işlemleri yapıp yapmadığı kontrolunda yardımcı olur. (buton basılma kontrolu)

işlemcinin besleme bacaklarına yakın 100nf kodansatör konması, besleme hatları arasına 10uF elektrolitik kondansatör bağlanması parazitik ekilere karşı koruma sağlayabilir. Hatta lcd ekranın besleme bacakları arasına 100nF ve 10uF kondansatör yardımcı olacaktır.  (vdd-vss arasına)

programı biraz daha incelemen gerekebilir. (ben  c bilmiyorum, yardımcı olamam)

Tabii bütün bunları devreyi fiziksel ortamda gerçekleştirdiği varsayımı ile belirttim.
ambar7

ferhat.bayraktar

işte aslında sıkıntım tam olarak orda. değişken yazdıyarmıyorum.
sanıuyorum böyle bişey istediniz.
ama yine olmadı :(


Lcd_Out(2,1,("%d",i));

    while (1)
    {
                 if(portd.f0==0)
                 {delay_ms(200);
                 i++;

                Lcd_Out(2,1,("%d", i));   
   }

mcan

LCD de su veya bu sekılde karakter gosterebılıyormusun?Devreyı gercekde mı denıyorsun  ısısde filan mı?

ferhat.bayraktar

isis te deniyorum.
evet devrede bir şekilde istedigim karakteri gösterebilyorum.
örneğin şu şekilde;
int i=0;
char *txt[]= "asd";
while (1)
    {            Lcd_Out(2,1,*txt);
                 if(portd.f0==0)
                 {delay_ms(200);
                 i++;

                Lcd_Out(2,1,("%d,i"));   

yaptıgım zaman önce ekrana "asd" yazıyor.
butona bastıgımda asd nin yaına i yazıyor(halbuki 2.satır 1. sutuna yazması gerekirken satıra devam ediyor)
i yazıyor derken bildigimiz i>> değişken olan değil :)

arslan74

Merhaba,

Anadığım kadarıyla sen, butouna bastıkca ekrandaki değeri bir artıran bir sayac yapmak istiyorsun.
Bu işin yapabilmen için konuyu alt başlıklara parcalar. Örneğin. Ekrana yazı basma işlemi ve buton'na basılma işlemini algılama gibi. Sonra bu iki işlemi birleştir.

Eğer Ekrana basma işini yapabiliyorsan geriye pek birşey kalmadı diyebiliriz.
Yapmanız gereken şey sadece buton basmaları okumak sonra sayıyı bir artırıp ekrana basmka dir.

Şimdi gördüğüm kadarıyla buton okumanda bir hata var. Sayıcın her basmada bir artmasınımı istiyorsun yoksa başka bir şekilde çalışması mı? Normal basma da işleminde her basmada bir artar sonra cektip tekrar basmadan sayı artmaz. Senin kodunda böyle bir kontrol yok.

Buna benzer kodlar için ben bir eğitim yazıları yazmıştım. Muhtemelen sen o yazıları okumamışsın. Forumda bu yazıları bulmak zor olduğu için bulmakta zorlanmışındır. Bu konuyu çözmek için vakit harcayacak zamanım olmadığı için öyle kaldı. Site yöneticilerin töneticileri yoğun olduğu için öyle kaldı.

Mesela bu örnekleri oku ona göre tekrar dene.

https://www.picproje.org/index.php/topic,19169.msg127792.html#msg127792

https://www.picproje.org/index.php/topic,19170.msg127793.html#msg127793

https://www.picproje.org/index.php/topic,19214.msg128060.html#msg128060


Selamlar,
Hasan Arslan

Kabil ATICI

https://www.picproje.org/index.php/topic,36411.0.html
bağlantısında buradaki soruna benzer bir konu işlenmiş. Belki bir fikir verebilir.
ambar7

Okan AKÇA


ferhat.bayraktar

bir sıcaklık ölçme programı buldum ve bazı kısımlarını alıp değiştirdim.
burda biraz farklı yapmış.
alt program falan tanımlamış.
enteresan bir çözüm olmuş.
http://www.micro-examples.com/public/microex-navig/doc/086-mcp9700a-thermometer

ilginiz için teşekkür ederim.
Alıntı Yap* LCD_printfix constants
*/
#define   INT_RANGE   1000   // integer part : 3 digits
#define   DEC_RANGE   10   // decimal part : 1 digit

int i;

void   LCD_printFix(unsigned int v)
   {
   unsigned int w ;
   unsigned int d ;
   unsigned char n ;
   unsigned char  blk = 1 ;           // zero blanking

           if(v >= 0)
                   {
      LCD_Chr_Cp('+') ;
                   }
           else
                   {
      LCD_Chr_Cp('-') ;
                   }

           v = abs(v) ;
   w = v / DEC_RANGE ;
   for(d = INT_RANGE / 10 ; d > 0 ; d /= 10)
      {
      n = (w / d) % 10 ;
      if(n)
                           {
                 blk = 0 ;
                 }
      if(blk)
                           {
                 LCD_Chr_Cp(' ') ;
                 }
                   else
                           {
                 LCD_Chr_Cp('0' + n) ;
                           }
      }
   LCD_Chr_Cp('.') ;
   w = v % DEC_RANGE ;
   for(d = DEC_RANGE / 10 ; d > 0 ; d /= 10)
      {
      LCD_Chr_Cp('0' + (w / d) % 10) ;
      }
   }

/*
* interrupt routine, called on each timer0 overflow
*/


void    main()
        {
        ADCON1 = 0x00 ;                         // set PORTA as analog input
        TRISA = 0xff ;                          // set PORTA as inputs
        TRISD = 0 ;                             // PORTD is output
        LCD_Init(&PORTD) ;                      // Initialize LCD connected to PORTD
        LCD_Cmd(Lcd_CLEAR) ;                    // Clear display
        LCD_Cmd(Lcd_CURSOR_OFF) ;               // Turn cursor off
LCD_Out(2, 10, "") ;
                           LCD_printFix(i)
while(1)

{ifportd.f0==0)
  {
    i++;
        LCD_Out(2, 10, "") ;
                           LCD_printFix(i) ;
      }
    }

justice_for_all

bende seninki gibi bi sorun yasamistim daha sonra internetten bi ornek buldum hexadesimal sayiyi BCD sayiya cevirip lcdye gondermek gerekiyo..asagida kodun ornegini veriyorum...


void Bin2BCD_char(char temp)                 // Reciev the byte in RAM(temp)
{
	LSD = temp;                     // Store the byte in LSD

   	for (MSD = 0 ; LSD >= 100 ; LSD>=100?(LSD -= 100):LSD, MSD++ ); 
   	for (MdD = 0 ; LSD >= 10  ; LSD>=10?(LSD -= 10):LSD,  MdD++); 
}///

void DisplayTime2(time *disp)
{
  	
	Bin2BCD_char( disp->hr );		//Convert hexa decimal to BCD value 
	LCDdata(MdD+0x30);			//Write into Ram of LCD for display
	LCDdata(LSD+0x30);			//Write into Ram of LCD for display
	LCDdata(':');				//Write into Ram of LCD for display

	Bin2BCD_char(disp->min );		//Convert hexa decimal to BCD value 
	LCDdata(MdD+0x30);			//Write into Ram of LCD for display
	LCDdata(LSD+0x30);			//Write into Ram of LCD for display
	LCDdata(':');				//Write into Ram of LCD for display

	Bin2BCD_char( disp->sec );		//Convert hexa decimal to BCD value 
	LCDdata(MdD+0x30);			//Write into Ram of LCD for display
	LCDdata(LSD+0x30);			//Write into Ram of LCD for display

}///


bu sekilde yaparsaniz buyuk ihtimalle calisacaktir ben calisitirdim...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay