۱۴۰۱ بهمن ۲۲, شنبه

میکروکنترلر PIC - قسمت دوم : استفاده از Push Button

microchip 16f877

 

در نظر داریم تغییراتی در سخت افزار و برنامه Blinky ایجاد کنیم بصورتیکه با قرار دادن یک کلید فشاری (Push Button) بعد از فشار دادن سوئیچ LED روشن شود و پس از رها کردن سوئیچ فشاری LED خاموش شود . برای این منظور از روش وارسی و انتظار برای تغییر رجیسترها استفاده میکنیم . در آینده استفاده از وقفه های خارجی و استفاده از روش Round Robin برای زمانبندی انجام وظایف نیز توضیح داده خواهد شد.

شماتیک مدار بصورت زیر است:


در برنامه زیر تنها وقتی پایه RD0 برابر ۱ باشد LED روشن خواهد شد . در صورتیکه پایه RD0 بصورت شناور باشد و به محلی وصل نباشد LED دائما روشن میماند و هنگامی که پایه به ۰ ولت وصل شود LED خاموش میشود.

/*
 * File:   XC8.c
 * Author: Ali
 *
 * Created on July 13, 2017, 9:18 AM
 */

#define _XTAL_FREQ 16000000
#include < xc.h>

// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//END CONFIG

int main()
{
  TRISB0 = 0; //RB0 as Output PIN
  TRISD0 = 1; //RD0 as Input PIN

  RB0 = 0; //LED Off

  while(1)
  {
      while(RD0==1){
          RB0=1;
      }
      RB0=0;
      }
  return 0;
}

در صورتیکه نیاز داشته باشیم بعد از فشار دادن سوئیچ مدت زمان معینی LEDروشن باشد میتوانیم از کد زیر استفاده کنیم ، در اینجا بعد از فشار دادن سوئیچ LEDبه مدت ۳ ثانیه روشن میماند.

int main()
{
  TRISB0 = 0; //RB0 as Output PIN
  TRISD0 = 1; //RD0 as Input PIN

  RB0 = 0; //LED Off

  while(1)
  {
    if(RD0 == 0) //If Switch Pressed
    {
      RB0 = 1; //LED ON
      __delay_ms(3000); //3 Second Delay
      RB0 = 0; //LED OFF
    }
  }
  return 0;
}

میتوان در برنامه شرایطی ایجاد کرد که در حالت فشرده قرار داشتن کلید برای مدت زمان معینی را چک کند . مثلا اگر سوئیچ فشاری برای مدتی بیش از ۵۰۰ میلی ثانیه در حالت فشرده باقی بماند LED دوم که به پایه RB1 متصل شده است روشن خواهد شد و به مدت ۳ ثانیه روشن باقی میماند:

if(RD0 == 0) //If Switch is presseed
{
  __delay_ms(500); //Provides required delay
  if(RD0 == 0) //If Switch is still pressed
  {
    RB1 = 1; //LED ON
    __delay_ms(3000); //3 second delay
    RB1 = 0; //LED OFF
  }
}

هیچ نظری موجود نیست:

ارسال یک نظر