قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 20-06-2017, 12:17 AM المشاركة 1   
افتراضي وحدة عرض الحروف LCD Twitter FaceBook Google+



وحدة عرض الحروف LCD :
وحدة عرض الحروف LCD مكونة من وحدات (موديولات) جاهزة . ميزة هذه الوحدات أنها تحتوى على ناقل للبيانات data bus وناقل للتحكم control bus . للتعامل مع هذه الأجهزة يوجد بمترجم الميكروسى برو مكتبات معرفة مسبقا (جاهزة) للتحكم فى وحدات LCD . الشكل التالى يبين المظهر الطبيعى ومنظر هذه الوحدات فى برنامج إيزيس ISIS :



تقوم وحدات العرض LCD بعرض الحروف التى تغذى بها فى شكل كود أسكى ASCII code . بالإضافة إلى كود أسكى ، يمكنها أن تعرض الحروف المصصمة بمعرفة المبرمج ، ميزة أخرى لوحدة العرض LCD ، وهى أن ناقل توصيل البيانات الطبيعى عبارة عن 8 خطوط ، لكن يمكن إعدادها لكى تعمل فقط بأربعة خطوط للبيانات . هذه الميزة توفر من عدد الأطراف المستخدمة ولكن على حساب تقليل سرعة نقل البيانات . المكتبة الجاهزة بالميكروسى معدة لتعمل بأربعة بتات 4-bit .
لعرض المكتبة الجاهزة لهذا الجهاز وللأجهزة الأخرى والمتواجدة بالميكروسى ، يجب عليك النقر على لوحة الأدوات الموجودة على الجانب الأيمن لنافذة تحرير البرنامج ، يتم التعرف على هذه اللوحة بعلامة التبويب التى تحتوى على العنوان Library Manager . عندما تنقر هذا التبويب تظهر لك نافذة بها قائمة بالمكتبات المختلفة والتى من الممكن العمل بها مع الميكروكونترولر المستخدم . فى هذه النافذة سوف تجد مكتبة باسم Lcd ، حيث يمكنك النقر على إى دالة واردة بالمكتبة لرؤية تعليمات الاستخدام المناظرة . الشكل التالى يوضح مظهر هذه النافذة :




تنفيذ العرض بوحدات LCD يتطلب استخدام تسلسل من التعليمات والأوامر للإعداد والعرض ، مكتبة الميكروسى تقلل هذا العمل لأنها المسؤولة عن عمل كل هذه الإعدادات مما يجعل مهمة المبرمج أسهل .

فى الخطوة الأولى لاستخدام LCD ، تحتاج لتعريف أطراف التوصيل وتنفيذ دالة بدء (تهيئة) تشغيل LCD عن طريق الدالة الجاهزة lcd_init () . تعريف الأطراف متروك للمبرمج وحسب الميكروكونترولرالمستخدم. يمكن استخدام العبارات التالية ، على سبيل المثال :


كود:
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_bit;
 sbit LCD_D4 at RB4_bit;
 sbit LCD_D5 at RB5_bit;
 sbit LCD_D6 at RB6_bit;
 sbit LCD_D7 at RB7_bit;
	
 sbit LCD_RS_Direction at TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_bit;
 sbit LCD_D4_Direction at TRISB4_bit;
 sbit LCD_D5_Direction at TRISB5_bit;
 sbit LCD_D6_Direction at TRISB6_bit;
 sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition
لاستخدام أى أطراف أخرى كل ما عليك هو تغيير اسم الطرف فى المثال السابق . كما تلاحظ ، للتحكم فى LCD تحتاج فقط إلى ستة أطراف ، أربعة لبتات البيانات واثنان لبتات التحكم ، وحدة العرض بها طرف تحكم ثالث هو WR ، عادة لا نحتاج لهذا الطرف وببساطة يتم توصيله بالأرضى .
وفى النهاية يجب بدء تشغيل وحدة العرض LCD داخل الدالة الرئيسية بعد إعداد المنافذ . صيغة الدالة الرئيسية تكون كما يلى :

كود:
void main (void)
{
	Lcd_init (); // Start the LCD.
	while (1) // infinite loop.
	{
	}
}
ويصبح كود البرنامج كما يلى :

كود:
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_bit;
 sbit LCD_D4 at RB4_bit;
 sbit LCD_D5 at RB5_bit;
 sbit LCD_D6 at RB6_bit;
 sbit LCD_D7 at RB7_bit;
	
 sbit LCD_RS_Direction at TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_bit;
 sbit LCD_D4_Direction at TRISB4_bit;
 sbit LCD_D5_Direction at TRISB5_bit;
 sbit LCD_D6_Direction at TRISB6_bit;
 sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition


void main (void)
{
	Lcd_init (); // Start the LCD.
	while (1) // infinite loop.
	{
	}
}
بعد تنفيذ الكود السابق تكون وحدة العرض LCD جاهزة لعرض الحروف ، بدءا من الموقع الموجود بالسطر(الصف) الأول والعامود الأول والذى يدل علية مؤشر يومض .
تصنع وحدات عرض الحروف فى أشكال وألوان متعددة حيث تتوفر بشاشة خضراء أو زرقاء أو صفراء . ويتم عرض الحروف فى شكل مصفوفة حروف مثل 2 صف مع 16 عامود وتعرف باسم 2x16 وبنفس الطريقة يوجد
1x16, 2x16, 2x8, 2x20, 4x20 وغيرها . على سبيل المثال ، سوف نستخدم وحدة عرض 2X16 .
لبدء محاكاة LCD ببرنامج إيزيس يتم جلب الأجهزة LM016L و PIC16F628A . الاسم المرجعى LM016L فى إيزيس هو لوحدة عرض 2X16 . وأخيرا يكون التوصيل كما فى الدائرة التالية:




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





اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 20-06-2017, 03:10 PM المشاركة 2   
افتراضي


الخطوة التالية هى كتابة (طباعة) معلومات على الشاشة ، ولهذا الغرض يمكنك استخدام أربع دوال . دالتان منهم تسمحان لك بكتابة الأحرف characters ، والدالتان الأخريان تسمحان لك بكتابة السلاسل النصية strings .
يمكنك كتابة الحروف بطريقتين ، الأولى ، ببساطة كتابة الحروف بترتيب متسلسل معروف لوحدة العرض والطريقة الثانية كتابة الحروف فى السطر والعامود الذى يحدده المبرمج .

دوال كتابة (طباعة) الأحرف Functions to print characters
الدالة الأولى لكتابة الأحرف هى الدالة :

كود:
  Lcd_Chr_Cp (char out_char);
هذه الدالة يتم استدعاؤها عند كتابة حرف من حروف كود أسكى ASCII code ، الموجود فى بارامتر الدخل out_char . وعند إحساس وحدة العرض بالأمر بكتابة حرف جديد فإن المؤشر ينتقل تلقائيا للموقع التالى مباشرة . لفهم أداء هذه الدالة راقب وحلل المثال التالى :

كود:
 void main (void)
{
        Lcd_init ();                	// Start the LCD.
        Lcd_Chr_Cp('H');        // These functions printed letter by letter the word "Hello".
        Lcd_Chr_Cp('e');
        Lcd_Chr_Cp('l');
        Lcd_Chr_Cp('l');
        Lcd_Chr_Cp('o');
        while (1)                  	// infinite loop.
        {
        }
}
ويصبح البرنامج بالصيغة التالية :

كود:
// Lcd_Chr_Cp (char out_char);
// Prints character on Lcd at current cursor position. 
//Both variables and literals can be passed as a character.

// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_bit;
 sbit LCD_D4 at RB4_bit;
 sbit LCD_D5 at RB5_bit;
 sbit LCD_D6 at RB6_bit;
 sbit LCD_D7 at RB7_bit;
	
 sbit LCD_RS_Direction at TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_bit;
 sbit LCD_D4_Direction at TRISB4_bit;
 sbit LCD_D5_Direction at TRISB5_bit;
 sbit LCD_D6_Direction at TRISB6_bit;
 sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition

void main (void)
{
        Lcd_init ();                	// Start the LCD.
        Lcd_Chr_Cp('H');        // These functions printed letter by letter the word "Hello".
        Lcd_Chr_Cp('e');
        Lcd_Chr_Cp('l');
        Lcd_Chr_Cp('l');
        Lcd_Chr_Cp('o');
        while (1)                  	// infinite loop.
        {
        }
}
الشكل التالى يبين المحاكاة :



لكتابة حروف من خلال إحداثيات الصفوف والأعمدة نستخدم الدالة :

كود:
 Lcd_Chr (char row, char column, char out_char);
هذه الدالة تطبع الحرف out_char بالصف row والعامود column . المثال التالى يوضح لك هذا المفهوم :

كود:
void main (void)
{
	Lcd_init (); 	            	// Start the LCD.
	Lcd_Chr_Cp ('H'); 	    // These functions printed letter by letter the word "Hello".
	Lcd_Chr_Cp ('e');
	Lcd_Chr_Cp ('l');
	Lcd_Chr_Cp ('l');
	Lcd_Chr_Cp ('o');
	Lcd_Chr (1, 6, '1'); 	    	// prints the character 1, at row 1, column 6
	Lcd_Chr (2, 7, '2'); 	    	// prints the character 2, at row 2, column 7
	Lcd_Chr (3, 8, '3'); 	    	// prints the character 3, at row 3, column 8
	Lcd_Chr (4, 9, '4'); 	    	// Prints the character 4, at row 4, column 9
	while (1)                   		// infinite loop.
	{
	}
}
كود البرنامج :

كود:
// Lcd_Chr (char row, char column, char out_char);
// Prints character on Lcd at specified position. 
//Both variables and literals can be passed as a character.

// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_bit;
 sbit LCD_D4 at RB4_bit;
 sbit LCD_D5 at RB5_bit;
 sbit LCD_D6 at RB6_bit;
 sbit LCD_D7 at RB7_bit;
	
 sbit LCD_RS_Direction at TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_bit;
 sbit LCD_D4_Direction at TRISB4_bit;
 sbit LCD_D5_Direction at TRISB5_bit;
 sbit LCD_D6_Direction at TRISB6_bit;
 sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition

 void main (void)
{
	Lcd_init (); 	            	// Start the LCD.
	Lcd_Chr_Cp ('H'); 	    // These functions printed letter by letter the word "Hello".
	Lcd_Chr_Cp ('e');
	Lcd_Chr_Cp ('l');
	Lcd_Chr_Cp ('l');
	Lcd_Chr_Cp ('o');
	Lcd_Chr (1, 6, '1'); 	    	// prints the character 1, at row 1, column 6
	Lcd_Chr (2, 7, '2'); 	    	// prints the character 2, at row 2, column 7
	Lcd_Chr (3, 8, '3'); 	    	// prints the character 3, at row 3, column 8
	Lcd_Chr (4, 9, '4'); 	    	// Prints the character 4,at row 4, column 9
	while (1)                   		// infinite loop.
	{
	}
}

الشكل التالى يبين المحاكاة :



دوال كتابة (طباعة) سلاسل النصوص Functions to print text strings :
أيضا كتابة السلاسل النصية إما أن يتم كتابتها فى موقع المؤشر الحالى (CP) وفق سريان الكتابة أو تكتب فى موقع يحدد بإحداثيات الصف والعامود .
لكتابة سلسلة نصية عند الموقع الحالى لمؤشر الكتابة نستخدم الدالة التالية :

كود:
Lcd_Out_Cp (char * text);
هذه الدالة لها بارامتر دخل واحد وهو مؤشر للسلسلة النصية والتى تسمى هنا text . للتعرف على استخدام هذه الدالة راقب وحلل هذا المثال :

كود:
 
void main (void)
{
	Lcd_init (); 				// Start the LCD.
	Lcd_Out_Cp ("Hello World ...");
	while (1) 				// infinite loop.
	{
	}
}
يمكن تنفيذ هذه الدالة مع سلسلة من الثوابت أو من المتغيرات ، نعرف السلاسل بالأقواس المزدوجة فى بدايتها وفى نهايتها , على سبيل المثال "Hello World ...", ، صيغة المتغير يتم إعلانها بالشكل :

كود:
char Text [20] = "Hello World ..."
البرنامج :

كود:
// Lcd_Out_Cp (char * text);
// Prints text on Lcd at current cursor position. 
//Both string variables and literals can be passed as a text.

// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_bit;
 sbit LCD_D4 at RB4_bit;
 sbit LCD_D5 at RB5_bit;
 sbit LCD_D6 at RB6_bit;
 sbit LCD_D7 at RB7_bit;
	
 sbit LCD_RS_Direction at TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_bit;
 sbit LCD_D4_Direction at TRISB4_bit;
 sbit LCD_D5_Direction at TRISB5_bit;
 sbit LCD_D6_Direction at TRISB6_bit;
 sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition

void main (void)
{
	Lcd_init (); 				// Start the LCD.
	Lcd_Out_Cp ("Hello World ...");
	while (1) 				// infinite loop.
	{
	}
}

الشكل التالى يبين المحاكاة :




لكتابة السلسلة النصية إبتداء من نقطة إحداثيات محددة نستخدم الدالة :

كود:
Lcd_Out (char row, char column, char * text);
هذه الدالة تعمل بطريقة مماثلة للدالة السابقة بإختلاف أن بيانات البارامترات تتضمن الصف والعامود . لفهم عمل هذه الدالة راقب وحلل المثال التالى :

كود:
void main (void)
{
	Lcd_init (); 					// Start the LCD.
	Lcd_Out (1, 1, "Row 1, Column 1");
	Lcd_Out (2, 2, "Row 2, Column 2");
	while (1) 					// infinite loop.
	{
	}
}

البرنامج :

كود:
// Lcd_Out (char row, char column, char * text);
// Prints text on Lcd starting from specified position. 
//Both string variables and literals can be passed as a text.

// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_bit;
 sbit LCD_D4 at RB4_bit;
 sbit LCD_D5 at RB5_bit;
 sbit LCD_D6 at RB6_bit;
 sbit LCD_D7 at RB7_bit;
	
 sbit LCD_RS_Direction at TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_bit;
 sbit LCD_D4_Direction at TRISB4_bit;
 sbit LCD_D5_Direction at TRISB5_bit;
 sbit LCD_D6_Direction at TRISB6_bit;
 sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition

void main (void)
{
	Lcd_init (); 					// Start the LCD.
	Lcd_Out (1, 1, "Row 1, Column 1");
	Lcd_Out (2, 2, "Row 2, Column 2");
	while (1) 					// infinite loop.
	{
	}
}
الشكل التالى يبين المحاكاة :



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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 20-06-2017, 08:42 PM المشاركة 3   
افتراضي


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

كود:
IntToStr (int input, char *output) ;
هذه الدالة تقوم بتحويل العدد الصحيح نوع signed integer إلى سلسلة string . سلسلة الخرج يكون لها عرض ثابت 7 أحرف بما فى ذلك حرف الانتهاء (نهاية السلسلة) . سلسلة الخرج تكون بمحازاة اليمين والأماكن المتبقية جهة اليسار (إن وجدت) تملء بفراغات .
هذه الدالة لها بارامتران هما : input وهو قيمة العدد الصحيح المراد عرضه ، و output والذى يشير إلى متغير لسلسلة نصية والذى تريد وضع نتيجة تحويل القيمة العددية input إلى سلسلة نصية فيه .
يجب إعلان السلسلة المستهدفة لتكون بطول 7 أحرف على الأقل .
لفهم هذا التحويل راقب وحلل المثال التالى :


كود:
 void main (void)
{
	int Integer = 123;	// Declaration of an integer variable with initial value 123.
	char Text [20]; 	// String data printing , at least 7 characters in length.
	Lcd_init (); 			// Start the LCD.
	IntToStr (Integer, Text); 	// function that does the conversion.
	Lcd_Out_Cp (Text) ;	// print text on the LCD screen.
	while (1) 			// infinite loop.
	{
	}
}

البرنامج :

كود:
// IntToStr (int input, char *output) ;
// Converts input signed integer number to a string.
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_bit;
 sbit LCD_D4 at RB4_bit;
 sbit LCD_D5 at RB5_bit;
 sbit LCD_D6 at RB6_bit;
 sbit LCD_D7 at RB7_bit;
	
 sbit LCD_RS_Direction at TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_bit;
 sbit LCD_D4_Direction at TRISB4_bit;
 sbit LCD_D5_Direction at TRISB5_bit;
 sbit LCD_D6_Direction at TRISB6_bit;
 sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition

void main (void)
{
	int Integer = 123;	// Declaration of an integer variable with initial value 123.
	char Text [20]; 		// String data printing , at least 7 characters in length.
	Lcd_init (); 			// Start the LCD.
	IntToStr (Integer, Text); 	// function that does the conversion.
	Lcd_Out_Cp (Text) ;	// print text on the LCD screen.
	while (1) 			// infinite loop.
	{
	}
}
كما ذكرنا ، عند طباعة العدد الصحيح كنص باستخدام هذه الدالة دائما يفترض أن العدد مداه سبعة حروف ، بما فى ذلك حرف الانتهاء ، فأن كان العدد أقل من ذلك فإن باقى الحروف سوف تكون مسافات فارغة ، ففى مثالنا تكون النتيجة هى السلسلة “ 123” أى ثلاثة مسافات فارغة جهة اليسار .
بعد الترجمة والمحاكاة تكون النتيجة كما فى الشكل التالى :




يمكن طباعة الأعداد الحقيقية ذات العلامة العشرية باستخدام الدالة :

كود:
FloatToStr (float FNUM, char * str);
مبدأ عمل هذه الدالة مماثل للدالة السابقة .
ملحوظة :
سوف يتم بتر (اقتطاع) العدد float إلى السبع أرقام ذات الأهمية القصوى قبل التحويل .
يجب إعلان السلسلة المستهدفة لتكون بطول 14 حرف على الأقل .
مثال :

كود:
float ff1 = -374.2;
float ff2 = 123.456789;
float ff3 = 0.000001234;
char txt[15];
...
FloatToStr(ff1, txt);  // txt is "-374.2"
FloatToStr(ff2, txt);  // txt is "123.4567"
FloatToStr(ff3, txt);  // txt is "1.234e-6"
لفهم هذه الدالة راقب وحلل المثال التالى :

كود:
void main (void)
{
	int Integer = 123;  	// Declaration of an integer variable with initial value 123.
	float Decimnal = 12.76543; 	// Declaring a variable with decimal point
				// initialized to 12.76543.
	char Text  [20]; 		// String data printing.
	Lcd_init (); 		// Start the LCD.
	IntToStr (Integer, Text); 	// Function that makes the whole conversion.
	Lcd_Out (1,1, Text);		// print text on the LCD screen.
	FloatToStr (Decimnal, Text); 	// function that does the conversion decimal.
	Lcd_Out (2,1, Text); 		// print text on the LCD screen.
	while (1) 			// infinite loop.
	{
	}
}
البرنامج :

كود:
// FloatToStr (float FNUM, char * str);
// Converts a floating point number to a string.
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_bit;
 sbit LCD_D4 at RB4_bit;
 sbit LCD_D5 at RB5_bit;
 sbit LCD_D6 at RB6_bit;
 sbit LCD_D7 at RB7_bit;
	
 sbit LCD_RS_Direction at TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_bit;
 sbit LCD_D4_Direction at TRISB4_bit;
 sbit LCD_D5_Direction at TRISB5_bit;
 sbit LCD_D6_Direction at TRISB6_bit;
 sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition

void main (void)
{
	int Integer = 123;  	// Declaration of an integer variable with initial value 123.
	float Decimnal = 12.76543; 	// Declaring a variable with decimal point
				// initialized to 12.76543.
	char Text  [20]; 		// String data printing.
	Lcd_init (); 		// Start the LCD.
	IntToStr (Integer, Text); 	// Function that makes the whole conversion.
	Lcd_Out (1,1, Text);		// print text on the LCD screen.
	FloatToStr (Decimnal, Text); 	// function that does the conversion decimal.
	Lcd_Out (2,1, Text); 		// print text on the LCD screen.
	while (1) 			// infinite loop.
	{
	}
}

الشكل التالى يبين نتيجة المحاكاة :



نفس العملية يمكن تنفيذها على الأنواع الأخرى للمتغيرات مثل :

• فى حالة المتغير نوع unsigned short :

كود:
 ByteToStr(unsigned short input, char *output);
تقوم هذه الدالة بتحويل "بايت" الدخل input إلى السلسلة ouput . السلسلة output يكون لها عرض ثابت 4 حروف بما فى ذلك حرف الانتهاء . السلسلة output تكون بمحازاة اليمين والأماكن المتبقية على اليسار (إن وجدت) تملء بفراغات . إعلان السلسلة المستهدفة يجب ألا يقل طولها عن 4 أحرف .
مثال :

كود:
unsigned short t = 24;
char txt[4];
...
ByteToStr(t, txt);  // txt is " 24" (one blank here)

• فى حالة المتغير (signed) short (int) أو short نستخدم الدالة :

كود:
ShortToStr (short input, char * output);
تقوم هذه الدالة بتحويل الدخل input إلى السلسلة ouput . السلسلة output يكون لها عرض ثابت 5 حروف بما فى ذلك حرف الانتهاء . السلسلة output تكون بمحازاة اليمين والأماكن المتبقية على اليسار (إن وجدت) تملء بفراغات . إعلان السلسلة المستهدفة يجب ألا يقل طولها عن 5 أحرف .
مثال :

كود:
short t = -24;
char txt[5];
...
ShortToStr(t, txt);  // txt is " -24" (one blank here)

وفى حالة المتغير unsigned int نستخدم الدالة :

كود:
WordToStr (unsigned int input, char * output);
تقوم هذه الدالة بتحويل الدخل input إلى السلسلة ouput . السلسلة output يكون لها عرض ثابت 6 حروف بما فى ذلك حرف الانتهاء . السلسلة output تكون بمحازاة اليمين والأماكن المتبقية على اليسار (إن وجدت) تملء بفراغات . إعلان السلسلة المستهدفة يجب ألا يقل طولها عن 6 أحرف .
مثال :

كود:
unsigned t = 437;
char txt[6];
...
WordToStr(t, txt);  // txt is "  437" (two blanks here)
• فى حالة المتغير Long نستخدم الدالة :

كود:
LongToStr (long input, char * output);
تقوم هذه الدالة بتحويل الدخل input إلى السلسلة ouput . السلسلة output يكون لها عرض ثابت 12 حروف بما فى ذلك حرف الانتهاء . السلسلة output تكون بمحازاة اليمين والأماكن المتبقية على اليسار (إن وجدت) تملء بفراغات . إعلان السلسلة المستهدفة يجب ألا يقل طولها عن 12 أحرف .
مثال :

كود:
long jj = -3700000;
char txt[12];
...
LongToStr(jj, txt);
// txt is "   -3700000" (three blanks here)
طريقة تحويل العدد الصحيح unsigned int ، رقم تلو الآخر إلى سلسة ، حرف تلو الآخر :
بالرجوع إلى جدول كود أسكى نجد أن كل حرف من أحرفه يقابله قيمة عددية معينة ، فحرف الصفر ‘0’ يقابلة العدد 48 ، وحرف الواحد ‘1’ يقابلة العدد 49(1+48) والحرف اثنين ‘2’ يقابله العدد 50(2+48) وهكذا ، من ثم يمكن استنتاج أنه لتحويل أى رقم إلى حرف كود أسكى المناظر يتم إضافة القيمة العددية 48 . بعبارة أخرى ، 0+48=’0’ ، و 1+48=’1’ و 2+48=’2’ وهكذا .
مثال :
تتبع الخطوات التالية :
• إعلان متغير نوع unsigned int باسم number وإسناد قيمة ابتدائية له هى الصفر وهذا السجل سوف يحتوى على العدد المطلوب عرضه (قبل تحويله إلى كود أسكى) .
• الإعلان عن متغير بالإشارة إليه بالطريقة *text وهو عبارة عن نص مكون من أربعة خانات وإسناد قيمة أصفار كقيمة ابتدائية وهو عبارة عن مصفوفة صف بها 4 عناصر .

كود:
unsigned int number = 0; // Integer number
char *text = "0000"; // Pointer to string
• إنشاء دالة باسم Display تحتوى على تقسيم (إستخلاص) محتويات السجل numberإلى أربعة خانات (أرقام) وتحويل كل خانة إلى كود أسكى المناسب للعرض على وحدة العرض LCD حيث يتم :
# استخلاص قيمة رقم خانة الآلاف بقسمة العدد number على1000 ويضاف إلى النتيجة العدد 48 لتحويله إلى كود أسكى وحفظ النتيجة كأول عنصر من عناصر المصفوفة text[0] .
# استخلاص قيمة رقم خانة المئات بقسمة العدد number على 100 ثم إيجاد باقى خارج قسمة الناتج على 10 والنتيجة النهائية يتم تحويلها إلى كود أسكى بإضافة 48 وحفظ النتيجة كثانى عنصر من عناصر المصفوفة
text[1] .
# استخلاص قيمة رقم خانة العشرات بقسمة العدد number على 10 ثم إيجاد باقى خارج قسمة الناتج على 10 والنتيجة النهائية يتم تحويلها إلى كود أسكى بإضافة 48 وحفظ النتيجة كثالث عنصر من عناصر المصفوفة
text[2] .
# استخلاص قيمة رقم خانة الآحاد بإيجاد باقى خارج قسمة العدد number على 10 والنتيجة يتم تحويلها إلى كود أسكى بإضافة 48 وحفظ النتيجة كرابع عنصر من عناصر المصفوفة text[3] .
# وأخير يمكن عرض هذه المصفوفة على وحدة العرض LCD ، على سبيل المثال ، فى الصف الثانى بدءا من العامود السابع كما يلى :

كود:
void Display ()   // define display_init;
{                    
 text[0] = number/1000 + 48;           		// thousands digit, ASCII
 text[1] = (number/100)%10 +48;        	// hundreds digit, ASCII  
 text[2] = (number/10)%10 + 48;       	 // tens digit ASCII 
 text[3] = number%10 +48;              	// unit digit ASCII;
 Lcd_Out(2,7, text);                    		// display on LCD from Row 2, character 7
}

احصائية الشكر والاعجاب - 0 شكراً, 0 عدم اعجاب, 1 اعجاب
اعجاب abdoo_sy ( أعجبته المشاركة )

الصورة الرمزية abdoo_sy
abdoo_sy
:: مهندس ::
تاريخ التسجيل: Jul 2016
الدولة: سوريا
المشاركات: 31
نشاط [ abdoo_sy ]
قوة السمعة:0
قديم 20-06-2017, 09:06 PM المشاركة 4   
Talking يا اهل العلم


السلام عليكم
ملاحظة صغيرة بخصوص المكتبة الخاصة بـ lcd
اخواني قومو بهذه التجربة واطلعوني رأيكم:
مثلاً عندما تكتب:
كود:
lcd_out(1,1,"hello world);delay_ms(1000);lcd_out(2,1,"hi ahmad");
سوف تنقص المساحة المتوفره ب الرام بعدد الحروف الموجودة بين ال " و " اي ان مساحة الرام المتوفرة قد نقصت بعد كتابة هذا الجزء من الكود قد نقصت 19 بايت و الرقم 19 هو عدد الحروف(وتتصمن الفراغات) الموجودةبين العلامتين النصيتين وهما : hello world و hi ahmad .
لذا ابتكرت طريقة غريبة اريد ان تعطوني رأيكم فيها وهي في هذا الكود
كود:
char txt[15]
...
txt[15]="hello world";
lcd_out(1,1,txt);
delay_ms(1000);
txt[15]="hi ahmad" 
lcd_out(2,1,txt);
وعندها ستلاحظون ان الرام لم تتناقص الا بمقدار 15 بايت وهو مساحة السلسلة txt بينما كانت سابقاً 19 بايت اي اننا قلصنا 4 بايتات و ستظهر نفس النتيجة بالكودين .
اتمنى انني افدكم


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 21-06-2017, 11:31 AM المشاركة 5   
افتراضي


تدريب رقم 1 : ربط وحدة العرض Interfacing a character LCD
الوصف

وحدات العرض LCD التى تعتمد على المتحكم HD4480 منتشرة لرخص سعرها ولأنه يمكنها عرض الحروف . علاوة على أنها من السهل ربطها مع الميكروكونترولر ومعظم المترجمات تتضمن مكتبات لروتينات تخصها .
سوف نستعرض ربط هذه الوحدة مع الميكروكونترولر PIC16F628A . يحتاج الربط إلى 6 خطوط مداخل / مخارج من الميكروكونترولر ، 4 خطوط للبيانات و 2 خط للتحكم . سوف نعرض السلسلة النصية التالية وهى تومض blinking كاختبار للربط :
“Welcome to ………” .
الدائرة الكهربية :
سوف يتم نقل البيانات بين الميكروكونترولر ووحدة LCD فى نظام 4-bit . الطرف (5) R/W لوحدة LCD يوصل بالأرضى بصفة دائمة لعدم وجود قراءة من وحدة LCD . الأطراف RB4-RB7 تستخدم كخطوط للبيانات . خطوط التحكم RS و E يتم توصيلها بالأطراف RB2 و RB3 . لذلك فإننا نستخدم 6 أطراف للربط بين الميكروكونترولر ووحدة LCD .



البرنامج
خطوط البيانات والتحكم لوحدة LCD تستخدم المنفذ PORTB لذلك يجب تعريف أطرافه كمخارج (TRISB=0) . برمجة وحدة LCD التى تعتمد على المتحكم HD44780 لها خطوات معقدة بعض الشىء لأنها تتطلب توقيت دقيق وتسلسل مناسب لمختلف إشارات التحكم والأوامر . لكن لحسن الحظ فإن المترجم MikroC Pro for PIC يمتلك فى بنائه الداخلى مكتبة دوال للاتصال مع وحدة العرض LCD القياسية التى تعتمد على المتحكم HD44780 باستخدام نظام
4-bit . هذه المكتبة تجعل البرمجة سهلة للغاية . فبل استخدام الدوال الداخلية لوحدة LCD يجب تعريف أطراف التوصيل بين وحدة LCD والميكروكونترولر .
البرنامج :

كود:
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_bit;
 sbit LCD_D4 at RB4_bit;
 sbit LCD_D5 at RB5_bit;
 sbit LCD_D6 at RB6_bit;
 sbit LCD_D7 at RB7_bit;
	
 sbit LCD_RS_Direction at TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_bit;
 sbit LCD_D4_Direction at TRISB4_bit;
 sbit LCD_D5_Direction at TRISB5_bit;
 sbit LCD_D6_Direction at TRISB6_bit;
 sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition

// Define Messages
 char message1[] = "Welcome to";
 char message2[] = "Eng.F.Abdelaziz";

void main() 
{
	
            TRISB = 0; 			// PORTB All Outputs

Lcd_Init();                      		     // Initialize LCD
do 
{

   Lcd_Cmd(_LCD_CLEAR);             	// CLEAR display
   Lcd_Cmd(_LCD_CURSOR_OFF);        	// Cursor off
   Lcd_Out(1,4,message1);            		// Write message1 in 1st row
   Lcd_Out(2,1,message2);           		// Write message2 in 2nd row
   Delay_ms(1000);                       		// Wait for 1 sec
   Lcd_Cmd(_LCD_CLEAR);     		// Clear display
   Delay_ms(1000); 			// Wait for 1 sec

  } while(1);             			// Infinite Loop 
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 21-06-2017, 11:39 AM المشاركة 6   
افتراضي


تدريب رقم 2 : تحريك الرسائل .
الدائرة الكهربية :




البرنامج :
كود:
 
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_bit;
 sbit LCD_D4 at RB4_bit;
 sbit LCD_D5 at RB5_bit;
 sbit LCD_D6 at RB6_bit;
 sbit LCD_D7 at RB7_bit;
	
 sbit LCD_RS_Direction at TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_bit;
 sbit LCD_D4_Direction at TRISB4_bit;
 sbit LCD_D5_Direction at TRISB5_bit;
 sbit LCD_D6_Direction at TRISB6_bit;
 sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition

char  txt1[] = "Eng.F. Abdelaziz" ;        
char txt2[] = "EasyPIC";
char txt3[] = "Lcd4bit";
char txt4[] = "example";

char i;                              		// Loop variable

void Move_Delay() {                  // Function used for text moving
  Delay_ms(500);                     // You can change the moving speed here
}
void main(){

  

  Lcd_Init();                        // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off


  Lcd_Out(1,6,txt3);                 // Write text in first row
  Lcd_Out(2,6,txt4);                 // Write text in second row
  Delay_ms(2000);

  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Out(1,1,txt1);                 // Write text in first row
  Lcd_Out(2,5,txt2);                 // Write text in second row


  Delay_ms(2000);


  // Moving text
  for(i=0; i<4; i++) {               // Move text to the right 4 times
    Lcd_Cmd(_LCD_SHIFT_RIGHT);
    Move_Delay();
  }


  while(1) {                         // Endless loop
    for(i=0; i<8; i++) {             // Move text to the left 8 times
      Lcd_Cmd(_LCD_SHIFT_LEFT);
      Move_Delay();
    }

    for(i=0; i<8; i++) {             // Move text to the right 8 times
      Lcd_Cmd(_LCD_SHIFT_RIGHT);
      Move_Delay();
    }
  }
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 21-06-2017, 11:55 AM المشاركة 7   
افتراضي


مشروع عد وعرض ومعالجة عدد الأشياء تصاعديا وتنازليا باستخدام PIC16F628 وLCD
يتم أستلام وعد النبضات من مدخلين حيث يخصص المدخل الأول RA0 لتزايد العداد والمدخل الثانى RA1 لتناقص العداد ويتم عرض الفرق بينهما على وحدة العرض LCD كعدد من 0000 إلى 9999 .

الدائرة الكهربية :



البرنامج :

كود:
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_bit;
 sbit LCD_D4 at RB4_bit;
 sbit LCD_D5 at RB5_bit;
 sbit LCD_D6 at RB6_bit;
 sbit LCD_D7 at RB7_bit;
	
 sbit LCD_RS_Direction at TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_bit;
 sbit LCD_D4_Direction at TRISB4_bit;
 sbit LCD_D5_Direction at TRISB5_bit;
 sbit LCD_D6_Direction at TRISB6_bit;
 sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition

char Message1[]="COUNTER";       // Message for line1
unsigned int number = 0;

char *text = "0000";

void Display()   				// define display_init
{
 text[0] = number/1000 + 48;           	// thousands digit
 text[1] = (number/100)%10 +48;       	 // hundreds digit
 text[2] = (number/10)%10 + 48;        	// tens digit
 text[3] = number%10 +48;              	// unit digit
 Lcd_Out(2,7, text);                   		 // display on LCD from column 2, character 7
}

bit oldstate1;
bit oldstate2;

void main()                             // main;
{
 CMCON = 7;                  // turn off analogue comparator and make PORTA to digital I/O
 TRISA0_bit = 1;                        // make PORT RA0 as input for button
 TRISA1_bit = 1;                        // make PORT RA1 as input for button
 TRISB = 0;                             // Set PORTB direction to be output;
 PORTB = 0;                             
 Lcd_init();                            // LCD Initialization
 Lcd_cmd(_LCD_CLEAR);                   // Clear LCD
 Lcd_cmd(_LCD_CURSOR_OFF);              // Cursor mode off
 Lcd_out(1,2,Message1);                 

 do{

if (PORTA.F0==0) {               // Detect logical 0
delay_ms(100);
      oldstate1 = 1;                              // Update flag
    }
    if (oldstate1 && PORTA.F0==1 ) {   // Detect zero-to-one transition
        Delay_ms(100);   //; If button is depressed, delay 0,1s and increment "number" with 1
     number = number +1;
      oldstate1 = 0;                              // Reset flag
    }


        if (PORTA.F1==0) {               // Detect logical 0
delay_ms(100);

        oldstate2 = 1;                              // Update flag
}

if (oldstate2 && PORTA.F1==1 ) {   // Detect zero-to-one transition               Delay_ms(100);    // If button is depressed, delay 0,1s and decrement "number" with 1
          number = number -1;

oldstate2 = 0;                              // Reset flag
                          }
    if (number > 9999)                 // if it's more than 9999 go to 0
    number = 0;
    Display();                     // call display()

if(number>10) PORTB.B0=1;
else  PORTB.B0=0;

if(number>20) PORTB.B1=1;
else  PORTB.B1=0;
    } while(1);                         // infinite loop;
 }

فى هذا البرنامج يمكن إجراء أى عمليات رياضية أو منطقية على محتوى سجل المتغير number على سبيل المثال تشغيل خرج RB0 عندما يزداد العدد عن 10 (كمثال) وأيضا تشغيل مخرج آخر عندما يزداد العدد عن 20 وهكذا .

تعديل دالة العرض :

كود:
void Display()   				// define display_init
{
 char text [7] ; 
  IntToStr(number, text);
 Lcd_Out(2,7,text);                   		// display on LCD from column 2, character 7
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 21-06-2017, 12:31 PM المشاركة 8   
افتراضي


الحروف المخصصة (التفصيل) custom بشاشة LCD والمترجم ميكروسى برو :
وحدات عرض الحروف LCD عادة ما تستخدم متحكمات متوافقة مع المتحكم HD44780 ، وهى تسمح لنا بتعريف 8 حروف مخصصة بالإضافة إلى الحروف القياسية المبرمجة مسبقا . هذه الوحدات تحتوى على ثلاثة أنواع من الذاكرة وهى :
• ذاكرة مولد الحرف الثابتة CGROM – Character Generator ROM : وهى تحتفظ بنماذج 5x8 أو 5x10 نقطة للحروف المعرفة مسبقا فى وحدة LCD . هذه الذاكرة يمكن أن تولد 208 نموذح حرف 5x8 نقطة و 32 نموذج حرف 5x10 نقطة .
• ذاكرة عرض البيانات DDRAM – Display Data RAM : وهذه هى الذاكرة التى تحتفظ ببيانات الحرف الذى يتم عرضه حاليا على شاشة LCD . حجم هذه الذاكرة 80×8 bits أى 80 حرف .
• ذاكرة مولد الحرف المتغيرة CGRAM – Character Generator RAM : تعمل هذه الذاكرة بشكل يشبة الذاكرة CGROM ولكن نظرا لأنها من نوغ RAM فإنه يمكننا تعديل بياناتها فى أى وقت . ومن ثم يمكننا تخزين نماذج الحروف المخصصة بواسطتنا فى هذه الذاكرة من خلال البرنامج . يمكننا تخزين حتى 8 نماذج حروف 5x8 نقطة أو حتى 4 نماذج حرف 5x10 نقطة فى هذه الذاكرة .
إنشاء حروفك الخاصة :
وحدات عرض الحروف LCD لديها القدرة على تخزين حتى 8 حروف مصممة بواسطة المبرمج . قيم أسكى للحروف المصممة بالمستخدم تناظر القيم الرقمية من 0 إلى 7 .
على سبيل المثال , إذا رغبت فى طباعة أول حرف مصمم بواسطة المستخدم يتم ذلك عن طريق استخدام دوال طباعة الحروف كما يلى : Lcd_Chr_Cp (0); أو Lcd_Chr(1,1,0); . يتم تخزين الأحرف التى ينشؤها المستخدم فى ذاكرة RAM لشاشة وحدة العرض LCD ولهذا السبب يجب إعادة برمجتها فى كل مرة تقوم فيها ببدء LCD .
الحروف هى مجموعة من القيم الثنائية تشكل صورة نقطية ، والنتيجة هى صورة تعرض على الشاشة بدقة
5 x 7 pixels .
تحرير وبرمجة هذه البيانات هو مضيعة للوقت ، لكن المترجم ميكروسى برو يوجد ضمن أدواته محرر للحروف لتصميم الحروف بمعرفة المبرمج . فى هذا المحرر البسيط يتم تحرير حرف الصورة النقطية وتوليد كود لغة السى اللازم لتحديد الحرف على الشاشة . والخلاصة أنه يتم تحرير الحرف ثم نسخ ولصق كود المصدر الخاص به فى برنامج المشروع .
إظهار هذا المحرر يتم عن طريق قائمة الأدوات Tools ثم الخيار Custom Character LCD .



الشكل التالى يبين نافذة هذا المحرر :




فى هذا المحرر يقوم المستخدم بالنقر على المربعات (النقط) التى تشكل الحرف ، يتم اختيار قيمة أسكى التى تخصص للحرف من خلال مربع الاختيارChar: . هذه القيمة يجب أن تقع بين 0 و 7 . يتم إنهاء هذه العملية بالضغط على الزر
Generate Codeونسخ هذاالكود لاستخدامه فى البرنامج .
الشكل التالى يبين المحرر عند تحرير حرف أسكى وتخصيص الصفر له :



البرنامج التالى يوضح هذا المفهوم :

كود:
 
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_bit;
 sbit LCD_D4 at RB4_bit;
 sbit LCD_D5 at RB5_bit;
 sbit LCD_D6 at RB6_bit;
 sbit LCD_D7 at RB7_bit;
	
 sbit LCD_RS_Direction at TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_bit;
 sbit LCD_D4_Direction at TRISB4_bit;
 sbit LCD_D5_Direction at TRISB5_bit;
 sbit LCD_D6_Direction at TRISB6_bit;
 sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition

 // Function to store in LCD RAM memory
// Constants created by the character editor, it contains the character bitmap.
 const char character [] = {17,14,21,14,31,4,27,0};
 void CustomChar (char pos_row , char pos_char)
 {
 char i;
 LCD_Cmd(64); // address character 0.
 for (i=0;i<=7;i++) LCD_Chr_Cp(character[i]);// Loop to save the bitmap.
 LCD_Cmd (_LCD_RETURN_HOME);// For practical purposes, this feature can be ignored.
 LCD_Chr(pos_row,pos_char,0); // Impression ASCII code 0.
 }
 void main (void)
 {
 Lcd_init(); // Start the LCD.
 CustomChar (1,1);// Print the character 0.
 while(1) // infinite loop.
 {
 }
 }
بعد الترجمة والمحاكاة نحصل على النتيجة التالية :




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

كود:
 // Declaring Constants represent bitmaps,
// Animate a FIGs. These are the result code character editor
// MikroC PRO.
const char Fig1 [] = {17,14,21,14,31,4,27,0}; 	// Start CGRAM address 64 (Char=8 bit).
const char Fig2 [] = {17,14,21,14,31,4,10,0}; 	// start address 72(=64+8).
const char Fig3 [] = {17,14,21,14,31,21,10,0}; 	// start address 80(=72+8).
const char Fig4 [] = {24,28,30,31,30,28,24,0};	 // start address 88(=80+8).
 
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_bit;
 sbit LCD_D4 at RB4_bit;
 sbit LCD_D5 at RB5_bit;
 sbit LCD_D6 at RB6_bit;
 sbit LCD_D7 at RB7_bit;
	
 sbit LCD_RS_Direction at TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_bit;
 sbit LCD_D4_Direction at TRISB4_bit;
 sbit LCD_D5_Direction at TRISB5_bit;
 sbit LCD_D6_Direction at TRISB6_bit;
 sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition


 // Function to save Declamation characters in RAM.
 // This function is designed by the developer.
 void Lcd_RAM_Car  (char IntDir ,  const char * Map) 	// RAM Address & Char. Map
 {
 	char i;
 	LCD_Cmd (IntDir); 				// Start RAM address.
 	// Loop to save the map in the LCD RAM.
 	for (i= 0; i <8; i ++) LCD_Chr_Cp (Map [i]);
 }

 
void main (void)
 {
	 Lcd_init (); 		// Start the LCD.

 	Lcd_RAM_Car (64, Fig1);	// Creat & Store the character 1 in first RAM address >>64
 	Lcd_RAM_Car (72, Fig2);	// Creat &Store the character 2 ( 72=64+8)
 	Lcd_RAM_Car (80, Fig3);	// Creat &Store the character 3 ( 80=72+8) 
 	Lcd_RAM_Car (88, Fig4);	// Creat &Store the character 4 ( 88=80+8)

 	LCD_Chr (1, 1, 0);		// Finally : Print the character Fig1.(0 in ASCII) in pos ( 1,1)
 	LCD_Chr (1, 2, 1); 		// Print the character Fig2.(1 in ASCII) in pos ( 1,2)
 	LCD_Chr (1, 3, 2); 		// Print the character Fig3.(2 in ASCII) in pos ( 1,3)
 	LCD_Chr (1, 4, 3); 		// Print the character Fig4.(3 in ASCII)  in pos (1,4) 

 	while (1) // infinite loop.
 	{
 	}
 }
بعد الترجمة والمحاكاة نحصل على النتيجة التالية :



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

كود:
  Lcd_Cmd (char out_char)  ;
والتى تدخل ضمن أوامر الإعداد ، باستخدام البارامتر out_char .
لتغيير المؤشر بآخر غير ممتلىء فى شكل شرطة يتم استخدام الدالة :

كود:
Lcd_Cmd (_LCD_UNDERLINE_ON) ;
ولتفعيل وميض المؤشر نستخدم الدالة :

كود:
Lcd_Cmd (_LCD_BLINK_CURSOR_ON);
ولعدم إظهار المؤشر نستخدم الدالة :

كود:
 Lcd_Cmd (_LCD_CURSOR_OFF);

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025