الثلاثاء، 9 يوليو، 2013

الشاشة الرسومية 12864 GLCD

GLCD12864 ST7920 Controller

الشاشة الرسومية 12864


مع تنوع المشاريع و متطلباتها , يصبح المهتمين في علوم الألكترونيات و الهواة بحاجة لطرق جديدة لعرض البيانات و المعلومات التي يريدون عرضها , في وقت سابق عرضت كيفية التحكم بشاشة نوكيا 5110  و التي تمكنك من رسم الأشكال و الخطوط و حتى الصور و عرض البيانات بخطوط و تأثيرات ممتعة .
لذلك سأتحدث اليوم عن موضوع الشاشات الرسومية من جديد مستخدماً الشاشة GLCD 12864 التي تستخدم المتحكم ST7920 حيث يمكن رؤية النشرة الفنية لها من هنا 

يوجد العديد من المتحكمات الأخرى للشاشة , لكن سأفتصر الحديث في هذا الموضوع عن المتحكم ST7920

المكتبة الخاصة بالرسم الجرافيكي مصممة بالأساس للتعامل مع كثير من أنواع الشاشات الرسومية , سواءاً GLCD,TFT,OLED حيث تدعم متحكمات و انواع متعددة.


يمكن تحميل هذه المكتبة من هذا الرابط .

قبل ن ابدأ احب أن انوه لأمر مهم , هو أن هذه المكتبة و التطبيقات التي يمكنك ان تنفذها بواسطته لا تنتهي , فمن يريد الأستزادة أكثر في هذا المجال من البرمجة عليه بالتطبيق العملي لكثرة الأوامر و التعليمات التي توفرها المكتبات الرسومية , ما سأعرضه في هذه التدوينة سيكون نقطة في بحر في هذا المجال.

في البداية سنحتاج لتنفيذ هذه التجربة ما يلي :

1) بطاقة أردوينو 
2) شاشة رسومية ST7920 Controller
3)اسلاك توصيل 
4) مقاومة متغيرة 500 اوم
6)breadboard

يوجد هناك طريقتين للتحكم بهذه الشاشة , فيمكن توصيلها بنمط تحميل البيانات على التوازي Parallel connection  و هناك نمط التوصيل على التوالي Series Interface الذي يستعمل البروتوكول التسلسلي SPI  و الذي يتميز بالسرعة ففي نقل البيانات و تقليص عدد المداخل التي نحتاج لتوصيلها من الشاشة الى المتحكم الأصغري , سأستخدم في التوصيل نمط التوصيل على التوالي  Series Interface

طريقة التوصيل :

المخطط التالي يبين طريقة توصيل هذه الشاشة .



سأتحدث عن المكتبة و طريقة استعمالها .لنبدأ بهذا المثال 

//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/

//Name :Mohannad Rawashdeh .
//Date "13/5/2013 3:00pm
// Description: This  Code for using a GLCD 12864 ST7920 Controller
// Using arduino pin #D11,D12,D13 , using serial interface spi protocol
// Programmed for http://www.genotronex.com/
                
//****************************************************************

#include "U8glib.h"

// draw Circle 
//www.Genotronex.com
//Mohannad Rawashdeh
U8GLIB_ST7920_128X64 u8g(13, 11, 12, U8G_PIN_NONE);// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
// SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 12
void setup(void){

 // Get starting !
  u8g.setColorIndex(1); // pixel on !
  Clear();
   u8g.firstPage();  
  do{
    intro();
  }
  while(u8g.nextPage() );
  delay(1000);
}
void intro(void){
  u8g .setFont(u8g_font_04b_03);
  u8g.drawStr( 0, 10, " This Tuotorial will show you ");
  u8g.drawStr( 0, 20, " How to draw Circle on GLCD ");
  u8g.drawStr( 0, 30, " 12864 ST7920 controller ");
  u8g.drawStr( 0, 40, " Editor:Mohannad Rawashdeh");
  
}
void Clear(void){
  u8g .setFont(u8g_font_04b_03);
  u8g.setFontRefHeightExtendedText();
  u8g.setDefaultForegroundColor();
  u8g.setFontPosTop(); 
}

void u8g_draw_circle(int r) {
  u8g.drawStr( 0, 5, "Circle different Radius ");
  u8g.drawCircle(20,40,5+r);  
  u8g.drawCircle(50,40,10+r);
  u8g.drawCircle(88,40,15+r);
}
void u8g_draw_filled_circle(int r) {
  u8g.drawStr( 0, 5, " filled Circle  ");
  u8g.drawDisc(20,40,5+r);  
  u8g.drawDisc(50,40,10+r);
  u8g.drawDisc(88,40,15+r);
}
void u8g_draw_Nested_circle(int x , int y, int r,int d) {
  u8g.drawStr( 0, 5, " filled Circle  ");
  u8g.drawCircle(x,y,3+r); 
  delay(d); 
  u8g.drawCircle(x,y,6+r);
  delay(d);
  u8g.drawCircle(x,y,10+r);
  delay(d);
  u8g.drawCircle(x,y,14+r);
  delay(d);
  u8g.drawCircle(x,y,18+r);
}

void loop(void){
 
// ..........
 Clear();
   u8g.firstPage();  
  do{
    u8g_draw_circle(5);
  }
  while(u8g.nextPage() );
  delay(2000);
  // ..........
 Clear();
   u8g.firstPage();  
  do{
    u8g_draw_filled_circle(5);
  }
  while(u8g.nextPage() );
  delay(2000);
  // ..........
 Clear();
   u8g.firstPage();  
  do{
   u8g_draw_Nested_circle(50,40,3,0);
  }
  while(u8g.nextPage() );
  delay(2000);


}

في البداية يجب تعريف المكتبة و نوع المتحكم و

 الأرجل المستخدمة للتحكم , عن طريق هذا الأمر 

U8GLIB_ST7920_128X64 u8g(13, 11, 12, U8G_PIN_NONE);

ضبط الألوان , بما أننا نستخدم شاشة ذات لونين

 فقط Monochrome LCD فإن هناك أمر

 يفعل نمط تفعيل البكسل الواحد او تعطيله , و هو

 الأمر 

 u8g.setColorIndex(x); // pixel on 

حيث :
x=0 تكون الشاشة في وضعية المسح 

x=1 تكون الشاشة في وضعية الكتابة و تفعيل

 البكسل .

سأوضح ما سبق بمثال بعد رؤية هذه التعليمة  

لكتابة بكسل واحد فقط على الشاشة نكتب الأمر :

u8g.drawPixel(x_axis,y_axis);

حيث يقوم برسم بكسل واحد في الأحداثيات  المحدده له 

مثال :  



u8g.setColorIndex(1); // pixel on !

u8g.drawPixel(20,20);
النتيجة على الشاشة تكون 



  لو كان الأمر المكتوب بهذا الشكل :


u8g.setColorIndex(0); // pixel on ! 

u8g.drawPixel(20,20); 



فسيتم مسح النقطة المحددة بالأحداثيات . 

هذه المكتبة تدعم العديد من الخطوط , يمكن ضبط الخط عن طريق الأمر 

  u8g .setFont(u8g_font);


أوامر الكتابة , لكتابة نص على الشاشة يستخدم الأمر :

 u8g.drawStr(x , y, " text");

حيث تحدد الأحداثيات x,y التي نريد ان نبدأ الكتابة عندها و ثم نكتب النص الذي نريد اظهاره على الشاشة .



رسم الأشكال الهندسية .

لرسم الدوائر :
 u8g.drawCircle(x,y,raduis);

example:

 u8g.drawCircle(20,40,10);


لرسم اجزاء من الدائرة , نكتب الأمر :
 u8g.drawCircle(x,y,raduis,opt);

حيث :
  • opt: Selects some or all sections of the circle.
    • U8G_DRAW_UPPER_RIGHT
    • U8G_DRAW_UPPER_LEFT
    • U8G_DRAW_LOWER_LEFT
    • U8G_DRAW_LOWER_RIGHT
    • U8G_DRAW_ALL

حيث تستطيع اختيار اي جزء من الدائرة و رسمه .

لرسم الدوائر المعبأة Filled circle  نكتب الأمر 

 u8g.drawDisc(x,y,radius);


لرسم الاشكال المربعة و المستطيلة هذا الأمر يستخدم لذلك 

 u8g.drawBox(x,y,w,h);
u8g.drawFrame(x,y,w,h);



حيث نحدد نقطة البداية x,y والطول و العرض لهذا الصندوق .

لرسم ما تريده , عليك وضعه في جملة استدعاء void و استدعاءه في جملة الLoop كالآتي :
 u8g.firstPage();
 do{
 draw_shapes(); 

 }
  while(u8g.nextPage() );   

بالمجمل هذه اهم الأوامر التي تحتاجها لعمل الرسوم و للاستزادة أكثر عن هذه المكتبة يمكنك قراءة المرجع الرئيسي الكامل لهذه المكتبة 

و في النهاية هذه كود أخر لطريقة جعل النص يلتف بزوايا مختلفة على الشاشة 

//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/

//Name :Mohannad Rawashdeh .
//Date "13/5/2013 3:00pm
// Description: This  Code for using a GLCD 12864 ST7920 Controller
// Using arduino pin #D11,D12,D13 , using serial interface spi protocol
// Programmed for http://www.genotronex.com/
                
//****************************************************************

#include "U8glib.h"

// draw Circle 
//www.Genotronex.com
//Mohannad Rawashdeh
U8GLIB_ST7920_128X64 u8g(13, 11, 12, U8G_PIN_NONE);// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
// SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 12
void setup(void){

 // Get starting !
  Clear();
  u8g.setColorIndex(1); // pixel on !
  u8g.firstPage();  
  do{
    set_screen(1);
  }
  while(u8g.nextPage() );
  delay(1000);
  //...........
  u8g.firstPage();  
  do{
    set_screen(0);
  }
  while(u8g.nextPage() );
  delay(1000);
  u8g.setColorIndex(1);
  //..........
  while(u8g.nextPage() );
  delay(1000);
   u8g.firstPage();  
  do{
    intro();
  }
  while(u8g.nextPage() );
  delay(1000);
  //.......................
   Clear();
}
void set_screen(int i){
 u8g.setColorIndex(i); // pixel on !
 for (int x_axis=0;x_axis<128;x_axis++){
 for (int y_axis=0;y_axis<64;y_axis++){
 u8g.drawPixel(x_axis,y_axis);
 }
 }
}

void Clear(void){
  u8g .setFont(u8g_font_04b_03);
  u8g.setFontRefHeightExtendedText();
  u8g.setDefaultForegroundColor();
  u8g.setFontPosTop(); 
}


void intro(void){
  u8g.setColorIndex(1);
  u8g .setFont(u8g_font_04b_03);
  u8g.drawStr( 0, 10, " This Tuotorial will show you ");
  u8g.drawStr( 0, 20, " How to Make Rotation GLCD");
  u8g.drawStr( 0, 30, " 12864 ST7920 controller ");
  u8g.drawStr( 0, 40, " Editor:Mohannad Rawashdeh");
  
}
void lets_moveit90(void){
 u8g.setColorIndex(1);
  u8g .setFont(u8g_font_04b_03);
 u8g.drawStr180( 120, 10, "This Tuotorial will show you ");
 u8g.drawStr180( 120, 20, "How to make Rotational LCD");
 u8g.drawStr180( 120, 30, "12864 ST7920 controller ");
 u8g.drawStr180( 120, 40, "Editor:Mohannad Rawashdeh");
}

void MoveNumber(void){
  u8g.setColorIndex(1);
  u8g .setFont(u8g_font_unifont);
  u8g.drawStr( 15, 30, "GENO");
}
//..................................
void MoveNumber90(void){
  u8g.setColorIndex(1);
  u8g .setFont(u8g_font_unifont);
  u8g.drawStr270( 30, 60, "GENO");
}
//.....................................
void MoveNumber180(void){
  u8g.setColorIndex(1);
  u8g .setFont(u8g_font_unifont);
  u8g.drawStr180( 120, 30, "GENO");
}
//.........................
void MoveNumber270(void){
  u8g.setColorIndex(1);
  u8g .setFont(u8g_font_unifont);
  u8g.drawStr90( 50, 5, "GENO");
}

void loop(void){
   u8g.firstPage();  
  do{
    lets_moveit90();
  }
  while(u8g.nextPage() );
  delay(2000);
  
 //..............................
 u8g.firstPage();  
  do{
    MoveNumber();
  }
  while(u8g.nextPage() );
  delay(2000);
  u8g.firstPage();  
  do{
    MoveNumber270();
  }
  while(u8g.nextPage() );
  delay(2000);
  u8g.firstPage();  
  do{
    MoveNumber180();
  }
  while(u8g.nextPage() );
  delay(2000);
  u8g.firstPage();  
  do{
    MoveNumber90();
  }
  while(u8g.nextPage() );
  delay(2000);
}

و هذا الفيديو في النهاية يوضح كيفية العمل الكود .




4 التعليقات :

  1. ماذا عن دهم العربية من مكتبة u8glib؟
    رأيت هذا من قبل و لكن لا يتوفر لدي شئ للتجربة الآن
    http://forum.arduino.cc/index.php?PHPSESSID=dc23fl6qm7v869baml0r3sgag0&topic=139175.msg1100774#msg1100774

    ردحذف
    الردود
    1. نعم تدعم المكتبة اللغة العربية .

      سأشارككم تجربتي بها قريباً

      حذف
  2. هل يمكن استعمال هذه المكتبه مع شاشة نوكيا 5110 حيث اني لم اجد مكتبة النوكيا

    ردحذف
    الردود
    1. موجوده تحت اسم PCD8544 يمكنك عمل ازالة للتعليق في البرنامج الموجود في المكتبة و استخدام هذه المكتبة معها

      حذف

 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.