#include <stdio.h>
#include <stdlib.h>
#include <bcm2835.h>
int main(int argc, char **argv)
{
if (!bcm2835_init())
return 1;
bcm2835_gpio_fsel(RPI_BPLUS_GPIO_J8_07, BCM2835_GPIO_FSEL_INPT);
bcm2835_gpio_set_pud(RPI_BPLUS_GPIO_J8_07, BCM2835_GPIO_PUD_UP);
bcm2835_gpio_fsel(RPI_BPLUS_GPIO_J8_11, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(RPI_BPLUS_GPIO_J8_13, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(RPI_BPLUS_GPIO_J8_15, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_11, HIGH);
bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_13, LOW);
bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_15, LOW);
uint64_t t;
int buttonState = bcm2835_gpio_lev(RPI_BPLUS_GPIO_J8_07);
int state = 0;
while (1)
{
t = bcm2835_st_read();
int buttonNow = bcm2835_gpio_lev(RPI_BPLUS_GPIO_J8_07);
int edge = buttonState - buttonNow;
buttonState = buttonNow;
switch (state)
{
case 0:
if (edge)
{
state = 1;
bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_11, LOW);
bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_13, HIGH);
bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_15, LOW);
}
break;
case 1:
if (edge)
{
state = 2;
bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_11, LOW);
bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_13, LOW);
bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_15, HIGH);
}
break;
case 2:
if (edge)
{
state = 0;
bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_11, HIGH);
bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_13, LOW);
bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_15, LOW);
}
break;
}
t = bcm2835_st_read() - t;
bcm2835_delayMicroseconds(1000 - t);
}
return 0;
}