Haberler:

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

Ana Menü

Lcd'den Display'e

Başlatan Umitb, 19 Ekim 2009, 13:05:37

Umitb

Arkadaşlar merhaba,

Saat termometre devresi lcd'de kısmen çalıştı ama benim amacım seven segment'te çalıştırmak, lcd ile aynı mantıkla çalışmadığı için aynı kod display'de çalışmıyor nette epey araştırma yaptıktan sonra işe yarar birşey bulamadım.Elinizde yardımcı olabilecek örnek kod veya buna benzer bir kaynak varmıdır.

İyi çalışmalar

Logan

Tarama yöntemi kullanarak programı kendin yazmak zorundasın. Aksi halde bu mantıkla çalıştırman zor olacaktır. Başka bir örnek bulsan bile o örneği de programında adapte etmen gerekecek.
İmza.

Umitb

Evet tarama yöntemiyle yapacağım 595 kullanarak bu işi kısmen çözdüm benim yapamadığım kısım ds1302'den gelen datayı display'e aktarmak yanılmıyorsam maskeleme yaparak bu işi çözülecek ama nereden başlayacağımı bilemediğimden örnek birşeyler bakıyorum.Cevabınız için teşekkür ederim.

bigbey

Önce 7segmentleri 74595 lere bağlamalısın.
ve bu yaptığın bağlantıya göre bir sayı tablosu oluşturmalısın.
bu tablo örnek olarak
TABLO
ADDWF	PCL,F
RETLW	B'00111111'	;H'3F'      0 sayısı
RETLW	B'00000110'	;H'06'      1 sayısı
RETLW	B'01011011'	;H'5B'      2 sayısı
RETLW	B'01001111'	;H'4F'      3 sayısı
RETLW	B'01100110'	;H'66'      4 sayısı
RETLW	B'01101101'	;H'6D'      5 sayısı
RETLW	B'01111101'	;H'7D'      6 sayısı
RETLW	B'00000111'	;H'07'      7 sayısı
RETLW	B'01111111'	;H'7F'      8 sayısı
RETLW	B'01101111'	;H'6F'      9 sayısı
RETLW	B'00000000'	;BLANK    

displaye gönderilmesi gereken sayı her ne ise W registerine o sayıyı yükleyip
CALL     TABLO   dediğininde ilgili satırdaki veriyi W registerine yükleyip geri geliriz ve bu sayıyı 74595 entegresine seri olarak (SPI) gönderip istediğimiz sayıyı gösterebiliriz.
TA6R

Umitb

Konuda yeni olunca anlatmakta zor oluyor sanırım

{
   init();
   rtc_init();
   rtc_set_datetime(1,1,1,1,15,23);
 
// Oncekieldevar = 0;  
 while(1)
 
 {  
 

       
 delay_ms(100);
 eldevar = read_ds1302(0x81);
// delay_ms(1000);
 birler = eldevar&15;
 


 if (eldevar != Oncekieldevar)
 {
     DisplayUpdateEt = 1;
     
     Oncekieldevar = eldevar;
   
 }
 onlar = 0;
 yuzler = 0;
 binler = 0;
read_ds1302(0x83);

 if (DisplayUpdateEt == 1)
 {
     so_data=digit[birler]; SerialO();//
     so_data=digit[onlar];  SerialO();//
     so_data=digit[yuzler]; SerialO();
     so_data=digit[binler]; SerialO();
     DisplayUpdateEt = 0;
     
 }    
           
           
       }
       
     
   }        

kodun bir kısmı bu şekilde bu haliyle soldan 3 display 0 oluyor ki böyle yazdım en sağdaki ds1302'den dolayı sayma yapıyor ama bir türlü 2. display artmıyor kısmen sayıcı problemim var gibi ama bir türlü çözemedim.CCs c ile neredeyse nette seven segmentli kod veya benzer bişiy bulamadım.

ahmet2004

Net'te tabiki bulamazsınız sadece picprojede var.Arama yaptınızmı sitemizde?

Örnek sayıcı devresi uygulaması: Belki yardımcı olur.

https://www.picproje.org/index.php/topic,25202

Umitb

Sanırım forumdaki bütün ds1302 ve saat projelerini okudum :) Yardımınız için teşekkür ederim.Amacım sayıcı yapmak değil bu devreyi lcd'de saat,termometre olarak çalışıtrdım.Bunu seven segmentte çalıştırmak ds1302 normalde sayma yapıyor ama sadece ilk display sayıyor diğerleri saymıyor.

ahmet2004

Kodunuzun diğer kısımları belli olmadığı için yardım güç oluyor.

Genelde çoğunluk kod verirken eksik veriyor ve yardım olmuyor.

Müneccimlik yapmamız isteniyor.Eksik bilgilerle yardım isteniyor.

Diğer kısımları görmeden nasıl yardım edebileceğiz.

Alt program kısımlarında neler yapılmış bunlar hiç açık değil.

Mümkünse bütünlüklü olan kodları ekleyinki yardım edebilelim.

Eksik ve belli belirsiz kodlar verilirse forumda bunlara  cevap eksik

ve hatalı verilebiliyor.

Bilmiyorumki, bu sorunu nasıl çözeceğiz.

Umitb

Haklısınız özür dilerim kodun tamamını ekliyorum

Kod:

#include <16F628.h>
#use delay(clock=4000000)
#include <ds1302.c>

#fuses INTRC,NOPUT,NOPROTECT,NOLVP,NOWDT  


#ifndef RTC_SCLK

#define RTC_SCLK PIN_a1
#define RTC_IO   PIN_a0
#define RTC_RST  PIN_a2

#endif
         
#define CLRWDT(); #asm CLRWDT #endasm
#define NOP(); #asm NOP #endasm
#byte   RTCC                = 0x01
#byte   PORTA               = 0x05

#byte   PORTB               = 0x06
#byte   PORTC               = 0x07
#byte   PORTD               = 0x08
#byte   PORTE               = 0x09
#byte   T1CON               = 0x10
#byte   PIR1                = 0x0C
#byte   RCSTA               = 0x18
#byte   TXSTA               = 0x98
#byte   SPBRG               = 0x99
#byte   TXREG               = 0x19
#byte   RCREG               = 0x1A
#byte   INTCON              = 0x0B
#byte   OPTION              = 0x81
#byte   PIE1                = 0x8C


#bit    TXIF                = TXSTA.1
#bit    RCIF                = PIR1.5
#bit    INTF                = INTCON.1
#bit    INTEDG              = OPTION.6
#bit    TRMT                = TXSTA.1
#bit    CREN                = RCSTA.4
#bit    OERR                = RCSTA.1
#bit    TXEN                = TXSTA.5
#bit    TMR1ON              = T1CON.0
#bit    TMR1IF              = PIR1.0
#bit    PEIE                = INTCON.6
#bit    TMR1IE              = PIE1.0


#bit LED = PORTA.3
#bit si_load = PORTB.0
#bit sclk = PORTB.1
#bit latch = PORTB.2


const int digit [10] = {0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6};

   unsigned int so_data,sayi,birler,onlar,Oncekieldevar,yuzler,binler,eldevar,eldevar1;
   unsigned int dummy,data,index,setup_timer0,DisplayUpdateEt,set_Timer1,setup_timer_1;
   byte saniye;
   byte dakika;
   byte saat;

   unsigned int shift,data_bin;
   unsigned long int i;

void init(void)

 {
     
       SET_TRIS_B(0b00000000);
   //  SET_TRIS_A(0b00000000);  
   
    DisplayUpdateEt = 1;
   
 }  


void SerialO(void)

{
   
 index = 0;sclk = 0;  dummy = 0;
       
   data = so_data;  shift=0b00000001;

   while( dummy<8 )
   {
      data_bin=data & shift;
      if(data_bin==1)
      {
         si_load=1;  
         sclk = 1;    sclk = 0;
      }
      else if (data_bin==0)
      {
         si_load=0;  
         sclk = 1;     sclk = 0;
      }
      data=data>>1;
      dummy++;
   }
   index++;
     
   latch = 1;   latch = 0;
 
   
}//void SerialO(void)
 

void main(void)
{
   init();
   rtc_init();
   rtc_set_datetime(1,1,1,1,15,23);
 
// Oncekieldevar = 0;  
 while(1)
 
 {  
 

       
 delay_ms(100);
 eldevar = read_ds1302(0x81);
// delay_ms(1000);
 birler = eldevar&15;
 


 if (eldevar != Oncekieldevar)
 {
     DisplayUpdateEt = 1;
     
     Oncekieldevar = eldevar;
   
 }
 onlar = 0;
 yuzler = 0;
 binler = 0;
read_ds1302(0x83);

 if (DisplayUpdateEt == 1)
 {
     so_data=digit[birler]; SerialO();//4.segmente
     so_data=digit[onlar];  SerialO();//
     so_data=digit[yuzler]; SerialO();//binlere yazıyor
     so_data=digit[binler]; SerialO();
     DisplayUpdateEt = 0;
     
 }    
           
           
       }
       
     
   }