Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

7 segmentte display sorusu

Başlatan Recep METE, 01 Şubat 2014, 12:41:42

Recep METE

Arkadaşlar 7 segment kullanarak yaptığım sıcaklık ölçmede ,onlar basamağı "0" iken displayın yanmamasını istiyorum.Onlar basamağı "1" ise display yanmalı.Örneğin;sıcaklık "05" derece ise birler basamağındaki "5" 'i gösteren display yanmalı, onlar basamağındaki "0" 'ı gösteren display yanmamalı.Sıcaklık "10" derece olunca onlar basamağındaki displayde yanmalı.Bunu nasıl yapabilirim.Yardımlarınızı bekliyorum.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

mehmet

Segment çözümlemesini yaptığınız yerde
D1 = dizi[a];
D2 = dizi[b];

gibi ya da benzeri bir satırlar vardır.
Burayı;
if(sicaklik < 10)
{
      D1 = 0;
      D2 = dizi[b];
}
else
{ 
     D1 = dizi[a];
     D2 = dizi[b];
}

şekline dönüştürebilirsiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

MrDarK

Kodlarını gönder yardımcı olalım.
Picproje Eğitim Gönüllüleri ~ MrDarK

Recep METE

Hocam kodları gönderiyorum bi ilgilenirseniz memnun olurum.

char display1_onlar,display1_birler; 
const int display_digit[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x83,0xF8,0x80,0x90};  // ortak anotlu için   

int i;
int16 okunansicaklik;
void sicaklik_tara()
{



output_d(0b00000100);       
output_b(display_digit[display1_onlar]);   
delay_ms(2);           
output_d(0b00001000);                   
output_b(display_digit[display1_birler]);     
delay_ms(2);               
output_d(0b00010000);
output_b(0x9c); // derece simgesi   
delay_ms(2);           
output_d(0b00100000);
output_b(0xc6); // C harfi   
delay_ms(2);
output_d(0b00000000);

}


//------- ana program ----------------------------------------------------------

#include <ds18b20.c>

void main ()                                 


setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);

setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);





   output_a(0x00);
   output_b(0x00);
   output_d(0x00); 
   delay_ms(2);
 
   while(1)               
   {
   okunansicaklik = ds1820_read();  //Sıcaklık bilgisi okunuyor ve çevriliyor
 
     
       display1_birler=okunansicaklik%10;
       display1_onlar=(okunansicaklik/10)% 10;

 
   
       }
                         
}
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

drmp





output_d(0b00000100);       
   if (display1_onlar == 0)
      {
        output_b(0xFF);
        delay_ms (2);
      }
   else
      {
        output_b(display_digit[display1_onlar]);   
        delay_ms(2);           
      }
         

kodları sanırım ccs de yazmışsın   hatırladığım kadarıyla  bu şekilde yazarsan olur   

   



Recep METE

Hocam yine olmadı hala displayin onlar basamağı "0" gösteriyor, sönmüyor.Başka varyasyonlar denememe rağmen sorunu çözemedim.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

MrDarK

void sicaklik_tara()
{
if(display1_onlar!=0)  // Eğer display1_onlar 0'dan farklı ise parantez içindeki işlemleri yap. Böyle dene bakalım
{
output_d(0b00000100);       
output_b(display_digit[display1_onlar]);    
}
delay_ms(2);            
output_d(0b00001000);                   
output_b(display_digit[display1_birler]);     
delay_ms(2);                
output_d(0b00010000);
output_b(0x9c); // derece simgesi    
delay_ms(2);            
output_d(0b00100000);
output_b(0xc6); // C harfi   
delay_ms(2); 
output_d(0b00000000);

}
Picproje Eğitim Gönüllüleri ~ MrDarK

sadogan

char display1_onlar,display1_birler;  
const int display_digit[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x83,0xF8,0x80,0x90,0XFF};  // ortak anotlu için   

int i;
int16 okunansicaklik;
void sicaklik_tara()
{
 


output_d(0b00000100);  
if(display1_onlar==0) display1_onlar=10;    
output_b(display_digit[display1_onlar]);    
delay_ms(2);            
output_d(0b00001000);                   
output_b(display_digit[display1_birler]);     
delay_ms(2);                
output_d(0b00010000);
output_b(0x9c); // derece simgesi    
delay_ms(2);            
output_d(0b00100000);
output_b(0xc6); // C harfi   
delay_ms(2); 
output_d(0b00000000);

}


//------- ana program ----------------------------------------------------------

#include <ds18b20.c> 

void main ()                                 
{  

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);

setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);





   output_a(0x00);
   output_b(0x00);
   output_d(0x00);  
   delay_ms(2);
  
   while(1)                
   { 
   okunansicaklik = ds1820_read();  //Sıcaklık bilgisi okunuyor ve çevriliyor
  
      
       display1_birler=okunansicaklik%10;
       display1_onlar=(okunansicaklik/10)% 10;

  
   
       }
                          
}

drmp

yazdığın tamamıyla bunlar mı    ?

bu yazdığın haliyle  nasıl çalışır ??
while döngüsü içinde  sıcaklık tara subrutini yok  nasıl atlıyor o rutine ??

ds1820 biraz  işlemcini meşgul eder  bu yüzden displayler kıp kıp yapması lazım  bu kodla  yanıp sönmeyi nasıl engelledin ??

en azından yanıp sönen bir  display görmelisin !

Recep METE

#9
Alıntı yapılan: drmp - 02 Şubat 2014, 13:19:08
yazdığın tamamıyla bunlar mı    ?

bu yazdığın haliyle  nasıl çalışır ??
while döngüsü içinde  sıcaklık tara subrutini yok  nasıl atlıyor o rutine ??

ds1820 biraz  işlemcini meşgul eder  bu yüzden displayler kıp kıp yapması lazım  bu kodla  yanıp sönmeyi nasıl engelledin ??

en azından yanıp sönen bir  display görmelisin !

Hocam sıcaklık tara subrutini bu programda vardı.Ben sildim yine de çalıştı.Nasıl oluyor bu iş çözmedim.Belki ds18b20 kütüphanesi nedeniyle çalışıyor.Ds18b20 yüzünden display kıp kıp yanıyordu ancak kütüphanesinde yaptığım değişiklikle sabit yanmaya başladı.Ancak sfırın altında eksi değerin(-) kıp kıp yanmasını önleyemedim.Bunu gidermek için yapmam gereken nedir yardımınızı bekliyorum.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

drmp

elimden geldiği kadar yardım ederim sorun değil   

bu hafta gece vardiyasında çalıştığım için biraz yavaş ilerleyecek,
çocuğun odasına koymak için termometre yapmaya karar verdim  şeme ve kodları burada paylaşırım  ,

kolay gelsin...

Recep METE

Alıntı yapılan: drmp - 02 Şubat 2014, 23:02:31
elimden geldiği kadar yardım ederim sorun değil   

bu hafta gece vardiyasında çalıştığım için biraz yavaş ilerleyecek,
çocuğun odasına koymak için termometre yapmaya karar verdim  şeme ve kodları burada paylaşırım  ,

kolay gelsin...


Hocam kodları ve şemayı paylaşmanızı merakla ve sabırla bekleyeceğim.İyi akşamlar dilerim.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

drmp

arkadaşlar  programı  bitirdim



kodlar

kod  microbasic 'de yazılmıştır




program _16F84


dim  temp  as word
dim  tempr  as word
dim  temps  as word
dim  temp2 as word
dim  temp3 as word

dim siny as bit

dim d1 as byte
dim d10 as byte
dim d100 as byte


dim d01 as byte
dim d001 as byte


dim  j1    as byte
Dim  Value AS BYTE[5]
Dim  seg   AS BYTE [0..5]
DIM  DF    AS BYTE
Dim  a     As word
Dim  SAYI  AS Float
const index as byte[0..15] = ($FC,$60,$DA,$F2,$66,$B6,$BE,$E0,$FE,$F6,$02,$9E,$76,$1C,$7C,0)


const TEMP_RESOLUTION as byte = 12    'ds1820 sıcaklık çözünürlüğü
const TEMP_RES as byte = 12
const RES_SHIFT = TEMP_RES- 8



sub procedure calculate ()
if siny=1 then
    temp=temp + 16
    end if
tempr=temp
temps=temp

temp2=tempr and $000f



temp3=temps and $07f0
temp3=temp3 >> 4
temp3=temp3 and $007f    '

     if siny=1 then
          if temp3>0  then
          temp3=128 - temp3
          end if
     temp2=15-temp2
     end if
end sub

sub procedure digit ()
d1=0
d10=0
d100=0
d01=0
d001=0


while temp3 >= 100
    temp3=temp3-100
    d100=d100+1
    wend

while temp3 >= 10
    temp3=temp3-10
    d10=d10+1
    wend
   
while temp3 >= 1
    temp3=temp3-1
    d1=d1+1
    wend
   

temp2=temp2*625

d01=temp2/1000

end sub

sub procedure B20_kod()
    delay_us(10)

    Ow_Reset(PORTA, 4)                                     ' Onewire reset signal
    Ow_Write(PORTA ,4, 0xCC)                               ' Issue command SKIP_ROM
    Ow_Write(PORTA ,4, 0x44)

    Delay_us(120)
    Ow_Reset(PORTA ,4)
    Ow_Write(PORTA ,4, 0xCC)                              ' Issue command SKIP_ROM
    Ow_Write(PORTA ,4, 0xBE)                               ' Issue command READ_SCRATCHPAD
    temp =  Ow_Read(PORTA ,4)
    temp = (Ow_Read(PORTA ,4) << 8) + temp

end sub

sub procedure signature ()
    if temp.14=1 then
    siny=1
    temp=temp and $07ff
    else
    siny=0
    end if
end sub






main:                   'ana program
     TRISA  = 0
     TRISB  = 0



   while (TRUE)              'sonsuz loop


   B20_kod ()      'ds18b20 sub rutini
   signature()      'işaret kontrol
   calculate ()      'sıcaklığı sayıya çevirme
   digit ()          'digitlere ayırma+
   


'///////////////////////////////////////////////////////////////////////////////
             porta.0=0
             if d100=0 then
                          if siny=1 then
                          portb=2
                          else
                          portb=0
                          end if
             else
             PORTB=index [d100]     'yüzler basamağı
             end if
             Delay_mS (10)
             PORTB=0
             
             porta.0=1

'///////////////////////////////////////////////////////////////////////////////

             porta.1=0
             if (d100=0) and (d10=0) then
             portb=0
             else
             PORTB=index [d10]    'onlar basamağı
             end if
             
             Delay_mS (10)
             PORTB=0
             porta.1=1
             
             
             porta.2=0
             portb=index[d1]
             portb=portb+1     '+1  dp noktalama
             Delay_mS (10)
             PORTB=0
             porta.2=1
'///////////////////////////////////////////////////////////////////////////////
              porta.3=0
             PORTB=index [d01]     'virgülden sonraki basamak
             Delay_mS (10)
             PORTB=0
             porta.3=1

             porta=$ff

  wend
 
 



End.



hex dosyası:


:02000000EC29E9
:0400060000000800EE
:10000A00A5308312CD00CD0B08280000000008009F
:10001A0019308312CD00CD0B102800000000080013
:0E002A0010308312CD00CD0B18280000080006
:1000380083121F08C1000130C00041080319282895
:10004800C00D4010FF3E22284008A3004009A2002E
:100058001E088400A001A101220880058417220837
:100068008005032023088004032084132308000547
:10007800C00003194C282108C1000130C000410804
:1000880003194A28C00D4010FF3E44284008A00428
:10009800152015202108073A03195428A10A3028E9
:0600A8002008C000080062
:1000AE0083121F08C1000130C000410803196328E4
:1000BE00C00D4010FF3E5D284008A200C0091E087A
:1000CE00840040088005841740088005052022081A
:1000DE00800484130D2022080005C1004108003A57
:1000EE0003197D280130A000A1017F28A001A101E4
:0C00FE0005202008C0002108C1000800F7
:10010A0083120313CB01CA01C9018030C800C10C94
:10011A00C00C031C99284408C90745080318450F51
:10012A00CA070318CB0A0310C01FA1284408CA072C
:10013A0045080318450FCB07CB0CCA0CC90CC80CD1
:10014A00031C8C284B08C3004A08C2004908C10096
:06015A004808C000080087
:1001600083121F08C1000130C00041080319BC28D8
:10017000C00D4010FF3EB6284008A300C00940084B
:10018000A2001E088400400880058417A1012108F0
:10019000C1002008C00041080319D228C00CC013B8
:1001A000FF3ECC2801304005C100220880054108EF
:1001B000003A0319DD28230880040D202308800459
:1001C0002108073A0319E628A10AC7288413152035
:0401D00015200800EE
:1001D40083120313C801C9011030CC00410DC80DAE
:1001E400C90D4408C8024508031C450FC902031879
:1001F40002294408C80745080318450FC907031016
:0A020400C00DC10DCC0BF02808005E
:10020E0083129601950198019701900100300F021B
:10021E00031D132964300E02031C1B2964308E0249
:10022E00031C8F03980A0D2900300F02031D21298C
:10023E000A300E02031C29290A308E02031C8F037A
:10024E00950A1B2900300F02031D2F2901300E02C3
:10025E00031C372901308E02031C8F03960A2929AD
:10026E001308C0001408C1007130C4000230C5006C
:10027E0085204008930041089400E830C400033004
:0A028E00C500EA20400897000800B0
:1002980083121D1C5329103091070318920A110864
:1002A8009B0012089C001108990012089A000F3050
:1002B800110593001208940000309405F0301105E0
:1002C8008E00120807398F008F0C8E0C8F138F0C3D
:1002D8008E0C8F138F0C8E0C8F138F0C8E0C8F132C
:1002E8007F308E0500308F051D1C92290F08003CB9
:1002F800031D80290E08003C03188A290E08803C3B
:100308008E000F08031C013E8F018F0213080F3C5B
:0E03180093001408031C013E94019402080097
:100326008312121F9C291D14FF3091050730920578
:060336009D291D100800C6
:0C033C0083120D088A000C0882000800E3
:1003480003308312CD00CD0BA72905309E00043061
:100358009F00572005309E0004309F00CC30A0003D
:10036800B02005309E0004309F004430A000B0202B
:100378002730CD00CD0BBE290000000005309E00BF
:1003880004309F00572005309E0004309F00CC3079
:10039800A000B02005309E0004309F00BE30A000B1
:1003A800B02005309E0004309F001C2040089100BA
:1003B800920105309E0004309F001C204008C200B6
:1003C800C1014108910742080318013E920708003D
:1003D800831685018601A42193214C21072105104C
:1003E8001808003A031DFF291D1CFD29023086004C
:1003F800FE2986010E2A1808853EC000023003181F
:10040800013EC10040088C0041088D009E218A11E0
:100418000A1286000D30CC00FB30CD00CD0B122A1D
:10042800CC0B122A0000000086010514851018085C
:10043800003AFF30031D0030C1001508003AFF30B4
:10044800031D0030C0004108C00503192D2A86018C
:100458003C2A1508853EC00002300318013EC10041
:1004680040088C0041088D009E218A110A128600DE
:100478000D30CC00FB30CD00CD0B402ACC0B402AF0
:10048800000000008601851405111608853EC0008D
:1004980002300318013EC10040088C0041088D005D
:1004A8009E218A110A128600860A0D30CC00FB3084
:1004B800CD00CD0B5D2ACC0B5D2A00000000860123
:1004C800051585111708853EC00002300318013E46
:1004D800C10040088C0041088D009E218A110A1233
:1004E80086000D30CC00FB30CD00CD0B792ACC0B2B
:1004F800792A0000000086018515FF308500EF2964
:02050800842A43
:10050A00FC346034DA34F2346634B634BE34E0345F
:10051A00FE34F63402349E3476341C347C3400348F
:02400E00FA3F77
:00000001FF

Recep METE

"drmp" Hocam program için çok teşekkürler.Ellerin dert görmesin.Bir sorum olacak bunun ccs c ile yazılmış olanı var mı acaba.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

drmp

#14
maalesef  ccs veya başka bir versiyonu şimdilik yok
ama sen  ccs 'ye dönüştürebilirsin

daha board'a geçirme fırsatım olmadı
  her nekadar isiste çalışsada bazen sıkıntı olabiliyor

mesaj birleştirme:: 06 Şubat 2014, 10:15:09

yeni farkına vardım   koddaki  bir yere gülen adam gelmiş   gülen adam yerine   8  yazmanız gerekli