দৈনন্দিন জীবনের ব্যস্ততা বেড়ে গেছে বহুগুনে, টেকটিউনসে লেখার জন্য সময় বের করা এখন আরও বেশি দুস্কর। আমার গত টিউন আর এই টিউনের মাঝে সময় ব্যবধান মনে হয় একটু বেশি হয়ে গেল। তাই বলে লেখা নিশ্চয়ই থেমে থাকবে না। হয়ত একটু দেরি হবে......।
যাই হোক আজকে আমরা কিভাবে Alphanumeric LCD চালনা করতে হয় তা দেখব। বাজারে বিভিন্ন ধরনের Alphanumeric এলসিডি পাওয়া যায়, এর মধ্যে সবচেয়ে বেশি ব্যবহৃত হয় 16x2 এলসিডি ডিসপ্লে। এখানে 16x2 বলতে বোঝানো হয়েছে, এই এলসিডিতে মোট দুইটি লাইন আছে এবং প্রতিটি লাইনে ১৬টি করে character প্রদর্শন করা যায়। তার মানে বুঝতেই পারছেন, এই LCD দিয়ে শুধুমাত্র বিভিন্ন ধরনের character প্রদর্শন করানো যাবে। কোন ধরনের ছবি আঁকাআঁকি এখানে সম্ভব না। character সংখ্যা বিভিন্ন ধরনের যেমন, 8, 16, 20, 24, 32, 40এবং লাইন সংখ্যা, 1, 2, 4রকমের হতে পারে। কি কি character প্রদর্শন করা যাবে তা আমি পরবর্তীতে বলব। এলসিডিগুলোর চেহারা নিচে থেকে দর্শন করে নেয়া যাক।
আমি আজকে যে এলসিডি নিয়ে আলোচনা করব সেটিতে Hitachi HD44780 এর compatible chip ব্যবহার করা হয়েছে। Hitachi HD44780 এর সাথে এই এলসিডির তেমন কোন পার্থক্য নাই।
আমাদের এলসিডি এর পিন সংখ্যা 16। যার মধ্যে 8টি ডাটা লাইন, তিনটি কন্ট্রোল লাইন, তিনটি পাওয়ার লাইন, এবং দুইটি পিন LED কে পাওয়ার দেয়ার জন্য। চলুন কোনটা কোন পিন দেখে নেয়া যাক।
কোন পিন কোন কাজ করতেছে তার একটা ছক নিচে দেয়া হল।
পিন নাম্বার | পিনের নাম | পিনের কাজ |
1 | VSS | গ্রাউন্ড পিন |
2 | VDD | পজেটিভ ভোল্টেজ সাপ্লাই |
3 | VEE | এলসিডি এর কনট্রাস্ট এডজাস্ট পিন |
4 | RS | রেজিস্টার সিলেক্ট পিন |
5 | R/W | Read/ Write সিলেক্ট পিন |
6 | E | Enable পিন |
7 | D0 | Data Bit 0 |
8 | D1 | Data Bit 1 |
9 | D2 | Data Bit 2 |
10 | D3 | Data Bit 3 |
11 | D4 | Data Bit 4 |
12 | D5 | Data Bit 5 |
13 | D6 | Data Bit 6 |
14 | D7 | Data Bit 7 |
15 | LED+ | LED এর পজেটিভ সাপ্লাই |
16 | LED- | LED এর নেগেটিভ সাপ্লাই |
1 নাম্বার পিনটি এলসিডি এর গ্রাউন্ড পিন। জিরো ভোল্ট বা প্রাউন্ডের সাথে এই পিনের সংযোগ দিতে হবে।
2 নাম্বার পিন এলসিডি এর পজেটিভ সাপ্লাই পিন। এলসিডি সাধারণত 5 Volt এ চলে। তবে 6 Volt বা 4.5 Volt এ এলসিডি চলতে পারে। কোন কোনটার ক্ষেত্রে তো 3 4.5 Volt ই যথেষ্ট। এলসিডি এর কারেন্ট কঞ্জাম্পসন খুবই কম, মাত্র কয়েক মিলি আম্পিয়ার।
3 নাম্বার পিন হচ্ছে এলসিডি এর কনট্রাস্ট পিন। এই পিনের মাধ্যমে এলসিডি এর কনট্রাস্ট পরিবর্তন করা যায়। কনট্রাস্ট পরিবর্তন করতে এই পিনে বিভিন্ন ভোল্টেজ প্রয়োগ করতে হয়। সাধারণত সাপ্লাই ভোল্টেজ কে একটি ভেরিয়েবল রেজিস্টর দিয়ে ভোল্টেজ ডিভাইড করে এই পিনের সাথে যুক্ত করা হয়। এতে ভেরিয়েবল রেজিস্টর ঘুরিয়ে ইচ্ছা মত কনট্রাস্ট পরিবর্তন করা যায়।
4 নাম্বার পিনটিকে বলা হয় রেজিস্টার সিলেক্ট পিন। Alphanumeric LCD তে যে তিনটি কন্ট্রোল পিন রয়েছে এই পিনটি তার প্রথম পিন। এই পিনটিকে যদি low অর্থাৎ 0 ভোল্ট প্রয়োগ করা হয় তবে, এলসিডি command মোডে থাকবে। মানে এলসিডি এর সেটিং পরিবর্তিত হবে। আর এই পিনটিকে যদি high অর্থাৎ 5 Volt প্রয়োগ করা হয় তবে এলসিডি বিভিন্ন character প্রদর্শন মোডে থাকবে।
এলসিডি এর 5 নাম্বার পিনটি হচ্ছে R/W বা Read/Write পিন। এই পিনটি এলসিডি এর দ্বিতীয় কন্ট্রোল পিন। এলসিডিতে কোন command বা Character লিখতে এই পিনটিকে low অর্থাৎ 0 ভোল্ট প্রয়োগ করতে হয়। আর এলসিডি থেকে কোন কিছু read করতে এই পিনকে high অর্থাৎ 5 Volt প্রয়োগ করতে হয়।
6 নাম্বার পিনটি হচ্ছে Enable পিন। এই পিনটি এলসিডি এর দ্বিতীয় কন্ট্রোল পিন। এলসিডির ডাটা লাইনে ডাটা Send করলেই এলসিডি তা গ্রহন করবে না যতক্ষণ পর্যন্ত না এই পিনটিকে High থেকে Low করা হচ্ছে। একইভাবে এলসিডি থেকে কোন ডাটা Read করা যাবে না যতক্ষণ না এই পিনটি Low থেকে High হচ্ছে।
7 নাম্বার পিন থেকে 14 নাম্বার পিন পর্যন্ত এই 8 টি(D0-D7) পিন হচ্ছে এলসিডি এর ডাটা লাইন। এই পিনগুলোর মাধ্যমে 8 বিট ডাটা এলসিডি তে পাঠানো বা এলসিডি থেকে গ্রহন করা যায়। এই এলসিডিকে 4(Two nibble) Bit মোডেও চালানো যায়। সেক্ষেত্রে D4 থেকে D7 এই চারটি পিন ব্যবহার করতে হবে।
এবার এলসিডি নিয়ে মজার কিছু এক্সপেরিমেন্ট করা যাক। যাদের কাছে এলসিডি আছে তারা সরাসরি এক্সপেরিমেন্ট করতে পারেন অথবা Proteus এ সিমুলেশন করতে পারেন। Proteus সম্পর্কে আমি আমার চতুর্থ টিউটোরিয়ালে বিস্তারিত বলেছি।
তাহলে চলুন নিচের সার্কিটের মত কানেকশন দিয়ে ফেলি।
Vss এবং VDD পিন দুইটি সরাসরি যুক্ত করুন যথাক্রমে গ্রাউন্ডের এবং 5 ভোল্টের সাথে । VEE পিনটি একটি ভেরিয়েবল রেজিস্টরের সাথে চিত্রের মত করে কানেকশন দিন। RW পিনটি গ্রাউন্ড করা হয়েছে কারন আমরা এলসিডি থেকে কোন ডাটা রিড করব না বরং শুধুমাত্র রাইট করব। তাই RW পিনকে সবসময় low করে রাখা জরুরী। এছাড়া RW, E, D0 থেকে D7 এই দশটি পিনকে 4.7k ohm এর রেজিস্টর দিয়ে 5V এর সাথে যুক্ত করে pull high করা আছে এবং প্রতিটি পিনকে একটি সুইচের মাধ্যমে গ্রাউন্ড করা আছে। সুইচ On করলে পিনটি low অর্থাৎ logical 0 এবং সুইচ Off করলে পিনটি high অর্থাৎ logical 1 হবে। উপরের ছবিতে খেয়াল করে দেখুন Enable(6 number pin) এর সাথে যে সুইচটি ব্যবহার করা হয়েছে সেটি অন্যগুলো থেকে ভিন্ন। বাকি সুইচগুলো latched type অর্থাৎ প্রেস করলে অন হবে এবং আবার প্রেস করলে অফ হবে। আর Enable সুইচটি momentary action type অর্থাৎ প্রেস করলে অন হবে এবং ছেড়ে দিলে আবার একা একাই অফ হয়ে যাবে অনেকটা কলিং বেলের সুইচের মত। Enable পিনে এই ধরনের সুইচ ব্যবহারের কারন হচ্ছে, এলসিডি ডাটা ট্রান্সফার করে শুধুমাত্র এই পিনের high থেকে low অথবা low থেকে high ট্রাঞ্জিসনের সময়।
D0 থেকে D7 এই আটটি সুইচকে এমনভাবে বসাবেন যেন Most significant Bit (MSB) অর্থাৎ D7 বামে এবং least significant bit অর্থাৎ D0 ডানে থাকে।
এবার এলসিডিটি অন করা যাক।
Proteus এ Play Button চেপে simulation start করলেই এলসিডি অন হয়ে যাবে। যদি বাস্তবে এলসিডি নিয়ে কাজ করেন তবে কনট্রাস্ট এর ব্যপারে খেয়াল রাখতে হবে। বাস্তবে এলসিডি অন হওয়ার সাথে সাথে প্রথম লাইনে কতগুলো কালো বক্স প্রদর্শন করে। কোনকিছু প্রদর্শনের আগে প্রথমে এলসিডিকে কনফিগার করে নিতে হয়। কনফিগার করতে এলসিডিতে কিছু initialization command পাঠাতে হবে। এই কাজের জন্য এলসিডিকে command মোডে নেয়া প্রয়োজন। আমি আগেই বলেছি RS পিনের মাধ্যমে এলসিডির মোড পরিবর্তন করতে হয়। RS পিনটিতে 0 পাঠালে এলসিডি command মোডে এবং 1 পাঠালে এলসিডি Character মোডে পরিবর্তিত হয়। তাহলে এলসিডিতে command পাঠাতে RS সুইচকে অন করে RS পিনে logical 0 পাঠান। এবার আমরা D0 থেকে D7 পিনে ‘00001111’ ডাটা পাঠাবো। এর জন্য আপনাকে LSB এবং MSB এর পজিশন মেনে সুইচগুলো অন অথবা অফ করতে হবে। ‘00001111’ ডাটা পাঠানোর জন্য কোন কোন সুইচ অন অথবা অফ রাখতে হবে তার একটা টেবিল নিচে দিয়ে দিলাম।
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
ON | ON | ON | ON | OFF | OFF | OFF | OFF |
প্রয়োজনীয় সুইচ অন/অফ করা হয়ে গেলে এবার enable সুইচটি প্রেস করে ছেড়ে দিন।
এলসিডিতে কি কিছু দেখা যাচ্ছে!!! যদি কোন ভুল না করেন তবে এলসিডি এর বামে উপরের লাইনে কার্সার লাফাতে থাকবে। এলসিডি initialize করা হয়েছে।
এবার কিছু character লেখা যাক। character লিখতে RS সুইচটিকে অফ করে RS পিনে logical 1 পাঠিয়ে এলসিডিকে character মোডে নেয়া যাক। অবশ্যই মনে রাখবেন, command মোডে এলসিডি কোন কিছু প্রদর্শন করবে না। সেটিং দিতে RS পিনকে 0 এবং Character লিখতে RS পিনকে অবশ্যই 1 করতে হবে। আমি এরপরে RS পিনকে কি করতে হবে তা বলবনা, আপনাকে নিজে নিজে বুঝে নিতে হবে। যাই হোক এখন ডাটা লাইনে ‘01000001’ পাঠিয়ে enable সুইচটি প্রেস করে ছেড়ে দিন। BINGO!!!! এলসিডিতে ‘A’ বর্নটা লেখা হয়ে গেছে তাইনা। এবার তো মিষ্টি খাবার পালা।
আপনারা এলসিডিতে ডাটা কিভাবে পাঠাতে হয় তা নিশ্চয়ই বুঝতে পারছেন।
Initialize করার জন্য প্রয়োজনীয় ডাটার একটা ছক নিচে দেয়া হল। আমি পরবর্তীতে এই টেবিলকে প্রয়োজন অনুসারে ভেঙ্গে ভেঙ্গে আলোচনা করব।
LCD Command Control Codes | ||||||||||||||||||||||||||||||||||||||||||||||
Command | Binary | Hex | ||||||||||||||||||||||||||||||||||||||||||||
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |||||||||||||||||||||||||||||||||||||||
Clear Display | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 01 | |||||||||||||||||||||||||||||||||||||
Display and Cursor Home | 0 | 0 | 0 | 0 | 0 | 0 | 1 | x | 02 or 03 | |||||||||||||||||||||||||||||||||||||
Character Entry Mode | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S | 01 to 07 | |||||||||||||||||||||||||||||||||||||
Display On/Off and Cursor | 0 | 0 | 0 | 0 | 1 | D | U | B | 08 to 0F | |||||||||||||||||||||||||||||||||||||
Display/Cursor Shift | 0 | 0 | 0 | 1 | D/C | R/L | x | x | 10 to 1F | |||||||||||||||||||||||||||||||||||||
Function Set | 0 | 0 | 1 | 8/4 | 2/1 | 10/8 | x | x | 20 to 3F | |||||||||||||||||||||||||||||||||||||
Set CGRAM Address | 0 | 1 | A | A | A | A | A | A | 40 to 7F | |||||||||||||||||||||||||||||||||||||
Set Display Address | 1 | A | A | A | A | A | A | A | 80 to FF | |||||||||||||||||||||||||||||||||||||
|
|
আমি একটু আগে initialize করার জন্য উপরের টেবিলের Display On/Off and Cursor command ব্যবহার করেছি। Display On/Off and Cursor লাইনে D, U, B বলতে কি কি বোঝানো হয়েছে তা টেবিলের নিচের অংশে দেয়া আছে। যেমন, B: 1 = Cursor Blink On; 0 = Cursor Blink Off* এর মানে হচ্ছে B এর জায়গায় 1 দিলে Cursor Blink করবে আর 0 দিলে Cursor Blink করবে না, এরপর U এর জায়গায় 1 বসালে Cursor এর নিচে Underline হবে আর 0 দিলে হবে না এরকম। এখানে * চিহ্ন দ্বারা বোঝানো হয়েছে এগুলো initialization setting. এছাড়া X হচ্ছে Don’t Care অর্থাৎ এখানে 0 বা 1 যাই দেন না কেন ব্যপার একই, কোন সমস্যা নাই।
খুব কাছ থেকে যদি এলসিডির Pixel গুলো খেয়াল করেন তাহলে দেখতে পাবেন তাতে, 5x8 টি ডট আছে আবার কোন কোন ডিসপ্লেতে 5x10 টা ডট থাকে।
এখন আপনার ডিসপ্লে কত ডটের বা আপনি কত বিটে(8 বিট অথবা 4 বিট) চালাবেন এবং আপনার ডিসপ্লে 2 লাইনের হলে দ্বিতীয় লাইন চালু বা বন্ধ করতে উপরের টেবিলের Function Set অংশটি ব্যবহার করতে হবে।
Command | Binary | |||||||
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
Function Set | 0 | 0 | 1 | 8/4 | 2/1 | 10/8 | x | x |
যেমন 5x8 টি ডট ওয়ালা 2 লাইনের এলসিডি 8 বিটে চালাতে যে command দিতে হবে তা হল 0111011, টেবিলের মাধ্যমে দেখি,
Command | Binary | |||||||
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
Function Set | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 |
এখানে, যেহেতু এলসিডি 8 বিটে চালাবো তাই 8/4 = 1, দুই লাইনের এলসিডি বলে 2/1 = 1, এবং যেহেতু আমার Display এর ডট সংখ্যা 5x8 তাই 10/8 = 0 ব্যবহার করেছি। উপরের LCD command Control Codes টেবিলটি দেখলেই বুঝতে পারবেন।
আপনারা হয়তো খেয়াল করেছেন যে ডিসপ্লে initialize করার সাথে সাথে Cursor এলসিডির একদম প্রথম লাইনের প্রথম ঘরে অবস্থান করে। Character লিখলে তা প্রথম ঘর থেকে শুরু হয়। এখন যদি আপনাকে সরাসরি এলসিডির প্রথম লাইনের 9th ঘরে কোন character প্রদর্শন করতে হয় তাহলে কিভাবে করবেন।
এখানেই আপনাকে Display Addressing ব্যবহার করতে হবে। এলসিডির একদম প্রথম লাইনের প্রথম ঘরের Address হচ্ছে, 00(Hexadecimal) এর পরেরটা 01 এভাবে 16 নাম্বার ঘরের Address হচ্ছে, 0F আর দ্বিতীয় লাইনের প্রথম ঘরের Address হচ্ছে, 40(Hexadecimal) এভাবে 16 নাম্বার ঘরের Address হচ্ছে 4F.
Row-1 | Display position | 1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th | 9th | 10th | 11th | 12th | 13th | 14th | 15th | 16th |
Address(Hex) | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | |
Row-2 | Display position | 1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th | 9th | 10th | 11th | 12th | 13th | 14th | 15th | 16th |
Address(Hex) | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 4A | 4B | 4C | 4D | 4E | 4F |
আমরা যদি উপরের LCD command Control Codes টেবিলের Set Display Address command লক্ষ করি তাহলে এলসিডির প্রথম লাইনের 10th ঘরে Cursor নিতে চাইলে আমাদেরকে '10001001' command পাঠাতে হবে। কিভাবে এই '10001001' সংখ্যাটি পেলাম তা বলছি এর আগে Set Display Address টেবিল দেখে নিন,
Command | Binary | |||||||
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
Set Display Address | 1 | A | A | A | A | A | A | A |
এখানে A বলতে Address বোঝানো হয়েছে। A এর জায়গায় শুধু এলসিডির বিভিন্ন ঘরের Address অনুসারে 0 অথবা 1 বসাতে হবে।
এখানে প্রথম(D7) ঘরে আপনাকে সবসময়ই 1 দিতে হবে এরপর আপনার কাঙ্খিত ঘরের address, এইক্ষেত্রে 10th ঘরের Address যেহেতু Hexadecimal নাম্বার সিস্টেমে 09, তাহলে 09 এর Binary হচ্ছে 1001 তাহলে D7 এর ঘরে 1 রেখে ডান থেকে D3, D2, D1, D0 ঘরে 1001 বসিয়ে খালি ঘরগুলো 0 দিয়ে পুরন করে দিলে হচ্ছে, 10001001. টেবিলের মাধ্যমে দেখা যাক,
Command | Binary | Hex | |||||||
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 89 | |
Set Display Address | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
এখন এলসিডি কে সঠিকভাবে initialize করার পর command মোডে '10001001' পাঠিয়ে দেখি কি দেখায়,
এবার এই Addressing আপনাদেরকে আরও সহজ করে বলি যেন মনে রাখতে সহজ হয়। এলসিডির একদম প্রথম লাইনের প্রথম ঘরের Address হচ্ছে 00(Hex) । এখন command লিখতে D7 ঘরে 1 রেখে command পাঠাতে চাইলে পুরো বাইনারি সংখ্যাটি দাড়াচ্ছে, 10000000. এই পুরো বাইনারি সংখ্যাটিকে যদি Hexadecimal এ কনভার্ট করি তাহলে দাড়াচ্ছে 80(Hex) । তারমানে সরাসরি 80(Hex) এর বাইনারি পাঠালে এলসিডির একদম প্রথম লাইনের প্রথম ঘরে লেখা যাবে। 81(Hex) এর বাইনারি পাঠালে পরের ঘরে এভাবে 16th ঘরে লিখতে 8F(Hex) এর বাইনারি পাঠিয়ে দিন। এত কিছু মনে রাখতে হবে না, শুধু মনে রাখুন এলসিডির প্রথম লাইনের প্রথম ঘরের Address হচ্ছে, Hexadecimal নাম্বার সিস্টেমে 80, এভাবে বাড়তে বাড়তে 16 তম ঘরের Address হবে, Hexadecimal নাম্বার সিস্টেমে 8F.
চলুন একটু মিলিয়ে দেখি 16তম ঘরের জন্য 8F পাঠালে হবে কি না। 16th ঘরের Address হচ্ছে 0F । এবার D7 ঘরে 1 রেখে পুরো বাইনারি সংখ্যাটি দাড়াচ্ছে 10001111, যাকে Hexadecimal রুপান্তর করলে হয় 8F.
Command | Binary | Hex | |||||||
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 8F | |
Set Display Address | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
এভাবে দ্বিতীয় লাইনের প্রথম ঘরে লিখতে C0(Hex) এবং এভাবে এক এক করে 16 তম ঘরে লিখতে CF(Hex) command পাঠালেই হবে।
এছাড়াও Character Generator RAM(CG RAM) এর মাধ্যমে Custom character তৈরী করা যায়। অন্য কোনদিন এই বিষয়ে আলোচনা করব।
এবার character প্রদর্শন করার জন্য প্রয়োজনীয় ASCII ডাটা নিচের টেবিলে দেয়া আছে।
উপরের সার্কিট ডায়াগ্রামের Proteus File নিচে থেকে ডাউনলোড করে নিন। তাহলে আর কষ্ট করে আঁকতে হবে না।
পরবর্তী টিউনে মাইক্রোকন্ট্রলার দিয়ে কিভাবে এলসিডি ড্রাইভ করবেন তা নিয়ে আলোচনা হবে, সেই পর্যন্ত সবার জন্য শুভকামনা রইল।
আমি Faisal। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 15 বছর 2 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 7 টি টিউন ও 110 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 0 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।
Thank You BOSS … এই টিউন টা অনেক কাজে লাগবে