السلام عليكم زرحمة الله وبركاتة
اخوتي الكرام اليوم سأقوم بشرح كود مشروع الماتركس سائلاُ الله ان يوفقني بالشرح لتصل المعلومة لكل سائل
أولا دعوني اتكلم عن هارد وير المشروع
كما هو ظاهر في ملف المحاكاة ان المشروع يتكون من بيك مايكروكونترولر pic18f452 وسبب اختيار هذا المتحكم يرجع الى كبر حجم ذاكرته التي نحتاجها في هذا المشروع.
والمشروع يتضمن ابضاُ مسجل ازاحة 74hc595 لقيادة اعمدة الماتركس وسبب اختيار هذا النوع من المسجل لسهولة التعامل معه برمجيا
واخيرا وليس آخراُ من مكونات المشروع قطع الماتركس 8*8 والتي وضعنا منها 24 قطعه لتكون الشكل الكلي للماتركس الكبيرة
ويجب ان أضيف ان طريقة توصيل الماتركس هي على الشكل التالي:16 صف موجب(انود) 96 عامود سالب(كاثود) وطبعا الداتا توضع على الصفوف
نأتي الآن لشرح كود المشروع والذي تم كتابته بلغة السي والمترجم ميكرو سي برو
الكود:
كود:
#define ENABLE_DATA_PIN PORTd.F0
#define ENABLE_DATA_CLOCK_PIN PORTd.F1
#define ENABLE_SHOW_CLOCK_PIN PORTd.F2
extern const unsigned char ammar[1248];
extern const unsigned char ammar1[1248];
const unsigned char long_message[]= "MADE BY AMMAR MOHAMMED SAEED E-mail:ammar_saeed*hotmail.com ";
char buffer[96];
char buffer1[96];
void enable_data_clock_pulse()
{
ENABLE_DATA_CLOCK_PIN=0;
ENABLE_DATA_CLOCK_PIN=1;
}
void enable_show_clock_pulse()
{
ENABLE_SHOW_CLOCK_PIN=0;
ENABLE_SHOW_CLOCK_PIN=1;
}
void load()
{
char x;
for(x=0;x<96;x++)
{
ENABLE_DATA_PIN=1;
enable_data_clock_pulse();
}
enable_show_clock_pulse();
ENABLE_DATA_PIN=0;
enable_data_clock_pulse();
enable_show_clock_pulse();
}
void next_column()
{
ENABLE_DATA_PIN=1;
enable_data_clock_pulse();
enable_show_clock_pulse();
}
void show_buffer(char scroll_speed)
{
char show_loop,scroll_times;
for(scroll_times=0;scroll_times<scroll_speed;scroll_times++)
{
load();
show_loop=0;
while(show_loop<96)
{
portb=buffer[show_loop];
portc=buffer1[show_loop];
delay_us(500);
next_column();
portb=0;
portc=0;
show_loop++;
}
}
}
void clear_the_buffer()
{
char loop;
while(loop<96)
{
buffer[loop]=0;
buffer1[loop]=0;
loop++;
}
}
void text_const_print(const unsigned char *text,char speed)
{char number_of_characters,update,looop;
int address,character;
char x;
number_of_characters=0;
while(text[number_of_characters])
{
number_of_characters++;
}
clear_the_buffer();
for(update=0;update<number_of_characters;update++)
{
address=text[update]-32;
address=address*13;
for(character=address;character<address+13;character++)
{
for(looop=95;looop>0;looop--)
{
buffer[looop]= buffer[looop-1];
buffer1[looop]= buffer1[looop-1];
}
buffer[0]=ammar[character];
buffer1[0]=ammar1[character];
show_buffer(speed);
}
}
buffer[0]=0;
buffer1[0]=0;
for(looop=0;looop<96;looop++)
{
for(character=95;character>0;character--)
{
buffer[character]=buffer[character-1];
buffer1[character]=buffer1[character-1];
}
show_buffer(speed);
}
}
void main()
{
trisd=0;
trisb=0;
trisc=0;
portb=0;
portc=0;
while(1)
{
text_const_print(long_message,1);
}
}
الشرح:
ولفهم اي برنامج يجب بدء قراءة الكود من الدالة الرئيسية كما علمنا استاذنا القدير المهندس أحمد سمير فايد والذي أكن له كل الحب والتقدير عل ما اعطانا من علم نافع
نلاجظ ان في الدالة الرئيسية يتم استدعاء دالة واحدة ضمن حلقة غير منتهيه وهي الدالة text_const_print ويمرر اليها وسيطين هما long_message و1 الوسيط الأول هو عبارة عن مصفوفة مخزن بداخلها الرسالة التي نريد عرضها على الماتركس والوسيط الثاني هو سرعة حركة النص وتم اختيار رقم واحد وهي السرعة القصوى لحركة النص .
سنرى الآن ماذا تقوم به هذه الدالة:
اول شيئ صرحنا عن بعض المتغيرات وبعدها يدخل بحلقة لحساب عدد الحروف في المصفوفة التي تم كتابة النص الذي سنقوم بعرضه على الماتركس ثم يتم استدعاء دالة اسمها clear_the_buffer و وظيفتها مسح عناصر المصفوفات التي اسمها buffer التي يتم تخزين اشكال الحروف والارقام والتي سنشرح طريقة التخزين لاحقا
يتبع.......