#include <avr/io.h> // تضمين مكتبة AVR للتحكم في دبابيس الإدخال والإخراج
// مصفوفة تحتوي على القيم الثنائية لعرض الأرقام من 0 إلى 9 على شاشة LED 7-segment
const uint8_t segment_digits[10] = {
0b00111111, // 0 (أضواء: a, b, c, d, e, f)
0b00000110, // 1 (أضواء: b, c)
0b01011011, // 2 (أضواء: a, b, d, e, g)
0b01001111, // 3 (أضواء: a, b, c, d, g)
0b01100110, // 4 (أضواء: b, c, f, g)
0b01101101, // 5 (أضواء: a, c, d, f, g)
0b01111101, // 6 (أضواء: a, c, d, e, f, g)
0b00000111, // 7 (أضواء: a, b, c)
0b01111111, // 8 (كل الأضواء مضاءة)
0b01101111 // 9 (أضواء: a, b, c, d, f, g)
};
// دالة التهيئة
void setup() {
DDRD = 0x7F; // تعيين الدبابيس من 0 إلى 6 كأطراف إخراج (OUTPUT)
}
void display_digit(uint8_t digit) {
// تعيين قيمة PORTD بناءً على الرقم المعطى لعرضه على شاشة LED 7-segment
PORTD = segment_digits[digit]; // تشغيل الأضواء المناسبة للرقم
}
// الدالة الرئيسية
int main() {
setup(); // استدعاء دالة التهيئة
uint8_t counter = 0; // متغير لتخزين الرقم الحالي المعروض
int8_t direction = 1; // متغير لتحديد اتجاه العد (1 للزيادة، -1 للتناقص)
// حلقة لا نهائية
while(1) {
display_digit(counter); // عرض الرقم الحالي على شاشة LED 7-segment
// تأخير لمدة ثانية واحدة (هذه الدالة قد تحتاج لتعريف)
_delay_ms(1000); // تأخير لمدة 1000 مللي ثانية (1 ثانية)
// تحديث العداد بناءً على الاتجاه
counter += direction; // زيادة أو تقليل العداد بناءً على الاتجاه
// تغيير الاتجاه عند الوصول إلى الحدود القصوى
if (counter == 9 || counter == 0) {
direction = -direction; // عكس الاتجاه
}
}
}