96 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/**
 | 
						|
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 | 
						|
 *
 | 
						|
 * SPDX-License-Identifier: BSD-3-Clause
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include "pico/stdlib.h"
 | 
						|
#include "hardware/gpio.h"
 | 
						|
 | 
						|
/*
 | 
						|
  Our 7 Segment display has pins as follows:
 | 
						|
 | 
						|
  --A--
 | 
						|
  F   B
 | 
						|
  --G--
 | 
						|
  E   C
 | 
						|
  --D--
 | 
						|
 | 
						|
  By default we are allocating GPIO 2 to A, 3 to B etc.
 | 
						|
  So, connect GOIP 2 to pin A on the 7 segment LED display etc. Don't forget
 | 
						|
  the appropriate resistors, best to use one for each segment!
 | 
						|
 | 
						|
  Connect button so that pressing the switch connects the GPIO 9 (default) to
 | 
						|
  ground (pull down)
 | 
						|
*/
 | 
						|
 | 
						|
#define FIRST_GPIO 2
 | 
						|
#define BUTTON_GPIO (FIRST_GPIO+7)
 | 
						|
 | 
						|
// This array converts a number 0-9 to a bit pattern to send to the GPIO's
 | 
						|
int bits[10] = {
 | 
						|
        0x3f,  // 0
 | 
						|
        0x06,  // 1
 | 
						|
        0x5b,  // 2
 | 
						|
        0x4f,  // 3
 | 
						|
        0x66,  // 4
 | 
						|
        0x6d,  // 5
 | 
						|
        0x7d,  // 6
 | 
						|
        0x07,  // 7
 | 
						|
        0x7f,  // 8
 | 
						|
        0x67   // 9
 | 
						|
};
 | 
						|
 | 
						|
/// \tag::hello_gpio[]
 | 
						|
int main() {
 | 
						|
    stdio_init_all();
 | 
						|
    printf("Hello, 7segment - press button to count down!\n");
 | 
						|
 | 
						|
    // We could use gpio_set_dir_out_masked() here
 | 
						|
    for (int gpio = FIRST_GPIO; gpio < FIRST_GPIO + 7; gpio++) {
 | 
						|
        gpio_init(gpio);
 | 
						|
        gpio_set_dir(gpio, GPIO_OUT);
 | 
						|
        // Our bitmap above has a bit set where we need an LED on, BUT, we are pulling low to light
 | 
						|
        // so invert our output
 | 
						|
        gpio_set_outover(gpio, GPIO_OVERRIDE_INVERT);
 | 
						|
    }
 | 
						|
 | 
						|
    gpio_init(BUTTON_GPIO);
 | 
						|
    gpio_set_dir(BUTTON_GPIO, GPIO_IN);
 | 
						|
    // We are using the button to pull down to 0v when pressed, so ensure that when
 | 
						|
    // unpressed, it uses internal pull ups. Otherwise when unpressed, the input will
 | 
						|
    // be floating.
 | 
						|
    gpio_pull_up(BUTTON_GPIO);
 | 
						|
 | 
						|
    int val = 0;
 | 
						|
    while (true) {
 | 
						|
        // Count upwards or downwards depending on button input
 | 
						|
        // We are pulling down on switch active, so invert the get to make
 | 
						|
        // a press count downwards
 | 
						|
        if (!gpio_get(BUTTON_GPIO)) {
 | 
						|
            if (val == 9) {
 | 
						|
                val = 0;
 | 
						|
            } else {
 | 
						|
                val++;
 | 
						|
            }
 | 
						|
        } else if (val == 0) {
 | 
						|
            val = 9;
 | 
						|
        } else {
 | 
						|
            val--;
 | 
						|
        }
 | 
						|
 | 
						|
        // We are starting with GPIO 2, our bitmap starts at bit 0 so shift to start at 2.
 | 
						|
        int32_t mask = bits[val] << FIRST_GPIO;
 | 
						|
 | 
						|
        // Set all our GPIO's in one go!
 | 
						|
        // If something else is using GPIO, we might want to use gpio_put_masked()
 | 
						|
        gpio_set_mask(mask);
 | 
						|
        sleep_ms(250);
 | 
						|
        gpio_clr_mask(mask);
 | 
						|
    }
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
/// \end::hello_gpio[]
 |