4 lü 7segment display 1000'e kadar nasıl saydırılır?

Başlatan Recep METE, 28 Ekim 2013, 22:24:17

Recep METE



Arkadaşlar 4 lü 7segment display ile 1000'e kadar saydırmak istiyorum.Displayin 12 bacağı var.Ben aşağıda tekli 4 tane displayle yazılmış kodu nasıl bu 12 bacağı olan 4 lü displayla çalıştırabilirim.Kodda nasıl değişiklik yapmalıyım?Yardımlarınızı bekliyorum.




int i;
char birler=0, onlar=0,yuzler=0,binler=0;       // char tipinde değişkenler tanımlanıyor

int16 sayi=0;  
// Ortak katot display için veri değerleri
const int digit[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F};

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{

unsigned char a=0;
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x00);
   set_tris_b(0x00); // B portu tümüyle çıkış olarak yönlendiriliyor

   output_low(display_1);      // 1. display aktif durumda
   output_low(display_2);      // 2. display aktif durumda
   output_low(display_3);
  output_low(display_4);
  
  
   while(1)
   {
      

   for(i=0;i<100;i++)       // sayi değişkenini 1 arttır
  {
  if(a==1) {sayi++;a=0;}
 
            if (sayi==10000)  
              sayi=0;

        birler =sayi % 10;
        onlar = (sayi % 100)  / 10;
        yuzler = (sayi %1000) / 100;
        binler = (sayi % 10000) / 1000;




            
            
            
            output_high(display_2);  // 2. display aktif durumda
               output_b(digit[birler]); // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_low(display_2);   // 2. display pasif durumda
               output_high(display_1);  // 1. display aktif durumda
               output_b(digit[onlar]);  // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_low(display_1);   // 1. display pasif durumda
               
                 
             output_high(display_4);  // 2. display aktif durumda
               output_b(digit[yuzler]); // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_low(display_4);   // 2. display pasif durumda
               output_high(display_3);  // 1. display aktif durumda
               output_b(digit[binler]);  // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_low(display_3);   // 1. display pasif durumda
            
               
               a++;
            
         
  }}
   }
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

schrodinger

kullandıgın dısplay  dortlü yapısık display ise  hepsını  bır anda  yakamazsın sadece bır tanesını yakıp cok kısa bekletme vererek  dıgerını yakmalısın  tabı   
bunu  while  döngusunun  içinde yaparsan  ac-kapa  olacak  cok kısa ms içinde (ben genelde 1 ms  kullanıyorum   ) böylece  ıkı displayde yanmıs olacak.
dısplayleri  aktıf etmem lazım  bıde bunu da transıstör  ıle yapman lazım. senın koda  baktım  bıraz basamaklara  ayıyırıp atmak  mantıklı  yazdıklarımı  denersen olabılır  ben 9999 a kadar yapmıstım. 

ete

Tekli 4 display ile elindeki 4 lü displayin sürülme tekniği aynıdır.
Önce donanım olarak bakalım istersen. Tekli displayde a-b-c-d-e-f-g-dp uçları vardır. Burada dp nokta segmenti olup bazı displaylerde nokta bulunmayabilir. Sonuçta 7 adet segment bacağı bulunur. Bir tane ortak katod bacağı vardır.
Bunları bir devreye yerleştirdiğin zaman bütün displaylerin a-b-c-d-e-f-g segmentlerini birşleştirirsin.
Her bir displayin ortak ucu (programına bakılırsa seninkler ortak katod) bir transistörle sürmek gerekir.
Bu durumda bu sistemi sürmek için 7 tane segment ucu 4 adet de ortak ucu sürecek pin gereklidir. Toplamda 7+4=11 pin ile bu sistem sürülür.

Elindeki bitişik 4 lü displayde ise 12 pin var demişsin. Bunları tahmin etmeye çalışır isek ;
- hepsine ait ortak (içeriden birleştirilmiş)  a-b-c-d-e-f-g segment bitleri toplam 7 adet
- her bir display için birer ortak uç  toplam 4 pin.
Bunların toplamı dikkat ederseniz 11 ediyor zaten geriye 1 pin kalıyor ki bununda boş olduğunu sanıyorum.

Anlayacağın ayrık displayler ile bitişik dispaleylerin sürme tekniği aynıdır.
Teknik ise şöyledir.
Sağdan sola doğru displaylere numara verirsek: 4-3-2-1 şeklinde sıralanırlar.
1 nolu display BIRLER hanesini gösterecektir. Sayının birler hanesi hesaplanır ve önce 7 adet segmenti süren pinlere (yada porta) Birler sayısının display karşılığı verilir. Senin  programında bu iş tablodan alınıyor (const int digit[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F};)
Bu sayıyı vermeden önce 4 nolu displayin ortak ucunu süren transistör off konumuna getirilir.
Birler karşılığı segmentlere verilir
1 nolu displayi süren transistör ON konumuna getirilir.
5 ms beklenir (1-5ms arası olabilir)

1 nolu transistörü süren pin LOW konumuna alınarak transistörü off konumuna getirilir.
ONLAR hanesi hesaplanarak karşılığı 7 segmente verilir.
2 nolu displayi süren transistör ON konumuna getirilir. 
5 ms beklenir

2 nolu transistörü süren pin LOW konumuna alınarak transistörü off konumuna getirilir.
YUZLER hanesi hesaplanarak karşılığı 7 segmente verilir.
3 nolu displayi süren transistör ON konumuna getirilir. 
5 ms beklenir

3 nolu transistörü süren pin LOW konumuna alınarak transistörü off konumuna getirilir.
ONLAR hanesi hesaplanarak karşılığı 7 segmente verilir.
4 nolu displayi süren transistör ON konumuna getirilir. 
5 ms beklenir

Tekrar en başa dönülerek işlemler tekrarlanır.

Senin komutlarında bu işin yanlış yapıldığı görülüyor. İki displayi ben yazayım gerisini sen getir.
Başlarken de 1 nolu displayden başlamayı ihmal etme

    output_low(display_4);  // 4. display kapalı durumda 'en sondaki display
    output_b(digit[birler]); // displaye bilgi gönderiliyor
    output_high(display_1);  // 1. display aktif durumda  'transistöre high verince display LOW ile sürülmüş olacak
    delay_ms(5);             // gecikme veriliyor
   
    output_low(display_1);   // 1. display pasif durumda
    output_b(digit[onlar]); // displaye bilgi gönderiliyor
    output_high(display_2);  // 2. display aktif durumda
    delay_ms(5);             // gecikme veriliyor

Bu işi yapmanın en iyi yolu kesme kullanmaktır. TMR0 kesmesini her 1-2 ms de bir kesme yaratacak şekilde ayarlarsan  ve kesme oluştuğunda bir index değişkenini bir artırırsan (0-3 arası değişecek şekilde) bu işi daha kolay ve daha titremesiz bir ekran görüntüsü alacak şekilde yapabilirsin.
Displayleri süren kodları bir selcet case index sistemine bağlayarak index değerine göre displayleri teker teker sürersin.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

pwm.c

bahsettiğin displey ortak anot olabilir. cihazlardan söktüklerim hep anot çıktı.
eğer öyleyse tabloyu yeniden değiştirmek gerekir.
12 pin dizilimini tesbit etmek için datasheeti okuyabilirsin yada o displeylerin arkasında bağlantı yolları görünüyor.
7 segmet, 1 nokta ve 4 adat anot olmak üzere toplam 12 pin oluyor.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

cicjoe

tabloyu degistirmeden tersini ~digit[ i ] gibi verebiliriz sanirim..

Recep METE

Arkadaşlar ben bu soruyu 29 Ekimde sormuştum.Bu sorunu çözeli aylar oldu diyebilirim.Şimdi ne olduda bu soruna bir sürü kişi cevap yazıyor.O günlerde çok bekledim ama yazan olmamıştı.Sorunu deneme yanılmayla kendim çözmüştüm.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

pwm.c

Alıntı yapılan: semfero - 04 Aralık 2013, 19:51:05
Arkadaşlar ben bu soruyu 29 Ekimde sormuştum.Bu sorunu çözeli aylar oldu diyebilirim.Şimdi ne olduda bu soruna bir sürü kişi cevap yazıyor.O günlerde çok bekledim ama yazan olmamıştı.Sorunu deneme yanılmayla kendim çözmüştüm.
foruma girince ilk olarak yeni gönderilen mesajlara bakıyoruz. bazen tarihleri göremiyoruz.
senin yazdığın eski mesajları ozaman okumamış olabiliriz. şuç bizde değil eski konuyu hortlatanlarda.
malesef buna önlem almak pek kolay değil. 8 senelik konuyu bile hortlatanları gördüm. aslında o konuları kilitleseler iyi olur ama bazen devam etmek gerekiyor.
neyse, hiç yoktan arama yapanlara bilgi amaçlı arşiv olmuş olur. zaten bu nedenle hotlatanlarda var. yapmasalar daha iyi olur ama durum ortada.


_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

cicjoe

Aslinda sorunu cozdugumuz zaman donup, cozdugumuzu belirtmemiz daha dogru. Forumun amaci kalici bir birikim yaratmak. Cozulen basliklari da cozuldu diye isaretleyebiliriz..
Yarin, bir baskasi benzer problem yasadiginda, arama sonuclarindan bu basliga yonelebilir ve burda yazilanlar o kisinin problemine faydali olabilir. O nedenle uzerinden cok zaman gecse de fikirlerini paylasmak isteyenler paylasmali bence.
Gun icerisinde cok konu acilirsa, bazi konular "Recent Posts" kismindan cikiyor.. Cogumuz sanirim orayi takip ediyor..