control numbers using buttons
This commit is contained in:
parent
6c117bc4c2
commit
183cacf730
55
main.c
55
main.c
|
@ -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_PORT B /**< port to select multiplexer output */
|
||||||
#define MUX_S2_PIN 5 /**< pin 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) */
|
/** 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_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) */
|
#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
|
// display numbers on TM1637
|
||||||
for (uint8_t number=0; number<LENGTH(numbers); number++) {
|
for (uint8_t number=0; number<LENGTH(numbers); number++) {
|
||||||
mux_select(number);
|
mux_select(number);
|
||||||
if (0xffff==numbers[number]) {
|
if (0xffff==numbers[number].number) {
|
||||||
led_tm1637_off();
|
led_tm1637_off();
|
||||||
} else {
|
} 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_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
|
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;
|
uint16_t buttons = 0;
|
||||||
|
printf("OK\n");
|
||||||
|
|
||||||
encode_morse();
|
encode_morse();
|
||||||
bool announce = false;
|
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_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_PIN2)) ? 1 : 0)<<14);
|
||||||
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN3)) ? 1 : 0)<<15);
|
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
|
uint16_t buttons_diff = buttons^buttons_new; // get difference
|
||||||
buttons = buttons_new; // save new state
|
buttons = buttons_new; // save new state
|
||||||
|
if (buttons_diff) { // only do something if there is a change
|
||||||
printf("button pressed: %016b\n", buttons);
|
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
|
// display time and frame number
|
||||||
|
|
Loading…
Reference in New Issue