 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: 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);
|