ارجو من أهل الخبرة أن يرشدوني على دائرة وبرنامج micro c لعداد يستخدم pic16F877A مع seven segment بحيث عن طريق أزرار اختار كم أريده أن يعد ويتوقف ويتكون من ثلاث seven segment ، ولكم جزيل الشكر والتقدير .
|
السلام عليكم ورحمه الله ..
أخي الكريم لقد صممت لك هذة الدائرة مع البرنامج .. وهو عداد تصاعدي و مشروط بمعني مسبوق الضبط يتم اختيار رقم علي الشاشات وعند الوصول الي هذا الرقم يتوقف العداد علي الرقم اللذي تم ادخاله ..
اليك الدائرة ..
كود البرنامج لغه السي مع المترجم .. بالميكرو سي برو ..
كود:
// ENG _ ABDALLA HYGAZY //
// DATA _ 2017 / 7 / 6 //
// Counter program using 7SEGMENT //
// Save all data in eeprom memory //
unsigned short mask(unsigned short num);
unsigned int SEGMENT1=0,SEGMENT2=0,SEGMENT3=0,SEGMENT4=0,SEGMENT5=0,X=0,START=0,OUT_LOOP=0,CONTER=0;
unsigned int COPY_SEGMENT1=0,COPY_SEGMENT2=0,COPY_SEGMENT3=0,COPY_SEGMENT4=0,X1=0,X2=0,X3=0;
#define BUZZER PORTD.F7=1; delay_ms(40); PORTD.F7=0; delay_ms(30); PORTD.F7=1; delay_ms(40); PORTD.F7=0;
#define button PORTD.F7=1; delay_ms(20); PORTD.F7=0; delay_ms(10); PORTD.F7=1; delay_ms(20); PORTD.F7=0;
#define TEMER2 delay_ms(30);
#define TEMER_conter delay_ms(30);
#define TEMER3 delay_ms(300);
//.......................................................................
#define LED_SEGMENT1 PORTC.F0=1; PORTC.F1=0; PORTC.F2=0; PORTC.F3=0;
#define LED_SEGMENT2 PORTC.F1=1; PORTC.F0=0; PORTC.F2=0; PORTC.F3=0;
#define LED_SEGMENT3 PORTC.F2=1; PORTC.F0=0; PORTC.F1=0; PORTC.F3=0;
#define LED_SEGMENT4 PORTC.F3=1; PORTC.F0=0; PORTC.F1=0; PORTC.F2=0;
#define SEGMENTS_OFF SEGMENT1=0; SEGMENT2=0; SEGMENT3=0; SEGMENT4=0;
#define LED_OFF PORTC.F0=0; PORTC.F1=0; PORTC.F2=0; PORTC.F3=0;
#define COPY_SEGMENT_delete COPY_SEGMENT1=0; COPY_SEGMENT2=0; COPY_SEGMENT3=0; COPY_SEGMENT4=0;
//.......................................................................
#define Test_the_values_of_screens if(SEGMENT1==COPY_SEGMENT1&&SEGMENT2==COPY_SEGMENT2&&SEGMENT3==COPY_SEGMENT3&&SEGMENT4==COPY_SEGMENT4){ BUZZER BUZZER X2=1; START=0; OUT_LOOP=1;}
//........................................................................
#define Clear_the_screens if(PORTD.F3==1){ button delay_ms(200);if(PORTD.F3==0){goto loop;} button if(PORTD.F3==1){ delay_ms(150); if(PORTD.F3==1){ eeprom_DATA_Clear(); X2=0; PORTC.F4=0; COPY_SEGMENT_delete SEGMENTS_OFF button button button } }}
void interrupt(){
PORTA=1; PORTB=mask(SEGMENT1); delay_ms(2);
PORTA=2; PORTB=mask(SEGMENT2); delay_ms(2);
PORTA=4; PORTB=mask(SEGMENT3); delay_ms(2);
PORTA=8; PORTB=mask(SEGMENT4); delay_ms(2);
PORTA=16; PORTB=mask(SEGMENT5); delay_ms(2);
//....................................
if(SEGMENT1>10){SEGMENT1=0;}
if(SEGMENT2>10){SEGMENT2=0;}
if(SEGMENT3>10){SEGMENT3=0;}
if(SEGMENT4>10){SEGMENT4=0;}
//....................................
if(COPY_SEGMENT1>10){COPY_SEGMENT1=0;}
if(COPY_SEGMENT2>10){COPY_SEGMENT2=0;}
if(COPY_SEGMENT3>10){COPY_SEGMENT3=0;}
if(COPY_SEGMENT4>10){COPY_SEGMENT4=0;}
//....................................
INTCON=0b00100000;
TMR0=0;
}
void eeprom_DATA_Clear() {
eeprom_write(0,0);
eeprom_write(1,0);
eeprom_write(2,0);
eeprom_write(3,0);
}
void main() {
TRISB=0; PORTB=0; TRISD=15; PORTD=0;
TRISC=0; PORTC=0; TRISA=0; PORTA=0;
adcon1=0x06;
OPTION_REG=0x81; INTCON=0b10100000;
TMR0=217;
//*******************************************//
COPY_SEGMENT1 = eeprom_read(0);delay_ms(5);
COPY_SEGMENT2 = eeprom_read(1);delay_ms(5);
COPY_SEGMENT3 = eeprom_read(2);delay_ms(5);
COPY_SEGMENT4 = eeprom_read(3);delay_ms(5); //eeprom_read DATA read && write
SEGMENT1 = COPY_SEGMENT1 ;
SEGMENT2 = COPY_SEGMENT2 ;
SEGMENT3 = COPY_SEGMENT3 ;
SEGMENT4 = COPY_SEGMENT4 ;
//*****************************************//
//........................................................................................................
BUZZER
while(1){
loop:
if( PORTD.F2==1 ){button START=1; X2=0; LED_OFF TEMER2}
if( PORTD.F1==1 ){ X++; TEMER2}
if(X==1&&PORTD.F0==1){ SEGMENT1++; COPY_SEGMENT1++; eeprom_write(0,COPY_SEGMENT1); TEMER2 } // Select the numbers and display them on (7SEGMENT1 )
if(X==2&&PORTD.F0==1){ SEGMENT2++; COPY_SEGMENT2++; eeprom_write(1,COPY_SEGMENT2); TEMER2 } // Select the numbers and display them on (7SEGMENT2 )
if(X==3&&PORTD.F0==1){ SEGMENT3++; COPY_SEGMENT3++; eeprom_write(2,COPY_SEGMENT3); TEMER2 } // Select the numbers and display them on (7SEGMENT3 )
if(X==4&&PORTD.F0==1){ SEGMENT4++; COPY_SEGMENT4++; eeprom_write(3,COPY_SEGMENT4); TEMER2 } // Select the numbers and display them on (7SEGMENT4 )
//......................................................................
if(X==1){ LED_SEGMENT1 } // To select a screen LED (1)
if(X==2){ LED_SEGMENT2 } // To select a screen LED (2)
if(X==3){ LED_SEGMENT3 } // To select a screen LED (3)
if(X==4){ LED_SEGMENT4 } // To select a screen LED (4)
if(X>4 ){X=0; LED_OFF }
OUT_LOOP=0;
//......................................................................
PORTC.F5=1;
if( X2==1){X3++;delay_ms(1); }
if( X3==30){ PORTC.F4=1; }
if( X3==60){ PORTC.F4=0; }
if( X3>60){ X3=0; }
//......................................................................
//===================
Clear_the_screens // Clear_the_screens
//===================
if(START==1) // Start the counter
{ SEGMENTS_OFF PORTC.F5=0;
while(OUT_LOOP==0)
{
if(CONTER==0){ TEMER_conter SEGMENT4++;}
//....................................
if( SEGMENT4>9 ){SEGMENT3++; SEGMENT4=0; }
if( SEGMENT3>9 ){SEGMENT2++; SEGMENT3=0; }
if( SEGMENT2>9 ){SEGMENT1++; SEGMENT2=0; }
//....................................
if(PORTD.F2==1){ button OUT_LOOP=1;}
//....................................
Test_the_values_of_screens // Test the screen numbers and exit the program
//....................................
}
}
}
}
unsigned short mask(unsigned short num){
switch (num){
case 0 : return 0xC0;
case 1 : return 0xF9;
case 2 : return 0xA4;
case 3 : return 0xB0;
case 4 : return 0x99;
case 5 : return 0x92;
case 6 : return 0x82;
case 7 : return 0xD8;
case 8 : return 0x80;
case 9 : return 0x90;
case 10 : return 0x90;
}
}
المشروع كامل للتحميل .. من هنا
https://drive.google.com/file/d/0Bxg...ew?usp=sharing
لو هناك حاجه لشرح أو استفسار تفضل وأطلب ..
تحياتي لك ..