با استفاده از مثال امروز می خواهیم کار کردن با کلید را فرا بگیریم. می خواهیم برنامه ای بنویسیم که شمارنده باینری باشد (مانند جلسه قبل) با این تفاوت که با کلیدی که به یکی از پین های پورت B وصل شده است می خواهیم عمل ریست کردن را انجام دهیم. یعنی هر بار که کلید را فشار دادیم، شمارش باینری از صفر شروع شود.
ابتدا بایستی با دستور پر کاربرد BUTTON آشنا شویم. در واقع این دستور تماس لرزان ناشی از فشردن دکمه( (debouncing را حذف می کند. هنگامی که کلید را فشار می دهیم، پلاتین های آن به صورت ناگهانی قطع و وصل نمی شوند بلکه قبل از این که وضعیت کلید به حالت پایدار برسد، قطع و وصل کلید چندین بار به صورت جست و خیز در مدت کوتاهی ادامه می یابد. به علت سرعت بالای میکروکنترلر ها این جست و خیزهای سریع نیز خوانده می شوند و امکان دارد در روند برنامه اختلال ایجاد کند. برای رفع این مشکل از دستور BUTTON استفاده می کنیم.
این دستور تنها با 8 پایه ی تشکیل دهنده پورت B عمل می کند. شکل کلی دستور BUTTON به صورت زیر می باشد:
BUTTON Pin, State, Delay, Rate, Var, Action, Lable
که در آن:
Pin شماره پایه متصل به کلید (یکی از پایه های پورت B )،
State وضعیت پایه به هنگام فشار دادن دکمه است (صفر یا یک)
Delay تعداد شمارش سیکل پیش از آن که debouncing شروع شود.(صفر تا 255) اگر صفر نوشته شود هیچ debouncing و تکرار خودکار اجرا نخواهد شد و اگر 255 نوشته شود، debouncing انجام خواهد شد ولی تکرار خودکار انجام نخواهد شد.
Rate نرخ تکرار خودکار می باشد. در حقیقت مدت فشرده نگه داشتن کلید را تعیین می کند. ( صفر تا 255)
Var متغیری یک بایتی است که برای شمارش معکوس یا تاخیر به کار برده می شود که قبل از استفاده بایستی با صفر مقدار دهی شود.
Action وضعیت دکمه برای اجرای پرش می باشد ( اگر دکمه فشار داده نشده باشد صفر و اگر فشار داده شده باشد 1 )
Lable محلی از برنامه که در صورت درست بودن Action ، عملیات باید از آن جا ادامه پیدا کند.
شماتیک دو مدل دکمه را که می توان با دستور Button استفاده کرد، در ذیل آورده شده است.
با استفاده از شماتیک سمت راست، وقتی کلید فشرده می شود، ولتاژ 5 ولت که معادل 1 می باشد به پایه ی ورودی اعمال می شود و در شماتیک سمت چپ با فشرده شدن کلید، صفر به پایه ی ورودی اعمال می شود.
برنامه زیر یک شمارنده باینری است که با استفاده از کلیدی که به پورت B.7 وصل شده، می توان این شمارش را ریست کرد. به دستورات Button توجه کنید.
TRISB=%1000000
B0 VAR BYTE : B1 VAR BYTE
LOOP1:
B1=0
FOR B0=0 TO 127
PORTB=B0
PAUSE 250
BUTTON 7,1,245,0,B1,1,LOOP2
NEXT B0
GOTO LOOP1
LOOP2:
PORTB=0
BUTTON 7,0,245,0,B1,1,LOOP1
GOTO LOOP2
END
توجه داشته باشید که چون از 7 پایه ی پورت B برای شمارش استفاده کردیم، شمارنده می تواند تا 127 بشمارد. (2^7=128)
شماتیک مدار به صورت زیر می باشد:
مادامی که کلید فشرده شده باشد، خروجی روی پورت B صفر خواهد بود. دستور Button اول که درون حلقه ی loop1 قرار دارد در واقع می گوید وقتی کلید porttb.7 فشار داده شد (1 شد) برنامه به حلقه loop2 پرش کند. و دستور Button دوم می گوید وقتی کلید مورد نظر رها شد (صفر شد) برنامه به حلقه ی loop1 پرش کند.
در خط دوم از نکته ی زیر استفاده شده است.
نکته) برای نوشتن چند فرمان در یک خط می توانیم از علامت : بین دو دستور استفاده کنیم. به عنوان مثال( (B1=0 : B2=0 .