১৬. 8051 মাইক্রোকন্ট্রোলারের সাথে LCD ইন্টারফেস



যেকোন মাইক্রোকন্ট্রোলারের সাথে LCD ইন্টারফেস অত্যন্ত গুরুত্বপূর্ণ একটি বিষয়। প্রায়ই মাইক্রোকন্ট্রোলার দিয়ে এমন কিছু প্রজেক্ট করতে হয় যেখানে আমাদের মাইক্রোকন্ট্রোলারের প্রসেস করা ডেটা LCD স্ক্রিনে দেখতে হয়। অথবা রিয়েল টাইম ডিবাগিং এর ক্ষেত্রেও অনেক সময় LCD স্ক্রিনে আমাদের ডেটা দেখার প্রয়োজন হয়। আজকের পোস্টে আমরা মাইক্রোকন্ট্রোলারের সাথে লিকুইড ক্রিস্টাল LCD এর ইন্টারফেস সম্পর্কে শিখব। লিকুইড ক্রিস্টাল LCD দেখতে সাধারণত নিচের মত হয়ে থাকে।


এই লিকুইড ক্রিস্টাল LCD স্ক্রিন সাধারণত অনেক সাইজের হয়ে থাকে। যেমন উপরোক্ত LCD টি 16x2 আকারের। এটার দ্বারা বোঝানো হয় যে এই লিকুইড ক্রিস্টাল LCD তে দুইটি সারি আছে। এবং প্রত্যেক সারি ১৬ টি ক্যারাক্টার ধারন করতে পারে। তাহলে দুই সারিতে মোট ১৬*২ = ৩২ ক্যারাক্টার দেখানো সম্ভব এই  LCD স্ক্রিনে। এরকম আরেকটি সাইজের লিকুইড ক্রিস্টাল LCD হল-

এই লিকুইড ক্রিস্টাল LCD টি হল 20x4 আকারের। এই 20 এবং 4 দ্বারা বুঝানো হয় যে এতে চারটি সারি আছে এবং প্রত্যেক সারি ২০ টি ক্যারাক্টার ধারন করতে পারে। তাহলে এই মডেলের লিকুইড ক্রিস্টাল LCD স্ক্রিনটি মোট ৮০ টি ক্যারাক্টার ধারন করতে পারে। প্রত্যেক ক্যারাক্টার যে ছোট ঘরে দেখানো হয় সেই ঘর বা বক্সগুলো 5x7 আকারের ডট ম্যাট্রিক্সের হয়ে থাকে। অর্থাৎ ঐ প্রত্যেক ছোট ঘর X-axis বরাবর ৫টি ডট এবং Y-axis ৭ টি ডট মোট ৩৫ টি ডট ধারন করে। এই ডটগুলোর অন অফ কম্বিনেশনের মাধ্যমেই প্রত্যেক ছোট বক্সে একটি করে ক্যারাক্টার শো করা হয়।
এরকম বিভিন্ন সাইজের লিকুইড ক্রিস্টাল LCD হয়ে থাকে। যে সাইজের লিকুইড ক্রিস্টাল LCD হোক না কেন, তা ইন্টারফেস করতে আমাদের মোটামোটি ভাবে ১৬ টি তারের কানেকশন ঠিকঠাক ভাবে দিতে হয়। তারমানে লিকুইড ক্রিস্টাল LCD মডিউলে ১৬ টি কানেকশন অর্থাৎ ১৬ টি পিন থাকে। নিচে প্রত্যেক পিনের পরিচয়সহ এদের কানেকশন ডিটেইলস দেয়া হল।




GND বা VSS পিনঃ এই পিনে গ্রাউন্ড কানেকশন দেয়া হয়। মাইক্রোকন্ট্রোলার এবং LCD এর অবশ্যই কমন গ্রাউন্ড থাকতে হবে।

VCC বা VDD পিনঃ এই পিনে সাধারণত ৫ ভোল্ট পাওয়ার সাপ্লাইয়ের পজিটিভ কানেকশন দেয়া হয়।

VEE পিনঃ এই পিনটি হল LCD এর কনট্রাস্ট কন্ট্রোল পিন। LCD স্ক্রিনে যে ক্যারাক্টারগুলো দেখা যায় সেগুলো কতটা উজ্জ্বল দেখাবে বা কতটা অনুজ্জ্বল দেখাবে তা এই পিনের মাধ্যমে কন্ট্রোল করা হয়। এজন্যে এই পিনের সাথে একটি ভ্যারিয়েবেল রেজিস্ট্যান্স লাগানো হয়। এই রেজিস্ট্যান্সের মান পরিবর্তন করার মাধ্যমে এই কনট্রাস্ট কন্ট্রোল করা হয়।

R/S পিনঃ এই পিনটিকে বলা হয় রেজিস্টার সিলেক্ট পিন। LCD তে মাইক্রোকন্ট্রোলার থেকে যে ডেটা পাঠানো হয় তাকে মূলত দুই ভাগে ভাগ করা যায়। একটি হল, LCD স্ক্রিনে আমরা যে ক্যারাক্টার দেখাতে চাই সেই ক্যারাক্টারের জন্যে ডেটা এবং অপরটি হল LCD স্ক্রিনের কোন ঘরে ক্যারাক্টার দেখাতে চাই, কিভাবে দেখাতে চাই এসব কিছু কন্ট্রোল করার জন্যে কম্যান্ড ডেটা। মাইক্রোকন্ট্রোলার থেকে তো আমরা শুধু ডেটাই পাঠাবো। মাইক্রোকন্ট্রোলার তো আর বুঝবে না যে কোনটা কোন ডেটা। এটা বোঝার দায়িত্ব হল LCD র। এই বিষয় বোঝার জন্যে LCD তে ভিন্ন ভিন্ন দুটি রেজস্টার আছে। একটি ডেটা রেজিস্টার এবং অপরটি কম্যান্ড রেজিস্টার। R/S পিনের মাধ্যমে এই দুটি রেজিস্টারের যেকোন একটি সিলেক্ট করা হয় এবং মাইক্রোকন্ট্রোলার থেকে পাঠানো ডেটা উক্ত রেজিস্টারে জমা হয়। সাধারণত R/S পিনে হাই (1) সিগন্যাল পাঠালে LCD এর ডেটা রেজিস্টার সিলেক্ট হয় এবং R/S পিনে লো (0) সিগন্যাল পাঠালে LCD এর কম্যান্ড রেজিস্টার সিলেক্ট হয়।

R/W পিনঃ এই পিনের মাধ্যমে LCD তে ডেটা রাইট করা হবে নাকি LCD থেকে ডেটা রিড করা হবে সেটা নির্ধারণ করে দেয়া হয়। LCD তে ডেটা রাইট করতে হলে এই পিনে লো (0) সিগন্যাল পাঠাতে হবে এবং LCD থেকে ডেটা রিড করতে হলে এই পিনে হাই (1) সিগন্যাল পাঠাতে হবে।

EN পিনঃ এই পিনের মাধ্যমে LCD মডিউলকে এনাবেল করতে হয়। এই পিনে ৪৫০ ন্যানোসেকেন্ডের একটি হাই-টু-লো পালস্‌ দিলে মডিউলটি যেকোন অপারেশন (ক্যারাক্টার শো করা বা স্ক্রিনের এক পজিশন থেকে অন্য পজিশনে যাওয়া) করার জন্যে প্রস্তুত হয়।

DB0 - DB7 পিনঃ এই আটটি পিনের মাধ্যমে ডেটা মাইক্রোকন্ট্রোলার থেকে LCD তে ট্রান্সফার হয়। মাইক্রোকন্ট্রোলারের কোন একটি পোর্টের আটটি পিনের সাথে এই আটটি পিনের কানেকশন দিলে ডেটা প্যারালাল ভাবে মাইক্রোকন্ট্রোলার থেকে LCD তে ট্রান্সফার হয়। তবে মাইক্রোকন্ট্রোলারের আটটি পিন ব্যবহার করা হলে অনেক সময় অন্য ডিভাইসের কানেকশন দেয়া সমস্যা হয়ে যায়। এজন্যে LCD এর এই আটটি পিনের মধ্যে চারটি পিন ব্যবহার করে ডেটা আদান-প্রদান করা যায়। অর্থাৎ ৮-বিট মোডেও ব্যবহার করা যায় আবার ৪-বিট মোডেও ব্যবহার করা যায়।

LED+ পিনঃ LCD এর ব্যাকগ্রাউন্ডে হলুদ বা নিল রঙের আলো দেয় যে LED, সেটার অ্যানোড পিন হল এই পিনটি। এই পিনটিতে সাধারণত ৫ ভোল্ট পাওয়ার সাপ্লাইয়ের পজিটিভ তার কানেকশন দিতে হয়।

LED- পিনঃ LCD এর ব্যাকগ্রাউন্ডের হলুদ বা নিল রঙের আলো দেয় যে LED, সেটার ক্যাথোড পিন হল এই পিনটি। এই পিনটিতে সাধারণত গ্রাউন্ড কানেকশন দিতে হয়।

LCD যেহেতু একটি আউটপুট ডিভাইস সেহেতু আমরা মাইক্রোকন্ট্রোলারের ইনপুট/আউটপুট পিনগুলো ব্যবহার করে এটার ইন্টারফেস করতে পারি। LCD এর DB0 থেকে DB7 এই আটটি পিন মাইক্রোকন্ট্রোলারের কোন একটি পোর্টের আটটি পিনের সাথে এবং R/S ও EN পিন দুটি মাইক্রোকন্ট্রোলারের অন্যে যেকোন দুটি আউটপুট পিনের সাথে কানেক্ট করতে হবে। LCD থেকে ডেটা রিড না করে শুধু রাইট করতে চাইলে R/W পিনকে গ্রাউন্ডের সাথে কানেক্ট করে ডিলেই হবে। আর অবশিষ্ট পাঁচটি পিন যথা- GND, VCC, VEE, LED+, LED- পাওয়ার সাপ্লাই পিনের পজিটিভ তার এবং গাউন্ডের সাথে কানেক্ট করে দিলেই হবে। আমরা মূলত ৮ বিট মোডে মাইক্রোকন্ট্রোলারের সাথে LCD এর ইন্টারফেস দেখব।

এখন তাহলে একনজরে মাইক্রোকন্ট্রোলার থেকে LCD তে ডেটা পাঠানোর এবং কম্যান্ড পাঠানোর প্রসেস জেনে নেয়া যাক।

LCD তে ডেটা পাঠানোর প্রসেসঃ 

  • R/W পিন লো করতে হবে ডেটা রাইট করার জন্যে (গ্রাউন্ডের সাথে আগে থেকেই কানেক্ট করা)।
  • R/S পিনে হাই সিগন্যাল পাঠাতে হবে (ডেটা রেজিস্টার সিলেক্ট করার জন্যে)।
  • মাইক্রোকন্ট্রোলারের ইনপুট/আউটপুট পিনের মাধ্যমে LCD এর ডেটা রেজিস্টারে ডেটা বাইট পাঠাতে হবে।
  • EN পিনে ১ মাইক্রোসেকেন্ডের জন্যে হাই-টু-লো সিগন্যাল পাঠাতে হবে।
  • প্রত্যেকবারই ক্যারাক্টার ডেটা পাঠানোর জন্যে উপরের প্রসেস রিপিট করতে। 

LCD তে কম্যান্ড পাঠানোর প্রসেসঃ

  • R/W পিন লো করতে হবে ডেটা রাইট করার জন্যে (গ্রাউন্ডের সাথে আগে থেকেই কানেক্ট করা)।
  • R/S পিনে লো সিগন্যাল পাঠাতে হবে (কম্যান্ড রেজিস্টার সিলেক্ট করার জন্যে)।
  • মাইক্রোকন্ট্রোলারের ইনপুট/আউটপুট পিনের মাধ্যমে LCD এর কম্যান্ড রেজিস্টারে ডেটা বাইট পাঠাতে হবে।
  • EN পিনে ১ মাইক্রোসেকেন্ডের জন্যে হাই-টু-লো সিগন্যাল পাঠাতে হবে।
  • প্রত্যেকবারই কম্যান্ড ডেটা পাঠানোর জন্যে উপরের প্রসেস রিপিট করতে।
এবারে তাহলে LCD এর কিছু কম্যান্ড বাইট এবং এদের ফাংশনগুলো দেখে নেয়া যাক। 

কম্যান্ড   বাইট                                          ফাংশন                                

0x0F                                    LCD মডিউল অন করা এবং কার্সর ব্লিঙ্ক করা
0x01                                    LCD এর স্ক্রিন ক্লিয়ার করা
0x02                                    কার্সর একদম শুরুতে নিয়ে যাওয়া
0x04                                    কার্সর একধাপ বামে সরানো
0x05                                    LCD এর ক্যারাক্টার একধাপ ডানে সরানো
0x06                                    কার্সর একধাপ ডানে সরানো
0x07                                    LCD এর ক্যারাক্টার একধাপ বামে সরানো
0x0E                                   LCD এর ডিসপ্লে অন রাখা এবং কার্সর অন রাখা
0x38                                   LCD এর দুই সারিই এবং প্রত্যেক ছোট বক্সের ৫x৭ ডট একটিভেট করা
0x80                                   কার্সরকে প্রথম লাইনের শুরুর পজিশনে নিয়ে যাওয়া
0x81                                   কার্সরকে প্রথম লাইনের ২ নম্বর বক্সে নিয়ে যাওয়া
0x82                                   কার্সরকে প্রথম লাইনের ৩নম্বর বক্সে নিয়ে যাওয়া
0x83                                   কার্সরকের প্রথম লাইনের ৪ নম্বর বক্সে নিয়ে যাওয়া
0x3C                                  দ্বিতীয় সারি একটিভেট করা
0xC0                                  কার্সরকে দ্বিতীয় লাইনের শুরুর পজিশনে নিয়ে যাওয়া
0xC1                                  কার্সরকে দ্বিতীয় লাইনের ২ নম্বর বক্সে নিয়ে যাওয়া
0xC2                                  কার্সরকে দ্বিতীয় লাইনের ৩ নম্বর বক্সে নিয়ে যাওয়া
0xC3                                  কার্সরকে দ্বিতীয় লাইনের ৪ নম্বর বক্সে নিয়ে যাওয়া
0x0F                                   ডিসপ্লে অন, কার্সর অন এবং কার্সর ব্লিঙ্কিং
0x0C                                   ডিসপ্লে অন এবং কার্সর অফ

এবারে আর কথা না বাড়িয়ে উপরের তথ্যকে কাজে লাগিয়ে কোডের দিকে লক্ষ্য করা যাক। উপরের সব তথ্য ঠিকঠাক মত বুঝে থাকলে আমরা কোড সহজেই বুঝতে পারব বলে আশা করি।



 #include<reg52.h>                    //header file for at89s52 microcontroller  
 #include<intrins.h>                  //header file for _nop_() function  
  
 #define LCD_register P2              //make port 2 data byte  
 sbit EN = P0^0;                      //enable pin of LCD,this pin act as output pin of 8051  
 sbit RS = P0^1;                      //register select pin of LCD,this pin act as output pin of 8051  
 void delay_uS(unsigned int t)        //pass value to get desired microsecond delay  
 {  
      while((t--) > 0)  
      {  
           _nop_();                   //doing nothing one machine cycle  
      }  
 }  
 void send_cmd(unsigned char cmd)  
 {  
      LCD_register = cmd;             //put command code in LCD_register pin which act as data pin       
      RS = 0;                         //keep RS low for selecting data register  
      EN = 1;                         //keep high EN pin of lcd for minimum 490 nano second  
      delay_uS(10);                   //we keep this action for 10 micrpseconds  
      EN = 0;                         //clear this EN pin  
 }  
 void send_data(unsigned char dt)  
 {  
      LCD_register = dt;              //put data code in LCD_register pin which act as data pin                                                         
      RS = 1;                         //keep RS high for selecting data register  
      EN = 1;                         //keep high EN pin of lcd for minimum 490 nano second  
      delay_uS(10);                   //we keep this action for 10 microseconds  
      EN = 0;                         //clear this EN pin  
 }  
 void init_LCD()  
 {  
       send_cmd(0x38);                //use 8bit,two lines & 5x7 matrix  
       delay_uS(1000);                //delay 1 milliseconds after sending data byte  
       send_cmd(0x0F);                //Display on, Cursor on, blinking  
       delay_uS(1000);                //delay 1 milliseconds after sending data byte  
       send_cmd(0x01);                //clearing the screen  
       delay_uS(1000);                //delay 1 milliseconds after sending data byte  
       send_cmd(0x80);                //cursor return at home  
       delay_uS(1000);                //delay 1 milliseconds after sending data byte  
 }  
 void send_string(const char *s)      //this function takes string as argument  
 {  
      while(*s)                                
           send_data(*s++);           //just keep increasing to the next character's position   
 }  
 void main()  
 {       
      init_LCD();                     //initialize the LCD funtion very begining  
      send_string("Debasish Dev");    //put whatever you want to show in 1st line of LCD  
      delay_uS(1000);                 //wait here 1 millisecond to settle down everything  
      send_cmd(0xC0);                 //push the cursor two the second line  
      delay_uS(1000);                 //delay 1 millisecond to settle down everything  
      send_string("RUET,EEE-12");     //put whatever you want to show in 2nd line of LCD  
      while(1)  
      {  
            //never ending loop  
      }  
 }  

উপরের কোডের, সব লাইনের পাশেই লিখে দেয়া আছে কোন কাজ কেন করা হয়েছে। এবারে তাহলে সার্কিটটি দেখে নেয়া যাক।


 LCD ইন্টারফেস শিখলে আমরা পরবর্তীতে অনেক প্রজেক্ট করতে পারবো। রিডিং দেখাতে হবে এমন যেকোন প্রজেক্টের জন্যেই আসলে মাইক্রোকন্ট্রোলারের সাথে LCD ইন্টারফেস খুবই দরকার। এরপরের কোন এক পোস্টে আমরা ৪-বিট মোডেও LCD এর ইন্টারফেস শিখে নিব। কোড এবং সার্কিট নিচে দিয়ে দেয়া হল। 


মন্তব্যসমূহ

এই ব্লগটি থেকে জনপ্রিয় পোস্টগুলি