قسمت دوم --- دستورات مربوط به LCD

در این قسمت ادامه دستورات کامپایلر PIC Simulator IDE شرح داده می شود. این دستورات مربوط به ارتباط میکروکنترلر با LCD می باشد. برای اینکه بتوانید در این نرم افزار به زبان بیسیک برنامه نویسی نمائید ابتدا برنامه را باز کنید و روی منوی TOOLS رفته و سپس Basic Compiler را انتخاب نمائید.

اکنون ادامه دستورات:

دستورات:

 قبل از مطالعه این دستورات بهتر است که با LCD و روش های  ارتباط با آن آشنایی داشته باشید.

DEFINE

 فرم کلی دستور:

DEFINE command

 قبل از هر چیز درباره دستور DEFINE توضیح می دهم. برخی از دستورات دارای مقادیر پیش فرض هستند که با دستور DEFINE می توان مقدار دلخواه را مشخص نمود. در مثال ها کاربرد این دستور را مشاهده خواهید نمود.


 LCD_BITS

 فرم کلی دستور:

 DEFINE LCD_BITS =  4 OR 8

  این دستور مشخص می سازد که پورت اطلاعات LCD چهاربیتی است یا هشت بیتی (به روش های ارتباط با LCD مراجعه نمائید.)
  مقدار پیش فرض 4 است.


LCD_DREG

 فرم کلی دستور:

 DEFINE LCD_DREG  =  PORTA or PORTB OR PORTC OR PORTD

 مشخص می سازد که خطوط دیتای LCD به کدام پورت میکرو متصل است . که یکی از پورت های فوق باید انتخاب شود.
  مقدار پیش فرض PORTB است.


LCD_DBIT

 فرم کلی دستور:

 DEFINE LCD_DBIT  =  0 or 4

 این دستور زمانی کاربرد دارد که BUS  چهار بیتی باشد. و برای باس 8 بیتی تعریف نشده .
 این دستور مشخص می سازد که BUS به 4 بیت کم ارزشتر از پورت میکرومتصل است هرگاه صفر انتخاب شود و همچنین باس به 4 بیت با ارزش تر از پورت میکرو متصل است ، هرگاه 4 انتخاب شود.
  مقدار پیش فرض 4 است.


LCD_RSREG

 فرم کلی دستور:

 DEFINE LCD_RSREG  =   PORTA or PORTB OR PORTC OR PORTD

  مشخص می سازد که پایه RS از LCD به کدام پورت از میکرو متصل شده.
  مقدار پیش فرض PORTB است.


LCD_RSBIT

 فرم کلی دستور:

 DEFINE LCD_RSBIT = شماره پین پورت مشخص شده

  مشخص می سازد که پایه RS از LCD به کدام پین از پورت میکرو که با دستور قبل مشخص شده است ، متصل شده. 
  مقدار پیش فرض 3 است.


LCD_EREG

 فرم کلی دستور:

 DEFINE LCD_EREG = PORTA or PORTB OR PORTC OR PORTD

  مشخص می سازد که پایه Enable از LCD به کدام پورت از میکرو متصل شده.
  مقدار پیش فرض PORTB است.


LCD_EBIT

 فرم کلی دستور:

 DEFINE LCD_EBIT = شماره پین پورت مشخص شده

  مشخص می سازد که پایه Enable از LCD به کدام پین از پورت میکرو که با دستور قبل مشخص شده است ، متصل شده. 
  مقدار پیش فرض 2 است.


LCD_RWREG

 فرم کلی دستور:

 DEFINE LCD_RWREG = PORTA or PORTB OR PORTC OR PORTD

  مشخص می سازد که پایه R/W از LCD به کدام پورت از میکرو متصل شده.
  مقدار پیش فرض 0 است.


LCD_RWBIT

 فرم کلی دستور:

 DEFINE LCD_RWBIT = شماره پین پورت مشخص شده

  مشخص می سازد که پایه R/W از LCD به کدام پین از پورت میکرو که با دستور قبل مشخص شده است ، متصل شده. 
  مقدار پیش فرض 0 است.


LCD_COMMANDUS

 فرم کلی دستور:

 DEFINE LCD_COMMANDUS = زمان برحسب میکروثانیه

  مدت زمان تاخیر که پس از اجرای هر فرمان لازم است را مشخص می سازد.
 
مقدار پیش فرض 5000 میکروثانیه است.


LCD_DATAUS

 فرم کلی دستور:

 DEFINE LCD_DATAUS = زمان بر حسب میکروثانیه

  مدت زمان تاخیر که پس از هربار ارسال اطلاعات روی LCD لازم است را مشخص می سازد.
 
مقدار پیش فرض 50 است.


LCD_INITMS

 فرم کلی دستور:

 DEFINE LCD_INITMS = زمان بر حسب میلی ثانیه

  این دستور مدت زمان تاخیر برای دستور LCDINIT را مشخص می کند.
 
مقدار پیش فرض 100 است.


   توجه: در هنگام استفاده از سه دستور اخیر در هنگام شبیه سازی با برنامه ، کمترین مقدار ممکن را برای آن ها در نظر بگیرید.

 هر یک از دستورات فوق دارای مقادیر پیش فرض هستند لذا هرگاه هر یک از دستورات فوق را تایپ نکردید ، کامپایلر مقدار پیش فرض را برای آن پارامتر یا متغیر در نظر می گیرد. به عنوان مثال هرگاه دستور LCD_RWREG را در برنامه تایپ ننمودید کامپایلر هیچ پینی از پورت های میکروکنترلر را به پایه R/W از LCD اختصاص نمی دهد.


LCDINIT

 فرم کلی دستور:

 LCDINIT  0 or 1 or 2 or 3

  این دستور باید قبل از اولین دستورفرمان (LCDCMDOUT) و اولین دستور ارسال اطلاعات (LCDOUT) قرار گیرد
 
اگر هیچ مقداری برای این دستور مشخص نشود و یا مقدار صفر برای آن مشخص شود ، مکان نمای LCD خاموش خواهد بود.
  اگر مقدار 1 برای این دستور مشخص شود ، مکان نمای LCD چشمک زن خواهد بود.
  اگر مقدار 2 برای این دستور مشخص شود ، مکان نمای LCD به صورت underline ثابت خواهد بود.
  گر مقدار 3 برای این دستور مشخص شود ، مکان نمای LCD به صورت underline چشمک زن خواهد بود.


LCDOUT

 این دستور برای ارسال اطلاعات روی LCD به کار می رود. با این دستور می توان مقادیرعددی ثابت ، متغیر رشته ای و متغیر ارسال نمود. و با استفاده از علامت (,) می توان ترکیبی از موارد فوق را ارسال نمود:

 LCDOUT "Hello world!"                       عبارت داخل گیومه را روی LCD نمایش می دهد.

LCDOUT #A                    محتوای متغیر A را به صورت دسیمال روی LCD نمایش می دهد.
 LCDOUT "Hello!",#A


LCDOUT A                      
کاراکتر اسکی محتوای متغیر A راروی LCD نمایش می دهد


LCDCMDOUT

 این دستور برای ارسال فرمان روی LCD به کار می رود. با این دستور می توان مقادیرعددی ثابت ، متغیر رشته ای و متغیر ارسال نمود. و با استفاده از علامت (,) می توان ترکیبی از موارد فوق را ارسال نمود.
 مثلا دستور زیر مشخص می سازد که مکان نما پس از نوشتن هر حرف یا عدد به سمت راست شیفت پیدا کند:

 DIM A AS BYTE
A = 6
LCDCMDOUT #A

 درسته که با روش فوق می توان فرمان ها را به LCD ارسال نمود اما این کامپایلر روش دیگری نیز برای این عمل در نظر گرفته است و آن استفاده از کلمات و دستورات کلیدی زیر است:  

LCDCLEAR    صفحه LCD پاک شود:

LCDHOME    مکان نما در بالاترین سطر و در آخرین ستون سمت چپ قرار می گیرد

LCDLINE2HOME       مکان نما در سطر دوم و آخرین ستون سمت چپ قرار می گیرد

LCDLEFT   با هربار اجرای این دستور مکان نما یک کاراکتر به سمت چپ می رود

LCDRIGHT   با هربار اجرای این دستور مکان نما یک کاراکتر به سمت راست می رود

LCDSHIFTLEFT   با هربار اجرای این دستور تمامی کاراکترها به اندازه یک کاراکتر به سمت چپ شیفت پیدا می کنند

LCDSHIFTRIGHT   با هربار اجرای این دستور تمامی کاراکترها به اندازه یک کاراکتر به سمت راست شیفت پیدا می کنند

LCDLINE1CLEAR    تمامی کاراکترهای سطر اول را پاک می کند

LCDLINE2CLEAR      تمامی کاراکترهای سطر دوم را پاک می کند

 موقعیت مکان نما در سطر اول را مشخص می سازد. داخل پرانتز باید عددی بین 1 تا 40 باشد که شماره خانه ای که مکان نما در آن قرار می گیرد را (از سمت چپ) مشخص می سازد:

LCDLINE1POS( )

موقعیت مکان نما در سطردوم را مشخص می سازد. داخل پرانتز باید عددی بین 1 تا 40 باشد که شماره خانه ای که مکان نما در آن قرار می گیرد را (از سمت چپ) مشخص می سازد

LCDLINE2POS( )


LCDDEFCHAR

 فرم کلی دستور:

 LCDDEFCHAR  v,a1,a2,a3,a4,a5,a6,a7,a8

 از این دستور برای تعریف کاراکتر دلخواه کاربراستفاده می شود. مثلا اگر شما بخواهید که کاراکتر یک عدد پارسی و یا حرف پارسی را ایجاد نمائید و در پروژه تان از آن استفاده نمائید ، می توانید با استفاده از این دستور این کار را انجام دهید. اما محدودیتی وجود دارد و آن این است که بیش از 8 کاراکتر نمی توانید تعریف کنید دلیل این موضوع هم مربوط می شود به خود LCD های کاراکتری. این LCD ها دارای ثباتی با نام CGRAM می باشند که CG مخفف عبارت Character Cenerator (سازنده کاراکتر) می باشد. تعداد این ثبات ها 8 عدد می باشد ( cgram0 - cgram7) لذا بیشتر از 8 کاراکتر نمی توان ساخت. هر یک از این CGRAM ها دارای 8 بایت می باشد که این هشت بایت در واقع نقاط روشن و خاموش را در مکان کاراکترها مشخص می سازند:

شکل فوق مکان یک کاراکتر روی LCD را نشان می دهد. هر مکانی از 5 ستون و 8 سطر متشکل از نقاط ریز تشکیل شده است.
همانطور که قبلا گفته شد ثبات CGRAM دارای هشت بایت می باشد که هر یک از این 8 بایت به یکی از سطرهای شکل فوق مربوط می شود و 5 بیت کم ارزش هر یک از آن 8 بایت به ستون های فوق مربوط می شود. مقدار 1 منطقی نقطه ای را روشن می سازد و مقدار 0 منطقی نقطه ای را خاموش می سازد.

اما دستور LCDDEFCHAR (LCDDEFCHAR  v,a1,a2,a3,a4,a5,a6,a7,a8 ) اولین آرگومان این دستور یعنی v می تواند مقادیری از 0 تا 7 داشته یاشد که در واقع شماره n امین کاراکتر تعریف شده را مشخص می سازد و قبلا ذکر شده بود که فقط 8 کاراکتر می توان تعریف نمود.

 اما مقادیر a1 تا a8 هر یک به یکی از ستون های شکل فوق مریوط می شود- از بالا به پایین- بطوریکه a1 به بالاترین ستون و a8 به پایین ترین ستون. مقادیر a1 تا a8 هم می تواند به صورت دسیمال باشد و هم یه صورت باینری.

برای ارسال هریک از کاراکترهای تعریفی کافیست که از دستور lcdout استفاده شود. به این صورت که ابتدا دستور LCDOUT را نوشته و سپس شماره کاراکتر تعریف شده را می نویسیم. در مثال زیر 2 کاراکتر تعریف نمده ایم یکی عدد 3 و دیگری حرف ب :

Lcddefchar 0, %00000, %10101, %11111, %10000, %10000, %10000, %10000, %00000
Lcddefchar 1, %00000, %00000, %00000, %10001, %11111, %00100, %00000, %00000
lcdout 0
lcdout 1

 نکته ی مهمی که درباره این کاراکترها باید مورد توجه قرار گیرد اینست که اولین کاراکتر ارسالی از این نوع در home (بالاترین و اولین خانه از سمت چپ lcd) قرار می گیرد و سپس می توان با دستورات شیفت دهنده کاراکتر مورد نظر را به خانه دلخواه انتقال داد.

             


چند مثال:

1:
DEFINE LCD_BITS = 8
DEFINE LCD_DREG = PORTB
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTD
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTD
DEFINE LCD_EBIT = 3
DEFINE LCD_RWREG = PORTD
DEFINE LCD_RWBIT = 2
DEFINE LCD_COMMANDUS = 10000
DEFINE LCD_DATAUS = 100
DEFINE LCD_INITMS = 1000
LCDINIT
loop:
   
LCDOUT "Hello world!"
   
WAITMS 1000
   
LCDCMDOUT LcdClear
   
WAITMS 1000
GOTO loop

2:
DEFINE LCD_BITS = 8
DEFINE LCD_DREG = PORTB
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTD
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTD
DEFINE LCD_EBIT = 3
DEFINE LCD_RWREG = PORTD
DEFINE LCD_RWBIT = 2
DEFINE LCD_COMMANDUS = 10000
DEFINE LCD_DATAUS = 100
DEFINE LCD_INITMS = 1000
DIM A AS WORD
A = 65535
LCDINIT 3
WAITMS 1000
loop:
   
LCDOUT "I am counting!"
   
LCDCMDOUT LcdLine2Home
   
LCDOUT #A
   
A = A - 1
   
WAITMS 250
   
LCDCMDOUT LcdClear
GOTO loop

3:

LCDDEFCHAR 0, 10, 10, 10, 10, 10, 10, 10, 10
LCDDEFCHAR 1, %11111, %10101, %10101, %10101, %10101, %10101, %10101, %11111
LCDOUT 0, 1, "Hello!", 1, 0

 


نرم افزار PIC Simulator IDE دارای 6 نوع LCD از نوع کاراکتر و عدد می باشد که در قسمت SETUP ماژول LCD این نرم افزار می توان هر یک از آن ها را بسته به نوع پروژه ، برای شبیه سازی انتخاب نمائید. این 6 نوع عبارتند از:

 1 X 16 - 2 X 16 - 4 X 16 - 2 X 20 - 4 X 20 - 2 X 40

تمامی دستورات فوق برای هر یک از این 6 نوع LCD صادق است.