به نام خدا!

سلام!

امروز میخوایم یه خورده با ال سی دی ور بریم!

الان یه کتاب خونه هست برای این LCD که من از روی اون آموزش میدم!

البته ما نمیخوایم کتاب خونه بنویسیم. فقط میخوایم بدونم LCD چطوری کار میکنه!

 در اول خوبه که دیتاشیت این ال سی رو رو دانلود کنید! از لینک زیر دانلود کنید!

http://www.datasheetdir.com/SSD1289+download

خوب در صفحه 24 این دیتاشیت چیزای مهمی نوشته شده!

بهتره از اول شروع کنیم!

ببینید این ال سی دی که من و شما داریم راجع بهش حرف میزنیم یه LCD هست که 240 تا پیکسل در طول (x) داره و 320 تا پیکسل در عرض (y) اگه بخوایم دقیق تر محاسبه کنیم در این LCD ما 240*320 پیکسل داریم که میشه 76800 پیکسل! الان LCD های گوشی های امروزی 2 ملیون پیکسل دارن! خیلی خیلی زیاده!

شما توی میکرو به LCD دستور میدید که پیکسل فلان رو مثلا مشکی کن!

- خوب ما چطوری به ال سی دی میگیم که پیکسل فلان رو زنگی کن؟؟؟!

+ کاری نداره که! ما توی LCD 16 تا پایه دیتا داریم و چند تا دیگه پایه کمکی! که به وسیله اونا میگیم همچین کاری رو یکنه!

- خوب چطوری بهش میگیم؟؟!

+ امیدوارم که با مفهوم رجیستر آشنا باشی! (رجیستر های خودمونو میگم)

ما اول به وسیله پایه های کمکی به LCD میگیم آماده باش که کارت داریم! ....

LCD هم میگه من نوکرتم (!)

بعش ما بهش میگیم خودتو برای دریافت دستور العمل آماده کن! 

میگه کدوم دستور العمل....

 میگیم نوشتن درون فلان رجیسترت!

میگه آماده ام!

میگه ام پس بیا اینم آدرس رجیسترت!

میگه بله دریافت کردم! حالا چی میخوای تو این رجیستر بنویسی؟؟

میگم بیا فلان مقدار رو درون رجیستری که گفتم بنویس!

میگه چشم نوشته شد!


الان یکی از پیکسلا رنگی شد؟؟؟

آره درسته

حالا شاید یگی که خوب مثلا ما بخوایم حرف A رو بنویسیم چه کار میکنیم؟؟!

آفرین، سوال خوبی پرسیدی!

برای اینکار اول باید با جدول اسکی آشنا باشی! (اگه نمیدونی چیه کلیک کن

جدول اسکی یه جدولی هست که برای اینکه همه کامپیوتر ها بتونن حرف هم دیگه رو بفهمن این جدول رو یه جدول قراردادی و استاندارد روی اونا گذاشتن

حالا ما میخوایم حرف A رو روی LCD نمایش بدیم!

همونجور که قبلا گفتم ما 240 پیکسل در محور X داریم که برای اینکه بتونیم یه استانداری رو برقرار کنیم (برای نوشتن حرف) میایم و برای هر حرف 8 پیکسل در محور X در نظر میگیریم و 16 تا پیکسل در محور Y در نظر میگیریم!

اگه نفهمیدی به عکس زیر نگاه کن! همه چیز رو متوجه میشی! 
این عکس LCD خودمه که با گوشیم ازش عکس گرفتم!

اگه برای هر حرف تعداد پیکسل هاش رو بشمارید میبینید 8 در 16 هست! همون که گفتم!


خوب فهمیدید که قضیه از چه قراره!





حالا بهتره کمی به نحوه کار کردن LCD بپردازیم
میخوایم ببینیم توی برنامه نویسی چطوری این کارا انجام میشه!

پین CS
یه پین روی LCD هست که اسمش CS هست!
وظیفه این پین اینه که LCD رو فعال و غیر فعال کنه!
و LCD رو در حالت انتخاب یا غیر انتخاب قرار بده!

اگه این پین 0 باشه = ال سی در فعال و در حالت انتخابه!
اگه این پین 1 باشه = ال سی دی غیر فعال و در حالت غیر انتخابه!

پین RS
این بیت خیلی وظیفه ی حیاتی داره!
شاید RS به معنی Register Select باشه!
وظیفه ی این پین اینه که چه چیز میخواهید در LCD بنویسید؟؟؟ ( دیتا یا دستور العمل ) 
منظورم از دستور العمل همون شماره رجیستری هست که میخواید درش مقدار بنویسید!

اگه 0 باشه = یعنی آماده دریافت دستور العمل هست
اگه 1 باشه = یعنی آماده دریافت دیتا هست!

دقت کنید که منظور از دستور العمل همون آدرس رجیستر و منظور از دیتا مقدار اون رجیستر هست! همه ی اینا (دستور العمل یا دیتا) از 16 پایه دیتا ارسال میشه!

پین WR
برای اینکه به LCD بگیم که آقا چیزی برای شما ارسال شده باید این بیت یه نوسان کنه! یعنی اینکه 0 بشه بعد از چند میلی ثانیه دوباره یک بشه!
 
پین RD
این پین مشخص میکنه که شما میخواهید دیتا بنویسید یا بخوانید!
اگه 0 باشه = یعنی میخواهید بخوانید 
اگه 1 باشه = یعنی میخواهید بنویسید

اینا چهار تا پین های اساسی بودن که اگه به LCD نگاه کنید میتونید اینارو ببینید!

حالا شما میتونید برید و کتابخونه ی این LCD که من از ECA دانلود کردم رو بخونید و همه چیز رو بفهمید!
من چند تا تابع از این کتابخونه رو توضیح میدم!

لینک کتابخونه:
http://bayanbox.ir/view/6730394001368623542/lcd.h

خوب زودتر دانلود کنید تا بریم سراغ توابعش!


تابع  lcd_send
این تابع کاره اصلی رو میکنه!
همه تابع ها آخرش به این میرسه!
این تابع کلا برای ارسال دیتا و دستور العمل هست که به پایه های 0 تا 15 Data که روی lcd هست میفرسته !

تابع wr_cmd
این تابع هم خیلی کارش مهمه! و مسئول ارسال فرمان هست!
در این تابع LCD RS صفر شده! یعنی ما به LCD میگیم که آماده دریافت دستور باشه ( نه دیتا)
بعد LCD RD هم 1 میشه! معنی ایش اینه که میخواهیم بنویسیم و نمیخواهیم بخوانیم!
سپس ورودی C به تابع lcd_send همون تابع بالا ارسال میشه!
در آخر هم توسط LCD WR ال سی دی رو از ارسال دیتا/دستورالعمل آگاه میکنه! (با صفر و یک شدن)

تابع wr_dat
این تابع هم خیلی کارش مهمه! و مسئول ارسال دیتا هست!
این تابع کار تابع بالا را انجام میدهد با این تفاوت که در تابع بالا ما LCD رو آماده دریافت دستورالعمل میکردیم ولی در این تابع اونو آماده دریافت دیتا میکنیم!
پس
ر این تابع LCD RS یک شده! یعنی ما به LCD میگیم که آماده دریافت دیتا باشه ( نه دستورالعمل)
بعد LCD RD هم 1 میشه! معنی ایش اینه که میخواهیم بنویسیم و نمیخواهیم بخوانیم!
سپس ورودی C به تابع lcd_send همون تابع بالا ارسال میشه!
در آخر هم توسط LCD WR ال سی دی رو از ارسال دیتا/دستورالعمل آگاه میکنه! (با صفر و یک شدن)

تابع wr_reg
در اکثر توابع این تابع فراخوانی میشود! این تابع درواقع ترکیب دو تابع بالاست!
در تابع wr_cmd ما میخواهیم به LCD یک آدرس رجیستر رو ارسال کنیم! در واقع قصد نوشتن در رجیستری را داریم و در تابع wr_dat قصد مقدار دهی همان رجیستر رو داریم!
بنابراین در این تابع (wr_reg) ما ترکیب هر دو را داریم! یعنی میخواهیم در یک رجیستر بنویسیم!
بنابراین، این تابع دو ورودی دارد که وردودی اول را برای تایع wr_cmd میفرستد تا رجیستر مورد نظر را به LCD اعلام کند و ور.دی بعدی به wr_dat ارسال میشود تا آن رجیستر را مقدار دهی کند!

مثلا برای جایه جایی مکان نما (Cursor) از تابع LCD_SetCursor استفاده میشود! در این تابع همان تابع بالا یعنی wr_reg فرخوانی میشود!
برای اینکار ابتدا آدرس رجیستر مورد نظر برای wr_cmd ارسال میشه و بعدش مقدار x یا y برای wr_dat ارسال میشه!
به کد زیر دقت کنید!
wr_reg(0x004E, Xpos);
در کد بالا 0x004E همان آدرس رجیستری هست که میخواهیم مقدار x رو درون بنویسیم تا مکان نما به اونجا منتثل بشه هسن!
و Xpos هم مقدار x هست که برای تابع wr_dat ارسال میشه!

خوب شاید به خودتون بگید که ما آدرس رجیستر ها رو از کجا بیاریم!
همونطور که در اول مطلب گفتم داخل دیتاشیت صفحه 24 ستون اول سمت چپ نوشته #reg که تو اون ستون آدرس رجیستر ها وجود داره!


حال در پایان مطلب میخواهیم ببینیم که یک حرف چگونه در lcd نمایش داده میشود!
کتابخانه زیر رو دانلود کنید
http://bayanbox.ir/view/5551286349393366082/Font-24x16.h
در خط 571 میبینید نوشته شده const unsigned char asc2_1608[95][16] که میگه کاراکتر یا همون حروف ما 16 تایی همونکه بالا هم گفتیم!
16 در 8! حالا میبخواهیم ببینیم که چطوری روی ال سی نشون میده!
شما حرف A رو در تصویر بالا به دقت ببینید و با کد زیر مقایسه کنید
{0x00,0x00,0x00,0x08,0x08,0x18,0x14,0x14,0x24,0x3C,0x22,0x42,0x42,0xE7,0x00,0x00},/*"A",33*/
همونطور که دید هر هشت بیت یک ستون افقی تشکیل میده که 0 و 1 بودن بیت نشون دهنده رنگی بودن اون پیکسله!



خوب حالا کلا بریم ببینیم برای نمایش روی LCD چه توابعی وجود داره!

تابع LCD_Init
این تابع برای راه اندازی LCD به کار میره بنابراین قبل از استفاده از LCD حتما این تابع باید فراخوانی بشه!
به صورت زیر
LCD_Init();
تابع LCD_Clear
این تابع برای پاک کردن LCD با یک رنگ خاص استفاده میشود!
مثلا تمام صفحه رو سیاه / سفید / قرمز یا ... میکنه! و برای سفید کردن صفحه به صورت زیر استفاده میشه
LCD_Clear(White);

تابع LCD_Fill
این تابع برای رنگی کردن چند پیکسل استفاده میشه! مثلا میتونید بگید از فلان جا تا فلان جا رو رنگی کنه و یه مربع درست بشه! و به صورت زیر استفاده میشه!
در کد زیر مقدار اول تابع نقطه شروع در محور x و مقدار دوم نقطه شروع در نقطه ی y رو نشون میده! مقدار سوم و چهارم هم نقطه ی پایان x,y رو نشون میده.... مقدار آخر هم که معلومه رنگ رو نشون میده!
LCD_Fill(120,282,150,319,RED);
تابع LCD_ShowString
از این تابع برای نمایش یک متن در جای مشخصی از lcd استفاده میشه!
LCD_ShowString(65,295,"Hello World!");

تابع LCD_ShowNum
از این تایع برای نمایش یک عدد استفاده میشود!
مقدار اول و دوم نقطه x و y رو مشخص میکنه! و مقدار سوم عدد که میخوایم بنویسیم! و مقدار چهارم طول عدد رو مشخص میکنه! و مقدار آخر هم ارتفاع رو مشخص میکنه! (همون 16 تا که توی بحث فونت و نوشتن حروف گفتیم)
LCD_ShowNum(2,282,x,4,16);


امیدوارم که به دردتون خورده باشه!

فعلا

یا علی مدد!!!!