C language > Work in progress

how to detect push button

(1/2) > >>

shirley:
i need to write a program using c langauge for microcontroller PIC18F4620. the requirement are, turning ON & OFF a LED using 2 push button. here is my program:

#include <p18f4620.h>

#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF

#define btn_on      PORTBbits.RB4
#define btn_off      PORTBbits.RB5
#define led                       PORTAbits.RA0

void press(void);
void on(void);
void off(void);

void main(void)
{
   TRISA = 0;         //set Port A(LED) as output
   PORTAbits.RA0 = 0;      //reset LED
   
   while(btn_on != btn_off)      //wait for btn press
   
      if (btn_on = 1)      //btn on pressed
      on();

      if (btn_off = 1)               //btn off pressed
      off();
}

      void on(void)
      {
         while(!btn_on);         //wait for btn(RB4) released
         PORTAbits.RA0 = 0x0F;      //on LED
      }
   
      void off(void)
      {
         while(!btn_off);         //wait for btn(RB5) released
         PORTAbits.RA0 = 0x00;      //off LED
      }


i have been workin on this for a week, but still cant work. i need some guide. thank you

frankie:
You know, I suppose that this is not a general 'C' programming site, and also that PellesC doesn't helps with PIC controllers.
Anyway and just for this time I wanna help you.

--- Code: ---#include <p18f4620.h>

#pragma config OSC = HS  //Are you using crystal or ceramic resonator for oscillator?
#pragma config WDT = OFF
#pragma config LVP = OFF

#define btn_on      PORTBbits.RB4
#define btn_off      PORTBbits.RB5
#define led                       PORTAbits.RA0

void press(void);
void on(void);
void off(void);
void Delay(void);

void main(void)
{
   TRISA = 0;         //set Port A(LED) as output
   PORTAbits.RA0 = 0;      //reset LED
Rpt:
   if (btn_on || btn_off)      //wait for btn press
   {   
      if (btn_on == 1)      //btn on pressed - NOTE: comparation operator is double equal!!!!!!!
      {
          Delay();          //This is the real trick, Debounce the input!!
          if (!btn_on)      //btn on still pressed?
              goto Rpt;    //No
          on();
       }

      if (btn_off == 1)               //btn off pressed
      {
          Delay();          //This is the real trick, Debounce the input!!
          if (!btn_off)     //btn off still pressed?
              goto Rpt;    //No
          off();
      }
   }
   goto Rpt;
}

      void on(void)
      {
Rpt_on:
         while(btn_on); //wait for btn(RB4) released - NOTE:you have to stay here while buttorn is pressed!
          Delay();        //debounce
          if (btn_on)     //btn on still released?
              goto Rpt_on;  //No
         PORTAbits.RA0 = 0x0F;      //on LED
      }
   
      void off(void)
      {
Rpt_off:
         while(btn_off);         //wait for btn(RB5) released - See before!
          Delay();        //debounce
          if (btn_off)     //btn off still released?
              goto Rpt_off;  //No
         PORTAbits.RA0 = 0x00;      //off LED
      }

void Delay(void)
{
   int i;

   for(i=0; i<2048; i++);
}

--- End code ---

shirley:
i suppose is crystal resonator.

:D and thank a lot for the help. sorry i wasn't that this site doesnt deal with PIC microcontroller. but any way thank again for the help..

shirley:
thank for the help.
i have tested your code, but i press the button, the LED still did not light up. ???
i still dont understand.. where is problem..??

frankie:
Are you sure that the hardware is working?
There many things to check, with a microcontroller you have to test the software but also the hardware.
Anyway on software side maybe the delay constant 2048 is too large and you have to reduce it (try beginning with 100).

Navigation

[0] Message Index

[#] Next page

Go to full version