Все выпуски  

Анонсы журнала "Лаборатория электроники и программирования" Новые статьи 24 номера


5. Программирование на языке С на примере микроконтроллера STM32F407VGT6. Кнопка с анализом «короткого» и «долгого» нажатия.

Некоторые примеры работы с кнопками уже были рассмотрены в журнале №12 (статья 2). Однако есть еще много разных вариантов работы с кнопками. Макет можно собрать на плате «STM32F4DISCOVERY» [5], плате «163» и дополнительной кнопке (на плате «STM32F4DISCOVERY» есть только одна пользовательская кнопка). Вместо платы «163» можно использовать любой модуль «USB-UART». Пример программ будет даваться для компилятора «CooCox®» [4].

                Рассмотрим задачу для димера (управление яркостью светодиода) с помощью двух кнопок. При «коротком» нажатии на кнопки яркость будет увеличиваться/уменьшаться на один «дискрет яркости». При длительном удержании кнопки – включаться на полную яркость или выключаться. Для увеличения яркости будет использоваться кнопка B1, расположенная на плате. Для уменьшения – дополнительная, подключенная к «3V» и порту PA1.

Текст основной программы (все файлы исходного кода вы можете найти в приложении):

// Работа с кнопками.

// Пример 5. Кнопка с анализом «короткого» и «долгого» нажатия. Димер.

//

 

 

#include "stm32F4xx.h" // описание периферии

#include "stdio.h" // описание стандартных функций

#include "string.h" // описание функций работы со строками

 

// определения частот шин микроконтроллера

#define APB1_CLOCK 16000000L // частота шины APB1

 

#include "UART3_drv.h" // объявления функций для работы с USART3

 

char msg[200]; // массив для формирования сообщений для вывода по UART

 

// состояние кнопки

#define key_state_off 0 // не нажата

#define key_state_bounce 1 // дребезг

#define key_state_on_short 2 // нажата "короткое"

#define key_state_on_long 3 // нажата "длинное"

volatile unsigned char key_state = key_state_off; // состояние кнопки 1

volatile unsigned char key_state_2 = key_state_off; // состояние кнопки 2

 

// счетчик времени дребезга

#define key_bounce_time_cnt_top 50 // время дребезга в мс

volatile unsigned int key_bounce_time_cnt; // счетчик времени дребезга в мс

volatile unsigned int key_bounce_time_cnt_2; // счетчик времени дребезга в мс 2

 

// 0 - не нажата

// 1 - кнопка нажата (интервал дребезга пройден), короткое нажатие

// 2 - кнопка нажата, длинное нажатие

volatile unsigned char key_press_flag = 0;

volatile unsigned char key_press_flag_2 = 0;

 

// счетчик времени длительного нажатия

#define key_long_press_time_cnt_top 2000 // время "длинного" нажатия в мс

volatile unsigned int key_long_press_time_cnt; // счетчик времени "длинного" нажатия в мс

volatile unsigned int key_long_press_time_cnt_2; // счетчик времени "длинного" нажатия в мс

 

6. Программирование на языке С на примере микроконтроллера STM32F407VGT6. Кнопка с анализом с анализом «длительности нажатия". Изменение параметра в широких пределах.

Если необходимо устанавливать какой-либо параметр (например, громкость, позицию, частоту и т.п.) в широком диапазоне, но с большой точностью и быстро, можно сделать логарифмическое изменение параметра при длительном удержании кнопки, т.е. чем дольше кнопка удерживается, тем большее изменение параметра производится. Рассмотрим пример такой программы. В ней будет использовано 3 шага приращения значения, а также работает автоповтор нажатия кнопки.

Пример программы будет даваться для компилятора «CooCox®» [4].  Назначение и подключение кнопок - как в предыдущей статье.

Текст основной программы (все файлы исходного кода вы можете найти в приложении):

// Работа с кнопками.

// Пример 6. Кнопка с анализом «длительности нажатия". Изменение параметра в широких пределах.

//

 

 

#include "stm32F4xx.h" // описание периферии

#include "stdio.h" // описание стандартных функций

#include "string.h" // описание функций работы со строками

 

// определения частот шин микроконтроллера

#define APB1_CLOCK 16000000L // частота шины APB1

 

#include "UART3_drv.h" // объявления функций для работы с USART3

 

char msg[200]; // массив для формирования сообщений для вывода по UART

 

// состояние кнопки

#define key_state_off 0 // не нажата

#define key_state_bounce 1 // дребезг

#define key_state_on_short 2 // нажата, "короткое"  +-1

#define key_state_on_long_plus_minus10 3 // нажата, "длинное" +-10

#define key_state_on_long_plus_minus100 4 // нажата, "длинное" +-100

volatile unsigned char key_state = key_state_off; // состояние кнопки 1

volatile unsigned char key_state_2 = key_state_off; // состояние кнопки 2

 

// счетчик времени дребезга

#define key_bounce_time_cnt_top 50 // время дребезга в мс

volatile unsigned int key_bounce_time_cnt; // счетчик времени дребезга в мс

volatile unsigned int key_bounce_time_cnt_2; // счетчик времени дребезга в мс 2

 

// 0 - не нажата

// 1 - кнопка нажата (интервал дребезга пройден), короткое нажатие +-1

// 2 - кнопка нажата (интервал дребезга пройден), длинное нажатие +-10

// 3 - кнопка нажата (интервал дребезга пройден), длинное нажатие +-100

volatile unsigned char key_press_flag = 0;

volatile unsigned char key_press_flag_2 = 0;

 

// счетчик временни автоповтора

#define key_repeat_time_cnt_top 500 // время автоповтора в мс

volatile unsigned int key_repeat_time_cnt; // счетчик времени автоповтора

volatile unsigned int key_repeat_time_cnt_2; // счетчик времени автоповтора 2

 

// счетчик времени длительного нажатия

#define key_long_press_time_cnt_top_plus_minus10 2500 // время "длинного" нажатия +-10 в мс

#define key_long_press_time_cnt_top_plus_minus100 4500 // время "длинного" нажатия +-100 в мс

 

volatile unsigned int key_long_press_time_cnt; // счетчик времени "длинного" нажатия в мс

volatile unsigned int key_long_press_time_cnt_2; // счетчик времени "длинного" нажатия в мс

 

unsigned int parametr;

 

Результат работы программы (в терминальной программе):

Test key short-long-3_levels:

… здесь нажали и удерживаем первую кнопку

parametr - 1

parametr - 2

parametr - 3

parametr - 4

parametr - 5

parametr - 15

parametr - 25

parametr - 35

parametr - 45

parametr - 55

parametr - 155

parametr - 255

parametr - 355

parametr - 455

parametr - 555

parametr - 655

parametr - 755

parametr - 855

parametr - 955

parametr – 1055

… здесь нажали и удерживаем вторую кнопку

parametr - 1054

parametr - 1053

parametr - 1052

parametr - 1051

parametr - 1050

parametr - 1040

parametr - 1030

parametr - 1020

parametr - 1010

parametr - 1000

parametr - 900

parametr - 800

parametr - 700

parametr - 600

parametr - 500

parametr - 400

parametr - 300

                В данной программе отсутствует проверка на ограничения параметра сверху и снизу, т.е. параметр будет изменяться «по кругу».

 

http://journal.electroniclab.ru/journal_content_024.htm 


В избранное