control numbers using buttons

This commit is contained in:
King Kévin 2017-05-06 17:00:10 +02:00
parent 6c117bc4c2
commit 183cacf730
1 changed files with 50 additions and 5 deletions

55
main.c
View File

@ -81,8 +81,23 @@ volatile uint8_t frame_count = 0; /**< number of frames passed */
#define MUX_S2_PORT B /**< port to select multiplexer output */
#define MUX_S2_PIN 5 /**< pin to select multiplexer output */
/** number to be display and changed using the buttons */
struct number_t {
uint16_t number; /**< number to display (0-9999, 0xffff=off) */
uint8_t up; /**< which of the 16 buttons is to increment the number */
uint8_t down; /**< which of the 16 buttons is to decrement the number */
};
/** episode, scene, take, video 1, audio 1, video 2, audio 2 number (does not have to be in this order) */
uint16_t numbers[7] = {0};
struct number_t numbers[] = {
{0, 2, 3},
{0, 14, 15},
{0, 10, 11},
{0, 6, 7},
{0, 1, 0},
{0, 13, 12},
{0, 5, 4},
};
#define POWER_SWITCH_PORT B /**< port to switch power of all devices (including this micro-controller) */
#define POWER_SWITCH_PIN 8 /**< pin to switch power of all devices (including this micro-controller) */
@ -498,10 +513,10 @@ void main(void)
// display numbers on TM1637
for (uint8_t number=0; number<LENGTH(numbers); number++) {
mux_select(number);
if (0xffff==numbers[number]) {
if (0xffff==numbers[number].number) {
led_tm1637_off();
} else {
led_tm1637_number(numbers[number]);
led_tm1637_number(numbers[number].number);
}
}
@ -560,6 +575,7 @@ void main(void)
gpio_primary_remap(AFIO_MAPR_SWJ_CFG_JTAG_OFF_SW_ON, 0); // enable PA15 (JTDI per default)
gpio_clear(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN0)|GPIO(BUTTONS_READ_PIN1)|GPIO(BUTTONS_READ_PIN2)|GPIO(BUTTONS_READ_PIN3)); // pull read lines low since they will be high when driven and button is pressed
uint16_t buttons = 0;
printf("OK\n");
encode_morse();
bool announce = false;
@ -655,9 +671,38 @@ void main(void)
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN1)) ? 1 : 0)<<13);
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN2)) ? 1 : 0)<<14);
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN3)) ? 1 : 0)<<15);
if (buttons_new!=buttons) { // only do something if there is a change
buttons = buttons_new; // save new state
uint16_t buttons_diff = buttons^buttons_new; // get difference
buttons = buttons_new; // save new state
if (buttons_diff) { // only do something if there is a change
printf("button pressed: %016b\n", buttons);
for (uint8_t number=0; number<LENGTH(numbers); number++) {
if (buttons_diff&(1<<numbers[number].up) || buttons_diff&(1<<numbers[number].down)) { // buttons for display 0
if (buttons&(1<<numbers[number].up) && buttons&(1<<numbers[number].down)) { // both buttons are pressed
numbers[number].number = 0xffff; // disable number
} else if (buttons&(1<<numbers[number].up) && buttons_diff&(1<<numbers[number].up)) { // only up button has been pressed
if (0xffff==numbers[number].number) {
numbers[number].number = 0;
} else {
numbers[number].number = (numbers[number].number+1)%10000;
}
} else if (buttons&(1<<numbers[number].down) && buttons_diff&(1<<numbers[number].down)) { // only down button has been pressed
if (0xffff==numbers[number].number) {
numbers[number].number = 9999;
} else if (0==numbers[number].number) {
numbers[number].number = 0xffff;
} else {
numbers[number].number -= 1;
}
}
}
// display numbers on TM1637
mux_select(number);
if (0xffff==numbers[number].number) {
led_tm1637_off();
} else {
led_tm1637_number(numbers[number].number);
}
}
}
// display time and frame number