بازدیدها: 906
دستورات JUMP , LOOP , CALL
دستور LOOP
LOOP به معناي حلقه مي باشد كاربرد آن در 8051 براي تكرار يك رشته دستورات مي باشد به كمك اين دسور مي توان تعداد خيلي زيادي از دستورات را تكرار كرد كه اگر بخواهيم آن دستورات را تك تك بنويسيم هم طول برنامه زياد مي شود و حجم برنامه كه باعث مي شود ROM 8051 به راحتي پر شود.قالب دستور به اين صورت مي باشد: DJNZ REG,LABEL
از اين دستور بيشتر براي ايجاد حلقه هاي تاخيري و شمارنده بكار مي رود. براي مثال كاربرد آن را در تاخير با يك مثال روشن مي كنيم:
MOV R1,#09H
LOOP: MOV R2,#05H
MGH1: DJNZ R2,MGH1
DJNZ R1,LOOP
توضيح برنامه: در خط اول به R1 مقدار 9 داده شده است و در خط سوم به R2 مقدار 5 داده شده است. در خط سوم از دستور حلقه استفاده كرديم و به اين صورت مي باشد كه يك واحد از R2 كم مي كند و اگر صفر نبود به MGH1 پرش مي كند. و دو باره يك واحد از R2 كم مي كند اگر صفر نبود به MGH1 پرش مي كند. و اين كار را همين طور ادامه مي دهد تا R2 صفر شود بعد از صفر شدن R2 ديگر به MGH1 پرش نمي كند و خط چهرم برنامه را اجرا مي كند كه در اين خط گفته شده كه يك واحد از R1 كم كن اگر صفر نشده به LOOP پرش كن كه اگر به R1 يك واحد كم كند مقدار آن 8 مي شود و به LOOP پرش مي كند كه در آنجا دو باره مقدار 5 به R2 داده مي شود و مراحل بالا تكرار مي شود. پس خط سوم 5 بار خوش را تكرار مي كند و خط چهارم هم 9 بار خط سوم را تكرار مي كند كه در كل 5*9=45 بار اين دستورات تكرار مي شود. البته CPU با كريستال 11.0529MHZ هر دستور را در مدت زمان 1.085Us اجرا مي كند اين زمان خيلي كمي است كه اگر ما ثبات R1=FFH و R2=FFH را بارگذاري كنيم يعني حداكثر عددي كه در يك ثبات 8 بتي مي تواند قرار گيرد. برابر خواهد بود با 256*256=65636 بار اين دستوات تكرار خواهد شد كه تقريبا با محاسبه دستورات سر بار حدود 0.2 ثانيه تاخير براي ما توليد مي كند البته اگر ما تاخير هاي دقيق تري لازم داشته باشيم مثلا براي ساعت بايد از تايمر ميكرو استفاده كنيم.
عدد 2 را روي پورت 1 انتقال بدهSTART: MOV P1,#02H
يك تاخير ايجاد كن ACALL DELAY
عدد 4 را روي پورت 1 انتقال بده MOV P1,#04H
يك تاخير ايجاد كن ACALL DELAY
به اول برنامه بر گردد و مراحل را تكرار كن SJMP START
DELAY: MOV R1,#0FFH
LOOP: MOV R2,#0FFH
MGH: DJNZ R2,MGH
DJNZ R1,LOOP
RET
انواع دستورات CALL
اين دستور به دو صورت و با خصوصيات مختلف مورد استفاده قرار مي گيرد:
دستور ACALL :
اين دستور به فراخواني كوتاه معروف است كه 2 بايتي مي باشد و مي تواند در محدود 2 كيلو بايتي از حافظه پرش كرده و زير برنامه را بخواند.
دستور LCALL :
اين دستور به فراخواني بلند معروف است كه3 بايتي مي باشد و مي تواند در محدود 64 كيلو بايتي از حافظه پرش كرده و زير برنامه را بخواند.
بسته به طول برنامه و حجم آن بايد از اين دستورات استفاده كرد. كه البته خود كامپايلر ها هنگامي كه مثلا از دستور ACALL استفاده مي كنيم و آن برنامه اي كه بايد فراخواني شود خارج از محدوده باشد خطا مي گيرند و برنامه نويس را آگاه مي كند.
دستور JUMP
اين دستور به معناي پرش مي باشد و به چندين دستور ديگر تجزيه مي شود. از اين دستورات براي منتقل كردن CPU به مكاني ديگر از برنامه مي باشد به عبارت ديگر از اين دستورات كه به پرش هاي شرطي و غير شرطي تقسم مي شوند براي فراهم شدنيك شرط استفاده شده تا بعد از ايجاد آن شرط CPU كار ديگري انجام دهد. كه با يك مثال اين قضيه را روشن مي كنيم. ابتدا دستورات شرطي:
پرش هاي شرطي
توضيح عمكرد دستور
توضيح
|
عمكرد
|
دستور
|
|
اگر A=0 است به LABEL پرش كن
|
JZ A,LABEL
|
|
اگر A≠0 است به LABEL پرش كن
|
JNZ A,LABEL
|
REG=R0-R7/A/B
|
يك واحد از REG كم كن به LABEL پرش كن
|
DJNZ ERG,LABEL
|
|
مقايسه و اگر A≠BYTE است به LABEL پرش كن
|
CJNE A,BYTE,LABEL
|
مثلا مقايسه انباه با عدد 60
CJNE A,#60H,LABEL
|
مقايسه REG با يك عدد و اگر نابرابر بود به LABEL پرش كن
|
CJNE REG,#DATA,LABEL
|
|
اگر پرچم كري برابر با 1 است پرش كن
|
JC,LABEL
|
|
اگر پرچم كري برابر با 0 است پرش كن
|
JNC,LABEL
|
مثلا بيت 1 از پورتيك
JB P1.1 ,LABEL
|
اگر بيت يك است به LABEL پرش كن
|
JB BIT,LABEL
|
|
اگر بيت صفر است به LABEL پرش كن
|
JNB BIT,LABEL
|
|
اگر بيت 1 است پرش كن و آن بيت را هم صفر كن
|
JBC BIT,LABEL
|
مثال برنامه اي بنويسيد كه اگر بيت P1.5=0 صفر شد عدد 50 را روي پورت 2 بريزد و در غير اين صورت عدد 80 را روي پورت 2 بريزد؟
START: JB P1.5,OUT_80
JNB P1.5,OUT_50
SJMP START
OUT_80: MOV P2,#80H
SJMP START
OUT_50: MOV P2,#50H
SJMP START
در خط اول اگر بيت يك باشد عدد 80 را روي پورت 2 مي ريزد و در خط دوم اگر بيت صفر باشد عدد 50 را روي پورت 2 مي ريزد.
پرش هاي غير شرطي
دستورات غير شرطي عبارت اند از:
SJMP پرش كوتاه
اين دستور دو بايتي بوده و قادر است در محدوه +128 تا -128 بايت پرش كند. يعني از 00-FF .
LJMP پرش بلند
اين دستور سه بايتي بوده و قادر است در محدوه 0000-FFFF هگز پرش كند.
دستور CALL
CALL به معناي فراخواني يا صدا زدن يعني اينكه يك زير برنامه (برنامه فرعي) را فراخواني كنيم به عنوان مثال در يك برنامه ما يك تاخير لازم داريم و در چند مورد هم لازم داريم براي كاهش طول برنامه اين برنامه تاخيري را در محلي نوشته و به كمك دستور CALL در هر جايي كه لازم باشد آن را فراخواني مي كنيم. نكته اي مهم در مورد فراخواني اين است كه در پايان هر زير برنامه بايد دستور RET را نوشت تا CPU به برنامه اصلي برگرد و ادامه كار را نجام دهد.
برنامه يك چشمك زدن كه قبلا در قسمت دوم بحث شده حال به صورت كامل آن را مي نويسيم:
مثال : برنامه يك چشمك زن بنويسيد با دو تا LED كه روي بيت هاي P1.1 , P1.2 وصل شده اند؟
ابتدا بيتهاي پورت يك را به صورت زير مي نويسيم و كد هگز آن را بدست مي آوريم توجه شود كه بايد حتما بعد از كد H بنويسيم.
P1
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
02
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
04
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|