منتدى الإلكترونيات قسم الالكترونكس لمناقشة الافكار والمعلومات المتعلقة بالهندسة الالكترونية للمبتدئين والهواة والفنيين - Electronics

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 27-08-2015, 01:51 AM المشاركة 9   
افتراضي خطوة إلى لأمام : توسعة ساشة الليد ماتريكس



خطوة إلى لأمام : توسعة ساشة الليد ماتريكس
توسعة شاشة الليد ماتريكس تعنى ، من حيث الهاردوير ، زيادة عدد وحدات الليد ماتريكس وبالتالى عدد الدوائر المتكاملة 74164 نظرا لزيادة عدد الأعمدة بثمانى أعمدة لكل وحدة إضافية ، أما ن حيث البرمجة فإن مصفوفة المخزن المؤقت سوف تزداد بثمانى عناصر لكل وحدة .
لتعميم التوسعة نفترض أن الشاشة مطلوب أن تحتوى على عدد من الأعمدة (عدد الوحدات مضروب فى 8 ) قيمته NC ، فإن مصفوفة المخزن المؤقت buffer ( ومن ثم إطار الصورة) يجب أن تحتوى أيضا على NC عنصر وترتيب هذه العناصر index يبدأ من الصفر وينتهى بالعنصر (NC-1) ، وفيما يلى مثال لشاشة مكونة من 2 وحدة ليد ماتريكس ، من ثم يصبح البرنامج بالشكل التالى :

كود:
//======================
#define CLK  PORTA.B0
#define DS  PORTA.B1
//=====================
#define NC    16 //// Numbers of display columns
//======================
unsigned char FONT[32]=
{
0xFF, 0xFF, 0x09, 0x09, 0x0F, 0x06, 0x00, 0x00,//P
0x00, 0x00, 0x81, 0xFF, 0xFF, 0x81, 0x00, 0x00,//I
0x1C, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x00,//C
};
//==================================
unsigned char buffer[NC];
//========================
void clear_buffer()
{
unsigned char i;
for(i=0;i<NC;i++) buffer[i]=0; //clear NC bytes index from 0 to NC-1
}
//=================================
void shift_buffer()//moves the data one place to the left to give the "movement" effect
{
unsigned char i;
for(i=0;i<NC;i++) // index from 0 to NC-1
{
buffer[i]=buffer[i+1];
}
}
//==========================
void frame_scan()
{
unsigned char i ,n, speed=25;
//=======================
 for(n=0;n<= speed;n++) //Repeat 25 times to obtain steady display , speed of display
 {
 DS=1; //put 1 on data pin
       for(i=0;i<NC;i++)//from byte 0 to byte NC-1  , index from 0 to NC-1
       {
 	CLK=1; CLK=0; DS=0;// clock pulse and clear data
        PORTB=~ buffer[i]; // inverse and send buffer data byte to PORTB
 	delay_ms(1);
       }
        PORTB=0xFF; //ones to OFF all led common cathodes 8 rows
  }
}
//=====================
void buffer_update()
{
unsigned char index;
//update display frame for each FONT[index] byte ,so we have 8 frames

for(index=0;index<32;index++)
 {
shift_buffer();
buffer[NC-1]= FONT[index];//put first character in last buffer location , index NC-1
frame_scan();
}

}//end of display frame buffer update
//=========================

void main()
{
CMCON=7;
TRISA=0;
TRISB=0;

    while(1)
    {
	clear_buffer();
	buffer_update();

   }//while end
}//main end
//=======================================


نتيجة المحاكاة :


اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 27-08-2015, 01:54 AM المشاركة 10   
افتراضي


فيما يلى مثال لشاشة مكونة من 8 وحدات ليد ماتريكس :

كود:
//======================
#define CLK  PORTA.B0
#define DS  PORTA.B1
//=====================
#define NC    64 //// Numbers of display columns
//======================
unsigned char FONT[80]=
{
0xFF, 0xFF, 0x09, 0x09, 0x0F, 0x06, 0x00, 0x00,//P
0x00, 0x00, 0x81, 0xFF, 0xFF, 0x81, 0x00, 0x00,//I
0x1C, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x00,//C
0xFF, 0x02, 0x04, 0x08, 0x04, 0x02, 0xFF, 0x00,//M
0x00, 0x00, 0x81, 0xFF, 0xFF, 0x81, 0x00, 0x00,//I
0x1C, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x00,//C
0xFF, 0x19, 0x29, 0x49, 0x89, 0x86, 0x00, 0x00,//R
0x1C, 0x22, 0x41, 0x41, 0x41, 0x22, 0x1C, 0x00, //O

};
//==================================
unsigned char buffer[NC];
//========================
void clear_buffer()
{
unsigned char i;
for(i=0;i<NC;i++) buffer[i]=0; //clear NC bytes index from 0 to NC-1
}
//=================================
void shift_buffer()//moves the data one place to the left to give the "movement" effect
{
unsigned char i;
for(i=0;i<NC;i++) // index from 0 to NC-1
{
buffer[i]=buffer[i+1];
}
}
//==========================
void frame_scan()
{
unsigned char i ,n, speed=2;
//=======================
 for(n=0;n<= speed;n++) //Repeat 25 times to obtain steady display , speed of display
 {
 DS=1; //put 1 on data pin
       for(i=0;i<NC;i++)//from byte 0 to byte NC-1  , index from 0 to NC-1
       {
 	CLK=1; CLK=0; DS=0;// clock pulse and clear data
        PORTB=~ buffer[i]; // inverse and send buffer data byte to PORTB
 	delay_ms(1);
       }
        PORTB=0xFF; //ones to OFF all led common cathodes 8 rows
  }
}
//=====================
void buffer_update()
{
unsigned char index;
//update display frame for each FONT[index] byte ,so we have 8 frames

for(index=0;index<80;index++)
 {
shift_buffer();
buffer[NC-1]= FONT[index];//put first character in last buffer location , index NC-1
frame_scan();
}

}//end of display frame buffer update
//=========================

void main()
{
CMCON=7;
TRISA=0;
TRISB=0;

    while(1)
    {
	clear_buffer();
	buffer_update();

   }//while end
}//main end


لعلك لاحظت بعض العيوب ، منها على سبيل المثال التحكم فى السرعة غير منتظم ، نتيجة لاستخدام تقنية مسح الأعمدة ، فمع زيادة عدد الأعمدة يزداد معدل زمن المسح وتقل سرعة العرض ، كذلك التباعد بين الحروف . وسوف يتم علاج السرعة باستخدام المقاطعة للحصول على معدل مسح ثابت ، أو استخدام مسح الصفوف أو كلاهما معا ، أما مشكلة علاج تباعد الحروف فسوف يتم علاجها باستخدام مصفوفة خريط نقط الحروف نوع 5X7 أو 6x8 أو غيرها .

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 27-08-2015, 02:02 AM المشاركة 11   
افتراضي


والآن لنتقدم خطوة أخرى إلى الأمام : استخدام جدول حروف كود أسكى كمخزن ثابت لجميع الحروف القابلة للكتابة ، بغرض كتابة وعرض أى رسالة .
فى هذه الحالة ، ينحصر التغيير فى الرسالة ومصفوفة الحروف الثابتة:

الرسالة تكون على شكل سلسة نصية ، وهى مصفوفة حروف وتكون ، على سبيل المثال بالشكل التالى :

كود:
unsigned char message[]="PIC MICROCONTROLLER " ; 
// define string array , as you wish , depends on memory
بمجرد أن يقابل المترجم أقواس الاقتباس المزدوجة يعرف أن ما بينها هو سلسلة من الحروف فيتعرف عليها (فى شكل قيمة عددية لكود أسكى) وعلى عددها وعلى بدايتها وعلى نهايتها ويقوم بوضع حرف النهاية لها وحو الحرف (\0) .
نتيجة لذلك يمكن تحديد عدد الحروف باستخدام العبارة التالية :

كود:
number_of_characters = strlen(message);
كل حرف يتكون من 5 بايت ، يمكن الوصول إلى بيانات الحروف الموجود بالرسالة ومعالجتها كما تم معالجة المصفوفة الثابتة السابقة التعيين عن طريق عملية حسابية بسيطة :



أول حرف فى جدول أسكى هو مسافة فارغة وقيمته العددية هى “32” ، وبالتالى يمكن الوصول إلى ترتيب الحرف داخل جدول آسكى بطرح قيمة أسكى لهذا الحرف من القيمة “32” . على سبيل المثال حرف “A” قيمة أسكى له هى القيمة “65” فيكون ترتيبه index فى جدول أسكى هو(‘A’-32) أى “65-32=33” . من عند هذا الترتيب يبدأ الخمسة بايتات الخاصة بهذا الحرف وبالتالى يمكن تعيين بداية رتب الخمسة أحرف الخاصة بكل حرف بالشكل التالى :

كود:
index=message[character]-32; 	//  character index
index=index*5; 			// first byte index
نتيجة لهذا التعديل يصبح لبرنامج بالشكل التالى :

كود:
//==============================
#include "FONT.H"//const unsigned char FONT[] , ASCII TABLE , reserve 96 character x 5 bytes = 480 bytes , use 5 byte pattern to save program memory
//======================
#define CLK  PORTA.B0
#define DS  PORTA.B1
//=====================
#define NC    32 //// Numbers of display columns
//======================
//==================================
unsigned char message[]="PIC MICROCONTROLLER " ; // define string array , as you wish , depends on memory
//==========================
unsigned char buffer[NC];
//==============
unsigned char index,number_of_characters,character,speed=5;
//=====================
void clear_buffer()
{
unsigned char i;
for(i=0;i<NC;i++) buffer[i]=0; //clear NC bytes index from 0 to NC-1
}
//================
void shift_buffer()//moves the data one place to the left to give the "movement" effect
{
unsigned char i;
for(i=0;i<NC;i++) // index from 0 to NC-1
{
buffer[i]=buffer[i+1];
}
}
//============
void frame_scan()
{
unsigned char i,n;
//=======================
 for(n=0;n<= speed;n++) //Repeat 25 times to obtain steady display , speed of display
 {
 DS=1; //put 1 on data pin
       for(i=0;i<NC;i++)//from byte 0 to byte NC-1  , index from 0 to NC-1
       {
 	CLK=1; CLK=0; DS=0;// clock pulse and clear data
        PORTB=~ buffer[i]; // inverse and send buffer data byte to PORTB
 	delay_ms(1);
       }
        PORTB=0xFF; //ones to OFF all led common cathodes 8 rows
  }
}
//===========
void buffer_update()
{
unsigned char new_index;
//character display frame for each FONT[index] byte ,so we have 8 frames
for(new_index=index;new_index<index+5;new_index++)
 {
shift_buffer();
buffer[NC-1]= FONT[new_index];//put first character in last buffer location , index NC-1
frame_scan();
}
}//end of display frame buffer character
//=======================
void main()
{
CMCON=7;
TRISA=0;
TRISB=0;
//========
number_of_characters = strlen(message);
while(1)
 {
clear_buffer();
	for(character=0;character<number_of_characters;character++)
	{
	index=message[character]-32; 
	index=index*5; // first byte index 
	buffer_update();
	}
 }

}
//==============================




الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 27-08-2015, 02:06 AM المشاركة 12   
افتراضي


وأخيرا وبعد أن عرفنا أجزاء ودوال البرنامج ، الآن نغلف جميع دوال البرنامج فى دالة واحدة تحتوى على بارامتر واحد هو سرعة العرض speed :

كود:
//==============================
#include "FONT.H"//const unsigned char FONT[] , ASCII TABLE , reserve 96 charecter x 5 bytes = 480 bytes , use 5 byte pattern to save program memory
//======================
#define CLK  PORTA.B0
#define DS  PORTA.B1
//=====================
#define NC    32 //// Numbers of display columns
//==================================
unsigned char message[]="PIC MICROCONTROLLER " ; // define string array , as you wish , depends on memory
//==========================
unsigned char buffer[NC];
//==============
void clear_buffer();
void shift_buffer();
void print_message(unsigned char speed);
//========================
void main()
{
CMCON=7;
TRISA=0;
TRISB=0;
//========

while(1)
 {
 	print_message(5);
 }

}
//======================
//===========================
void clear_buffer()
{
unsigned char i;
for(i=0;i<NC;i++) buffer[i]=0; //clear NC bytes index from 0 to NC-1
}
//================
void shift_buffer()//moves the data one place to the left to give the "movement" effect
{
unsigned char i;
for(i=0;i<NC;i++) // index from 0 to NC-1
{
buffer[i]=buffer[i+1];
}
}
//=======================
void print_message(unsigned char speed)
{
unsigned char index,new_index,number_of_characters,character,n,i;
	//=====clear buffer==================
	clear_buffer();
	//=======================
	number_of_characters = strlen(message);
	//=============================
	for(character=0;character<number_of_characters;character++)
	{
		index=message[character]-32;
		index=index*5; // first byte index
		//=========update frame after each byte for each character =====
		for(new_index=index;new_index<index+5;new_index++)
		{
		shift_buffer();
		buffer[NC-1]= FONT[new_index];//put first character in last buffer location , index NC-1
		//=======================
			for(n=0;n<=speed;n++) //Repeat speed times to obtain steady display , speed of display
			{
			DS=1; //put 1 on data pin
				for(i=0;i<NC;i++)//from byte 0 to byte NC-1  , index from 0 to NC-1
				{
				CLK=1; CLK=0; DS=0;// clock pulse and clear data
				PORTB=~ buffer[i]; // inverse and send buffer data byte to PORTB
				delay_ms(1);
				}
			PORTB=0xFF; //ones to OFF all led common cathodes 8 rows
			}
		}
	}	
	
}
 //================================



التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 27-08-2015 الساعة 03:37 PM

الصورة الرمزية سعيد قادر
سعيد قادر
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2009
الدولة: العراق/ كوردستان
المشاركات: 2,892
نشاط [ سعيد قادر ]
قوة السمعة:
قديم 27-08-2015, 10:12 AM المشاركة 13   
افتراضي


ربنا يكرمك استاذنا


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 27-08-2015, 12:28 PM المشاركة 14   
افتراضي


والآن خطوة قصيرة إلى الأمام : استخدام الدائرة المتكاملة ULN2803 لتوفير التيار اللازم لتشغيل الشاشة :
فيما يلى مثال لشاشة ليد ماتريكس مكونة من 6 وحدات 8X8 ، كل ما عليك هو :
• تغيير عدد الأعمدة ليكون NC=48 .
• إزالة عامل الانعكاس ( ~ ) فى العبارة :

كود:
PORTB=~ buffer[i]; // inverse and send buffer data byte to PORTB
لتكون :

كود:
PORTB= buffer[i]; send buffer data byte to PORTB
وذلك لأن الدائرة المتكاملة ULN2803 سوف تقوم بهذه المهمة .





الصورة الرمزية سعيد قادر
سعيد قادر
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2009
الدولة: العراق/ كوردستان
المشاركات: 2,892
نشاط [ سعيد قادر ]
قوة السمعة:
قديم 27-08-2015, 08:44 PM المشاركة 15   
افتراضي


بارك الله فيك استاذى العزيز ممكن ترفع لنا ملف البروتس والمايكروسى مع جزيل الشكر


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 28-08-2015, 02:21 AM المشاركة 16   
افتراضي


بارك الله فيك استاذى العزيز ممكن ترفع لنا ملف البروتس والمايكروسى مع جزيل الشكر
أخى الكريم شكرا جزيلا لك

تفضل آخر الملفات :





الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 04:23 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)