Reading the state of a button is as simple as turning an LED on, but in the other direction : use GPIO::enableInput()
instead of GPIO::enableOutput()
and GPIO::get()
instead of GPIO::set()
.
When enabling a pin in input mode, an optional pulling option can be selected, as explained in the GPIO
module reference. It is common for a button to be connected in such a way that it will connect the pin to GND when pressed, and keep the line open otherwise. It it therefore necessary to enable a pullup (pulling resistor to Vcc) in order to raise the line to a high level when the button is not pressed. For this reason, GPIO::get(PIN_BUTTON)
will return true
by default, and false
when the button is pressed : this is called negative logic.
The example below is really simple : it turns the red LED on or off every time the button is pressed. Two versions of the same program are presented : a version using the helper module specifically for the Carbide board, and a generic version using only the main library functions which can be used on any board.
button.cpp
[download]wget http://libtungsten.io/static/code/examples/button_carbide/button.cpp
#include <carbide.h> int main() { // Init the board, including defining LED and button pins Carbide::init(true); // Keep a trace of the current LED state bool ledState = false; while (true) { // Check if the button has been pressed if (Carbide::buttonRisingEdge()) { // Invert and set the LED state ledState = !ledState; Carbide::setLedR(ledState); } } }
Makefile
[download]wget http://libtungsten.io/static/code/examples/button_carbide/Makefile
NAME=button BOOTLOADER=true CARBIDE=true # Available modules : adc dac eic gloc i2c spi tc trng usart # Some modules such as gpio and flash are already compiled by default # and must not be added here. MODULES= # The toolchain's bin/ path, don't forget to customize it # If this directory is already in your PATH, comment this line. TOOLCHAIN_PATH=/opt/arm-none-eabi/bin/ # Include the main lib makefile include libtungsten/Makefile
button.cpp
[download]wget http://libtungsten.io/static/code/examples/button/button.cpp
#include <core.h> #include <gpio.h> int main() { // Init the microcontroller Core::init(); // Define the pin on which the button is connected const GPIO::Pin PIN_BUTTON = GPIO::PA04; // Enable this pin in input GPIO::enableInput(PIN_BUTTON, GPIO::Pulling::PULLUP); // Define the pin on which the LED is connected // On Carbide, this is the red LED const GPIO::Pin PIN_LED = GPIO::PA00; // Enable this pin in output to a HIGH state GPIO::enableOutput(PIN_LED, GPIO::HIGH); // Keep a trace of the current LED state bool ledState = false; while (true) { // Check if the button has been pressed (negative logic, hence fallingEdge()) if (GPIO::fallingEdge(PIN_BUTTON)) { // Invert and set the LED state ledState = !ledState; GPIO::set(PIN_LED, !ledState); // Negative logic } } }
Makefile
[download]wget http://libtungsten.io/static/code/examples/button/Makefile
NAME=button BOOTLOADER=true # Available modules : adc dac eic gloc i2c spi tc trng usart # Some modules such as gpio and flash are already compiled by default # and must not be added here. MODULES= # The toolchain's bin/ path, don't forget to customize it # If this directory is already in your PATH, comment this line. TOOLCHAIN_PATH=/opt/arm-none-eabi/bin/ # Include the main lib makefile include libtungsten/Makefile