Nixie Saat/Gösterge Yapıyoruz

Başlatan FxDev, 13 Ekim 2016, 19:12:30

gokhangokcen

#105
@Klein üstad kesme içerisinde tarama yaparken zaten 1. segmentler pasif iken veriyi basıp displayi aktif ediyorum sonra 1. kısım pasif veriyi bas ve 2. kısımı aç şeklinde oluşmakta.

#include <16F877A.h>
#include <74595.c>



#fuses XT,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP

#use delay(clock=4000000)
#use I2C(Master, SDA = pin_C4, SCL = pin_C3)

#define arti PIN_A0
#define eksi PIN_A1
#define enter PIN_A2
#define dsp1 PIN_D4
#define dsp2 PIN_D3
//#define ONE_WIRE_PIN PIN_B0


#use fast_io(a)
//#use fast_io(b)
//#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#include "DS3231.c"
#include "ds18b20.c"


/**********************************Display Tanımlamaları*********************************/
const int digit[12]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E,0xFE,0xDE,0x72,0xC6};
//                     0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 , C  , o
const int ndigit[12]={0x7F,0x0D,0xB7,0x9F,0xCD,0xDB,0xFB,0x0F,0xFF,0xDF,0x73,0xC7};
//          noktalı    0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 ,  C  , o

/**********************************DS3231 Tanımlamaları*********************************/
unsigned int set;
unsigned char s = 00;
unsigned char min = 54;
unsigned char hr = 11;
unsigned char dy = 4;      //1 pazar 2 pazartesi 3 salı 4 çrşmba 5 perşmbe 6 cuma 7 cumartesi
unsigned char dt = 15;      // gün
unsigned char mt = 02;     //Ay
unsigned char yr = 17;     //yıl
short hr_format = _24_hour_format;
short am_pm = 0;

/**********************************Global Değişkenler*********************************/
unsigned int sayac,s1,s2,min1,min2,hr1,hr2,dt1,dt2,mt1,mt2,yr1,yr2,dr1,dr2,temperature=99;
int data[3];
unsigned long sure,x=0,deger=0;


/**********************************Display Tarama Kesmesi*********************************/
#int_timer0
void timer0_kesme ()
{
x++; //kesme ile arttır
deger++;
  sayac%=2;                  // reset to 0 if > 1 
  if (!sayac)               // test for digit 0 
  { 
       output_low(dsp1);
       if (sure<7000){
       s1 = s/10;
       min1 = min/10;
       hr1 = hr/10;
       data[2]=digit[s1];data[1]=digit[min1];data[0]=digit[hr1];}
       if (sure>=7000&&sure<7500){
       dt1 = dt/10;
       mt1 = mt/10;
       yr1 = yr/10;
       data[0]=digit[dt1];data[1]=digit[mt1];data[2]=digit[yr1];
       }
       if (sure>=7500&&sure<8000){
       dr1 = temperature/10;
       data[0]=0x00;data[1]=digit[dr1];data[2]=digit[11];
       }
       write_expanded_outputs(data);
       output_high(dsp2);
  #asm
  nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
  #endasm
  }else{
       output_low(dsp2);
       if (sure<7000){
       s2 = s%10;
       min2 = min%10;
       hr2 = hr%10;
       data[2]=digit[s2];data[1]=ndigit[min2];data[0]=ndigit[hr2];}
       if (sure>=7000&&sure<7500){
       dt2 = dt%10;
       mt2 = mt%10;
       yr2 = yr%10;
       data[0]=ndigit[dt2];data[1]=ndigit[mt2];data[2]=digit[yr2];
       }
       if (sure>=7500&&sure<8000){
       dr2 = temperature%10;
       data[0]=0x00;data[1]=digit[dr2];data[2]=digit[10];
       }
       write_expanded_outputs(data);
       output_high(dsp1);     
   }
   sure++;if(sure>8000)sure=0;
   sayac++;if(sayac>1)sayac=0;
   
}



/**********************************Ana Program*********************************/
void main()
{
   setup_psp(PSP_DISABLED); // PSP 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_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_bit);
   setup_comparator(NC_NC_NC_NC);
   setup_adc(ADC_OFF);
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);
   
   set=DS3231_read(controlREG);
   if(bit_test(set,7)){DS3231_init();}

temperature = ds1820_read();
enable_interrupts(INT_TIMER0);                            
enable_interrupts(GLOBAL);

set_tris_a(0x07);
set_tris_d(0x00);
set_tris_e(0x00);
output_d(0x00);
output_e(0x00);


         //setTime(hr, min, s, am_pm, hr_format);
         //setDate(dy, dt, mt, yr);


while(TRUE)
{
if(sure==7000){temperature = ds1820_read();
getDate(dy, dt, mt, yr);
}
if(deger>=25){
getTime(hr, min, s, am_pm, hr_format);
deger=0;}

}
}



Edit: Kodu tekrar yapıştırır iken fark ettim haklısınız. önce segmenti aktif edip veriyi basmışım tam tersi olması gerekirdi. Düzenleyip deneyeceğim.

Edit2: Kodun son hali (Main) üsttekidir. İlerleyen süreçlerde ayar butonlarını aktif edip deneyeceğim. @Klein hocam teşekkür ederim. Gözden kaçırdığım noktaya değinmişsin. Şu an harika çalışmakta
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.