باسلام ، این تالار واقعا مهجور مانده وبه همین دلیل کسی هم دیگر سوالی نمی پرسد من جمله بنده که دیر با آن آشنا شدم . متاسفانه کاربر محترم farzadsw که جور بسیاری از مشکلات مطرح شده را کشیده اند هم مشغول پروژه ها و وبلاگ خودشان هستند .
آقای فرشاد خان برای این جور مطالب با یک جستجو در وب ، موارد زیادی یافت میشوند که نیازمند تغییرات اندک هستند . منجمله کدهای زیر که برای کدویژن تغییراتی داده شده است .
#define SEVEN_SEGMENT_SHIFT_DDR DDRB
#define SEVEN_SEGMENT_SHIFT_PORT PORTB
#define SEVEN_SEGMENT_PORT PORTD
#define SEVEN_SEGMENT_DDR DDRD
#define SEVEN_SEGMENT_DIGITS 2 // تعداد رقم
volatile unsigned char digits[SEVEN_SEGMENT_DIGITS];
void SevenSegment(unsigned char n)
{
/*
This function writes a digits given by n to the display
*/
if(n<10)
{
switch (n)
{
case 0:
SEVEN_SEGMENT_PORT=0b00000011;
break;
case 1:
SEVEN_SEGMENT_PORT=0b10011111;
break;
case 2:
SEVEN_SEGMENT_PORT=0b00100101;
break;
case 3:
SEVEN_SEGMENT_PORT=0b00001101;
break;
case 4:
SEVEN_SEGMENT_PORT=0b10011001;
break;
case 5:
SEVEN_SEGMENT_PORT=0b01001001;
break;
case 6:
SEVEN_SEGMENT_PORT=0b01000001;
break;
case 7:
SEVEN_SEGMENT_PORT=0b00011111;
break;
case 8:
SEVEN_SEGMENT_PORT=0b00000001;
break;
case 9:
SEVEN_SEGMENT_PORT=0b00001001;
break;
}
}
else
{
//This symbol on display tells that n was greater than 9
//so display can't handle it
SEVEN_SEGMENT_PORT=0b11111101;
}
}
void Print(unsigned int num)
{
/*
This function breaks apart a given integer into separete digits
and writes them to the display array i.e. digits[]
*/
unsigned char i=0;
unsigned char j;
unsigned int max_num=1;
for (j=0;j<SEVEN_SEGMENT_DIGITS;j++)
max_num=max_num*10;
if(num>(max_num-1)) return;
while(num)
{
digits[i]=num%10;
i++;
num=num/10;
}
for(j=i;j<SEVEN_SEGMENT_DIGITS;j++) digits[j]=0;
}
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
static unsigned char i=0;
//TCNT0=0xD9;
if (i<=SEVEN_SEGMENT_DIGITS) i=0;
SEVEN_SEGMENT_SHIFT_PORT=(1<<i);
i++;
SevenSegment(digits[i]);
}
در هرجای برنامه که خواستید مقدار سون سگمنتها را تغییر دهید از تابع print استفاده کنید:
print(anyVariable);
در ایجا ازتایمر0 برای ریفرش کردن سگمنتها استفاده شده است . شما برحسب نیاز خود آنرا تغییر دهید.
با تغییر در خطهای اول تا پنجم پورت هارا مطابق پروژه خود تنظیم کنید ودر تابع ()main مقادیر اولیه به را به آنها بدهید
SEVEN_SEGMENT_SHIFT_DDR=(1<<SEVEN_SEGMENT_DIGITS); // =~(1<<SEVEN_SEGMENT_DIGITS); اگر درايور سگمنتها اينورتر است
SEVEN_SEGMENT_SHIFT_PORT=0x00;
SEVEN_SEGMENT_PORT=0xFF;
SEVEN_SEGMENT_DDR=0xFF;