كود:
#include <mega8.h>
#include <stdlib.h>
#include <delay.h>
#define SH PORTB.0
#define DS PORTB.1
#define ST PORTB.2
#define SH1 PORTB.3
#define DS1 PORTB.4
#define ST1 PORTB.5
// I2C Bus functions
#include <i2c.h>
// DS1307 Real Time Clock functions
#include <ds1307.h>
// Declare your global variables here
//////////////////////////////////////////////////////////////////////////
unsigned char week[9]={128,64,32,16,8,4,2,0}; //مصفوفة لايام الاسبوع
unsigned char out_pw[7]={128,64,32,16,8,4}; //مصفوفة لتشغيل وحدات الاظهار
unsigned char seg0=~192,seg1=~249,seg2=~164,seg3=~176,seg4=~153,seg5=~146,seg6=~130, //مصفوفة الارقام التي تظهر على وحدات الاظهار
seg7=~248,seg8=~128,seg9=~144,seg10=~255,seg11=~156,seg12=~198;
unsigned char strh[6],strh12[6],strd[6],stry[6],strr[6]; //مصفوفات لوضع قيم اليوم والتاريخ والسنة بعد تحويلها من النظام الثنائي الى النظام العشري
unsigned char wek,h,m,s,d2,m2,y2,h12,G1=0,conter=0,SET=0; //المتغيرات المستخدمة ضمن البرنامج
unsigned char segmant_week,segmant,segmant1=0,segmant2=0,segmant3=0,segmant4=0,X=0,X1=0,Y=0,Z=0,W=0;
unsigned int rest=0,rest1=0,Change=0,SET_CONTR=0,set_end=0;
unsigned char TM=0,G=0,off=1,Se=0,INC=0,DEC=0,SEE=0,SEE1=0,Butt=0,Read_wek=0,memory1;
unsigned int ADC_time=0,time12_24=0;
float hetr=0;
eeprom char memory;
/////////////////////////////////////////////////////////////////////////
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void) //مقاطعة التايمر زيرو تحدث كل 1 ميلي ثانية
{
TCNT0=0xF8;
if(PIND.7==0)rest++;
else rest=0;
if(PIND.7==1)rest1++;
else rest1=0;
Change++;
conter++;
if(SET!=0)SET_CONTR++;
if(SEE==1)set_end++;
ADC_time++;
if(PIND.0==0&&TM==0)time12_24++;
}
// Voltage Reference: AREF pin
#define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR))
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | ADC_VREF_TYPE;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
// Wait for the AD conversion to complete
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
return ADCW;
}
void divide_h() //تحويل قيمة متغيرات الوقت من الباينري ووضعها في متغيرات تمثل قيم الأحاد والعشرات
{
strh[0]=(h/10);
strh[1]=(h%10);
strh[2]=(m/10);
strh[3]=(m%10);
}
void divide_h12() //تحويل قيمة متغيرات الوقت من الباينري ووضعها في متغيرات تمثل قيم الأحاد والعشرات
{
strh12[0]=(h12/10);
strh12[1]=(h12%10);
strh12[2]=(m/10);
strh12[3]=(m%10);
}
/////////////////////////////////////////////////////////////////////
void divide_d() //تحويل قيمة متغيرات التاريخ من الباينري ووضعها في متغيرات تمثل قيم الأحاد والعشرات
{
strd[0]=(d2/10);
strd[1]=(d2%10);
strd[2]=(m2/10);
strd[3]=(m2%10);
}
////////////////////////////////////////////////////////////////////
void divide_Y() //تحويل قيمة متغيرات السنة من الباينري ووضعها في متغيرات تمثل قيم الأحاد والعشرات
{
stry[0]=(2);
stry[1]=(0);
stry[2]=(y2/10);
stry[3]=(y2%10);
}
///////////////////////////////////////////////////////////////
void out_data (unsigned char B) //اخراج الداتا على الشيفت ريجيستر
{
switch (B)
{
case 0: segmant=seg0;
if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;} //لوضع الفاصلة عند عرض التاريخ فقط
for (X=0;X<8;X++)
{
DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
}; break;
case 1: segmant=seg1;
if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
for (X=0;X<8;X++)
{
DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
};break;
case 2: segmant=seg2;
if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
for (X=0;X<8;X++)
{
DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
};break;
case 3: segmant=seg3;
if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
for (X=0;X<8;X++)
{
DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
};break;
case 4: segmant=seg4;
if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
for (X=0;X<8;X++)
{
DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
};break;
case 5: segmant=seg5;
if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
for (X=0;X<8;X++)
{
DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
};break;
case 6: segmant=seg6;
if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
for (X=0;X<8;X++)
{
DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
};break;
case 7: segmant=seg7;
if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
for (X=0;X<8;X++)
{
DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
};break;
case 8: segmant=seg8;
if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
for (X=0;X<8;X++)
{
DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
};break;
case 9: segmant=seg9;
if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
for (X=0;X<8;X++)
{
DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
};break;
//////////////////////////
case 10: segmant=seg10; //وحدة السفن سيكمنت مطفئة
for (X=0;X<8;X++)
{
DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
};break;
/////////////////////////
case 11: segmant=seg11; //اظهار الدائرة التي تمثل اشارة درجة الحرارة
for (X=0;X<8;X++)
{
DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
};break;
//////////////////////////
case 12: segmant=seg12; //اظهار حرف الذي يمثل درجة الحرارة:C
for (X=0;X<8;X++)
{
DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
};break;
////////////////////
};
ST=1;ST=0;
}
//////////////////////////////////////////////////////////////////////////////
void out_week (unsigned char BB) //اظهار اليوم على الليدات
{
switch (BB)
{
case 1: segmant_week=week[0];
if(h>=12){segmant_week=segmant_week^0b00000001;} //لتحديد وتشغيل ليد قبل الظهر او بعد الظهر
for (X1=0;X1<8;X1++)
{
DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
}; break;
case 2: segmant_week=week[1];
if(h>=12){segmant_week=segmant_week^0b00000001;}
for (X1=0;X1<8;X1++)
{
DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
};break;
case 3: segmant_week=week[2];
if(h>=12){segmant_week=segmant_week^0b00000001;}
for (X1=0;X1<8;X1++)
{
DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
};break;
case 4: segmant_week=week[3];
if(h>=12){segmant_week=segmant_week^0b00000001;}
for (X1=0;X1<8;X1++)
{
DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
};break;
case 5: segmant_week=week[4];
if(h>=12){segmant_week=segmant_week^0b00000001;}
for (X1=0;X1<8;X1++)
{
DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
};break;
case 6: segmant_week=week[5];
if(h>=12){segmant_week=segmant_week^0b00000001;}
for (X1=0;X1<8;X1++)
{
DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
};break;
case 7: segmant_week=week[6];
if(h>=12){segmant_week=segmant_week^0b00000001;}
for (X1=0;X1<8;X1++)
{
DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
};break;
case 8: segmant_week=week[7];
if(h>=12){segmant_week=segmant_week^0b00000001;}
for (X1=0;X1<8;X1++)
{
DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
};break;
};
ST1=1;ST1=0;
}
////////////////////////////////////////////////////////////////////////////////////////
void Button() //تابع يتم استدعائه عندما نريد ضبط الوقت عن طريق السويتشات
{
divide_h();
divide_d();
divide_Y();
if(PIND.0==0&&SEE1==0&&TM==0){Se=1;SEE=1;set_end=0;} // سويتش بداية الضبط
if(Se==1&&PIND.0==1){Se=0;SET++;}
if(TM==1)Se=0;
if(PIND.0==1)SEE1=0;
if(SET==1||SET==2||time12_24!=0&&TM==0){Change=5;} //لاظهار الساعة والدقائق فقط عند الضبط دون التبديل بين التاريخ ودرجة الحرارة
if(SET==3||SET==4)Change=5000; //لاظهار اليوم والشهر فقط دون التبديل بين الوقت ودرجة الحرارة اثناء الضبط
if(SET==5)Change=12000; //لاظهار السنة عند الضبط دون التبديل بين الوقت والتاريخ ودرجة الحرارة
if((SET==7||set_end>=6000)&&(TM==0))//ارسال القيم الى اي سي الوقت بعد الانتهاء من ضبط جميع المتغيرات
{ //للوقت والتاريخ والسنة وايام الاسبوع او اذا ضغطنا سويتش بداية
SET=0; //الضبط ولم نتابع الضبط لمدة تزيد عن حمس ثواني عندها تعود الساعة
Change=0; //للعرض عند اخر قيم تم حفظها
SET_CONTR=0;
SEE=0;
Se=0;
set_end=0;
SEE1=1;
Butt=0;
time12_24=0;
TM=0;
rtc_set_time(h,m,s=1);
rtc_set_date(wek,d2,m2,y2);
rtc_get_time(&h,&m,&s);
rtc_get_date(&wek,&d2,&m2,&y2);
G1=s;
h12=h;
if(h>12)h12=h-12;
if(h==0)h12=12;
divide_h12();
memory1=memory;
out_week(wek);
}
///////////////////////////////////////////////////////////////////////
if(SET==1&&SET_CONTR>500) {memory1=0;strh[0]=10;strh[1]=10;} //من اجل وميض الخانة التي نقوم بضبطها
if(SET==1&&SET_CONTR>1000) {SET_CONTR=0;}
if(SET==2&&SET_CONTR>500) {memory1=0;strh[2]=10;strh[3]=10;}
if(SET==2&&SET_CONTR>1000) {SET_CONTR=0;}
if(SET==3&&SET_CONTR>500) {strd[0]=10;strd[1]=10;}
if(SET==3&&SET_CONTR>1000) {SET_CONTR=0;}
if(SET==4&&SET_CONTR>500) {strd[2]=10;strd[3]=10;}
if(SET==4&&SET_CONTR>1000) {SET_CONTR=0;}
if(SET==5&&SET_CONTR>500) {stry[0]=10;stry[1]=10;stry[2]=10;stry[3]=10;}
if(SET==5&&SET_CONTR>1000) {SET_CONTR=0;}
if(SET==6&&SET_CONTR>500) {out_week(8);}
if(SET==6&&SET_CONTR>1000) {SET_CONTR=0;out_week(wek);}
/////////////////////////////////////////////////////////////////
if(SET==1&&INC==0&&PIND.1==0) //استخدام السويتشات من اجل ضبط الوقت والتاريخ وايام الاسبوع
{
memory1=0;INC=1;h++;set_end=0;
if(h>23)h=0;
h12=h;
out_week(wek);
}
if(PIND.1==1)INC=0;
if(SET==1&&DEC==0&&PIND.2==0)
{
memory1=0;DEC=1;h--;set_end=0;
if(h==255)h=23;
h12=h;
out_week(wek);
}
if(PIND.2==1)DEC=0;
if(SET==2&&INC==0&&PIND.1==0){set_end=0;INC=1;m++;}
if(PIND.1==1)INC=0;
if(m==60)m=0;
if(SET==2&&DEC==0&&PIND.2==0){set_end=0;DEC=1;m--;}
if(PIND.2==1)DEC=0;
if(m==255)m=59;
if(SET==3&&INC==0&&PIND.1==0){set_end=0;INC=1;d2++;}
if(PIND.1==1)INC=0;
if(d2>31)d2=1;
if(SET==3&&DEC==0&&PIND.2==0){set_end=0;DEC=1;d2--;}
if(PIND.2==1)DEC=0;
if(d2==0)d2=31;
if(SET==4&&INC==0&&PIND.1==0){set_end=0;INC=1;m2++;}
if(PIND.1==1)INC=0;
if(m2>12)m2=1;
if(SET==4&&DEC==0&&PIND.2==0){set_end=0;DEC=1;m2--;}
if(PIND.2==1)DEC=0;
if(m2==0)m2=12;
if(SET==5&&INC==0&&PIND.1==0){set_end=0;INC=1;y2++;}
if(PIND.1==1)INC=0;
if(y2>99)y2=0;
if(SET==5&&DEC==0&&PIND.2==0){set_end=0;DEC=1;y2--;}
if(PIND.2==1)DEC=0;
if(y2==255)y2=99;
if(SET==6&&INC==0&&PIND.1==0){set_end=0;INC=1;wek++;}
if(PIND.1==1)INC=0;
if(wek>=8)wek=1;
if(SET==6&&DEC==0&&PIND.2==0){set_end=0;DEC=1;wek--;}
if(PIND.2==1)DEC=0;
if(wek==0)wek=7;
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRB=(0<<DDB7) | (0<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=T Bit6=T Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port C initialization
// Function: Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=In Bit0=In
DDRC=(1<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=T Bit0=T
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
// Port D initialization
// Function: Bit7=In Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=P Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=P Bit1=P Bit0=P
PORTD=(1<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (1<<PORTD2) | (1<<PORTD1) | (1<<PORTD0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 7.813 kHz
TCCR0=(1<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0xF8;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (1<<TOIE0);
// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AREF pin
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
SFIOR=(0<<ACME);
// Bit-Banged I2C Bus initialization
// I2C Port: PORTB
// I2C SDA bit: 7
// I2C SCL bit: 6
// Bit Rate: 100 kHz
// Note: I2C settings are specified in the
// Project|Configure|C Compiler|Libraries|I2C menu.
i2c_init();
// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: On
// Square wave frequency: 1Hz
rtc_init(0,1,0);
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
#pragma optsize-
WDTCR=(1<<WDCE) | (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
WDTCR=(0<<WDCE) | (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Global enable interrupts
#asm("sei")
/////////////////////////////////////
rtc_get_time(&h,&m,&s); // 1307عند بداية التشغيلDS للقراءة من
rtc_get_date(&wek,&d2,&m2,&y2);
G1=s;
out_week(wek);
hetr=read_adc(0);
hetr=hetr*5000.0/1023.0;
ftoa(hetr,0,strr);
strr[0]=strr[0]-48;
strr[1]=strr[1]-48;
strr[2]=11;
strr[3]=12;
h12=h;
if(h>12)h12=h-12;
if(h==0)h12=12;
divide_h();
divide_h12();
divide_d();
divide_Y();
memory1=memory;
/////////////////////////////////////
while (1)
{
#asm("wdr")
if(PIND.0==0)Butt=1;
if(Butt==1)Button();
if(PIND.0==0&&TM==0&&time12_24>=4000)
{
TM=1;
memory=!memory;
memory1=memory;
}
if(PIND.0==1&&TM==1){TM=0;time12_24=0;}
//////////////////////////////////////////////////////////
if(h==0&&Read_wek==0) //لقراءةوعرض اليوم والتاريخ عند الساعة 12 ليلا
{
Read_wek=1;
rtc_get_date(&wek,&d2,&m2,&y2);
out_week(wek);
}
else if(h!=0) Read_wek=0;
////////////////////////////////////////////////////////////////////////////////
if(ADC_time>=65000) //قراءة قيمة حساس الحرارة كل دقيقتين وحساب المعادلة الخاصة بالحساس ووضع القيم في المتغيرات
{
ADC_time=0;
hetr=read_adc(0);
hetr=hetr*5000.0/1023.0;
ftoa(hetr,0,strr);
strr[0]=strr[0]-48;
strr[1]=strr[1]-48;
strr[2]=11;
strr[3]=12;
}
/////////////////////////////////////////////////////////////
/*
if((rest>=600)||(rest1>=600)) // في حال تم التشويش على اي سي الوقت وتوقفت عن العمل
{ //يوجد تايمر مفعل اكثر من نصف ثانية فعند تأخر ورود الاشارة
rest=0; //اكثر من نصف ثانية نقوم باعادة ارسال الوقت من المتغيرات
rest1=0; //الى اي سي الوقت لاعادة تشغيلها من حيث توقفت
rtc_set_time(h,m,s=1);
rtc_set_date(wek,d2,m2,y2);
rtc_get_time(&h,&m,&s);
rtc_get_date(&wek,&d2,&m2,&y2);
G1=s;
} */
////////////////////////////////////////////////////////////////////////////////
if(G==0&&PIND.7==1){G=PIND.7;G1++;} //قراءة الوقت من الايسي كل 60 ثانية
if(PIND.7==0)G=0;
if(G1>=60)
{
G1=0;
rtc_get_time(&h,&m,&s);
rtc_get_date(&wek,&d2,&m2,&y2);
out_week(wek);
G1=s;
h12=h;
if(h>12)h12=h-12;
if(h==0)h12=12;
divide_h(); //استدعاء تابع تقسيم الوقت
divide_h12(); //استدعاء تابع تقسيم الوقت لنظام 12 ساعة
divide_d(); //استدعاء تابع تقسيم التاريخ
divide_Y(); //استدعاء تابع تقسيم السنة
}
////////////////////////////////////////////////////////////////////////////////
if(off==1)
{
off=0;
if(memory1==0)segmant1=strh[Y]; //وضع خانة الوقت الحالية في متغير لعرضها على وحدات الاظهار لنظام 24 ساعة
else if(memory1==1)segmant1=strh12[Y]; //وضع خانة الوقت الحالية في متغير لعرضها على وحدات الاظهار لنظام 12 ساعة
segmant2=strd[Y]; //وضع خانة التاريخ الحالية في متغير لعرضها على وحدات الاظهار
segmant=stry[Y]; //وضع خانة السنة في متغير لعرضها اثناء ضبط السنة فقط
segmant3=strr[Y]; //وضع خانة الحرارة الحالية في متغير لعرضها على وحدات الاظهار
segmant4=out_pw[Y]; //لتشغيل وحدة الاظهار المطلوبة
////////////////////////////////////////////////////////
for (Z=0;Z<8;Z++) //ارسال بايت الى الشيفت ريجيستر لتشغيل وحدات الاظهار بالتسلسل
{ //مع ملاحظة اننا وصلنا الشيفت ريجيستر الخاص بالبيانات مع الشيفت
//ريجيستر الخاص بتفعيل وحدات الاظهار فهنا نقوم فقط بارسال البايت
// لرقم الوحدة التي سوف يكون دورها بالتشغيل وعند ارسال البيانات
//نقوم باخراج القيمة للداتا + تشغيل وحدة الاظهار مع بعض
DS=segmant4&0b00000001;SH=1;SH=0;segmant4=segmant4>>1;
};
////////////////////////////////////////////////////////////////////
if(Change<5000){out_data(segmant1);PORTD.6=PIND.7;} //اظهار الوقت لمدة اربع ثواني + تشغيل واطفاء ليد الثواني
if(Change>=5000&&Change<8000){out_data(segmant2);PORTD.6=0;} //اظهار التاريخ لمدة ثلاث ثواني + اطفاء ليد الثواني
if(Change>=8000&&Change<11000)out_data(segmant3); //اظهار درجة الحرارة لمدة ثلاث ثواني
if(Change>=12000&&SET==5)out_data(segmant); //لضبط السنة وحفظها دون عرضها اثناء عمل الساعة
if(Change>=11000&&SET!=5)Change=0; //عودة الاظهار من البداية
Y++; //متغير اختيار وحدة الاظهار التي تعمل الان وهم اربع وحدات اضهار او ستة اذا كنا نريد وضع وحدتي اظهار اخرى لاظهار الثواني
/////////////////////////////////////////////////////////////////////////////////
}
////////////////////////////////////////////////////////////////////////////
if(conter>=3) //تأخير زمني اربعة ميلي ثانية بين عرض كل وحدة اظهار
{
conter=0;
if(Y>=4)Y=0; //عند الانتهاء من عرض وحدة الاظهار الاخيرة نعود من البداية
off=1; // 6ونخفض قيمة الكاونتر من اربعة الى ثلاثة او اثنان =Yاذا اردنا عرض الثواني نضع قيمة
//وهي قيمة التأخير الزمني بين عرض كل وحدة اظهار لكي لانشعر برجفة بوحدات الاظهار
//////////////////////////////////////////////////////////
for (W=0;W<16;W++) //لاطفاء وحدات الاظهار قبل عرض رقم اخر لكي لايحدث تداخل بالارقام
{
DS=0;
SH=1;
SH=0;
};
ST=1;ST=0;
}
}
}