 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:333
|
|
26-07-2017, 01:34 PM
المشاركة 7
|
|
البرنامج الثانى باستخدام 4 وحدة عرض أى أن مدى التزايد والتناقص هو 0-9999 :
الدائرة الكهربية :

البرنامج :
كود:
/*
UP Down Counter with Four 7-Segment Display Multiplexing
In this project four common anode 7-segment LED displays are connected to
PORTD of a PIC16F877A * 4MHz .
Digit 1 (left digit) enable pin is connected to port pin RA0 ( Thousands)
and digit 2 enable pin is connected to port pin RA1 (Hundreds) .
and digit 3 enable pin is connected to port pin RA2 (Tens) .
and digit 4 enable pin is connected to port pin RA3 (Ones) .
The program counts up -down from buttons at RB0 , RB1 .
The display is updated in a timer interrupt service routine at every 5ms by :
Reload TMR0=100 & prescaler ration 1:32>> imer interrupt service routine at
(255-100) *32us=5ms = scanning time
*/
#define Thous_Dig PORTA.B0 //Thousands unit
#define Hund_Dig PORTA.B1//Hndreds unit
#define Tens_Dig PORTA.B2//Tens unit
#define Ones_Dig PORTA.B3//ones unit
//Global variable
unsigned char Count = 0;
unsigned char Flag = 0;
bit oldstate1;
bit oldstate2;
//-Function to Return mask for common anode 7-seg. display
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 0xF8;
case 8 : return 0x80;
case 9 : return 0x90;
} //case end
}
// TMR0 timer interrupt service routine. The program jumps to the ISR at every 5ms.
void interrupt ()
{
//Local variable
unsigned char Thous_Seg,Hund_Seg,Tens_Seg, Ones_Seg;
TMR0 = 100; // Re-load TMR0>>255-100=155usx32(prescaler)=5ms
INTCON = 0x20; // >>>>Set T0IE and clear T0IF<<<<
if(Flag == 0) // Do digit 1
{
Ones_Dig = 1;
Tens_Dig = 1;
Hund_Dig = 1;
Thous_Seg = Count / 1000; // TENS_SEG >>tens
PORTD = mask(Thous_Seg); // Send to PORTD
Thous_Dig = 0; // Enable digit 1>>RA0
}
else
if(Flag == 1) // Do digit 1
{
Ones_Dig = 1;
Tens_Dig = 1;
Thous_Dig = 1;
Hund_Seg = (Count / 100)%10; // TENS_SEG >>tens
PORTD = mask(hund_Seg); // Send to PORTD
Hund_Dig=0; // Enable digit 1>>RA0
}
else
if(Flag == 2) // Do digit 1
{
Ones_Dig = 1;
Hund_Dig = 1;
Thous_Dig = 1;
Tens_Seg = (Count / 10)%10; // TENS_SEG >>tens
PORTD = mask(Tens_Seg); // Send to PORTD
Tens_Dig=0; // Enable digit 1>>RA0
}
else
if(Flag == 3) // Do digit 1
{
Tens_Dig = 1;
Hund_Dig = 1;
Thous_Dig = 1;
Ones_Seg = Count %10; // TENS_SEG >>tens
PORTD = mask(Ones_Seg); // Send to PORTD
Ones_Dig = 0; // Enable digit 1>>RA0
}
Flag =Flag++;
if (Flag > 3) Flag=0;
// Toggle Flag as switch , Counter
}
//
// Start of MAIN Program. configure PORTA and PORTD as outputs.
// In addition, configure TMR0 to interrupt at every 10ms
//
void main()
{
ADCON1=0X07; //set A PORT general I/O
TRISD= 0; // PORTD are outputs
PORTD=0XFF;
TRISA = 0; // outputs
PORTA=0XFF;
TRISB=0XFF;
PORTB=0XFF;
// Configure TMR0 timer interrupt
OPTION_REG = 0xC4; // Prescaler = 32
TMR0 = 100; // Load TMR0L with 100
INTCON = 0xA0; // Enable TMR0 interrupt
for(;;) // Endless loop
{
//UP Count
if (Button(&PORTB, 0, 1, 0)) { // Button 0 : Detect logical 0
oldstate1 = 1; // Update flag
}
if (oldstate1 && Button(&PORTB, 0, 1, 1)) { // Detect zero-to-one transition
Count = Count +1;
oldstate1 = 0; // Update flag
}
//DOWN Count
if(Button(&PORTB,1,1,0)){ // Button 1 : Detect logical 0
oldstate2 = 1; // Update flag
}
if (oldstate2 && Button(&PORTB, 1, 1, 1)) { // Detect zero-to-one transition
Count = Count -1;
oldstate2 = 0; // Update flag
}
if (Count > 9999) // if it's more than 9999 go to 0;
Count = 0;
}
}
|