Чт янв 20, 2022 17:49:52
Опять мне присваивают чужое.Eddy_Em писал(а):А твой код "софтового таймера" - ад какой-то.
Чт янв 20, 2022 18:55:37
KA = 0;
while (1) {
switch (KA) {
case 0: инит_всего(); KA = 1; break;
case 1: опрос_кнопок(); KA = 2; break;
case 2: действие(); KA = 3; break;
case 3: вывод_лсд(); KA = 1; break;
default: в пиииии.....();
}
}
Чт янв 20, 2022 22:41:48
#define BTN_LOCK_TIME 50 // время обработки дребезга в папугаях
#define BTN_LONG_TIME 150 // время фиксации длинного нажатия в папугаях
//настройка портов и линий
#define BTN_PIN GPIOB->IDR // порт кнопок
#define BTN_LINE1 GPIO_Pin_5 // линии кнопок
#define BTN_LINE2 GPIO_Pin_0
#define BTN_LINE3 GPIO_Pin_1
#define BTN_LINE3 GPIO_Pin_2
//определения флагов кнопок
#define BTN_SHRT1 (1<<0) // флаги короткого нажатия кнопок
#define BTN_SHRT2 (1<<1)
#define BTN_SHRT3 (1<<2)
#define BTN_LINE4 (1<<3)
#define BTN_LONG1 (1<<4) // флаги длинного нажатия кнопок
#define BTN_LONG2 (1<<5)
#define BTN_LONG3 (1<<6)
#define BTN_LONG4 (1<<7)
//глобальные переменные
volatile uint8_t BtnFlags; //регистр флагов нажатых кнопок
//функция инициализации портов
void BtnInit (void)
{
лень писать
}
//функция циклического опроса кнопок (вызывать с частотой хГц, например в прерывании)
void BtnExe (void)
{
static uint8_t BtnLockBit; //защелка (защита от дребезга)
static uint16_t BtnLockCoun; //счетчик защелки (защита от дребезга)
static uint16_t BtnLongCoun; //счетчик длинного нажатия
static uint8_t BtnMascLast; //запомнить маску нажатой кнопки для анализа после отжатия кнопки
unsigned uint8_t BtnMask = 0;
if (~BTN_PIN & BTN_LINE1) BtnMask = BTN_SHRT1;//формирование маски нажатых кнопок
if (~BTN_PIN & BTN_LINE2) BtnMask = BTN_SHRT2;
if (~BTN_PIN & BTN_LINE3) BtnMask = BTN_SHRT3;
if (~BTN_PIN & BTN_LINE4) BtnMask = BTN_SHRT4;
//основной алгоритм обработки событий кнопки
if (BtnMask){ //клавиша нажата
BtnMascLast = BtnMask; //запоминаем для использования после отпускания кнопки
if (BtnLockCoun < (BTN_LOCK_TIME)){
BtnLockCoun++; //обработка дребезга
return;
}
BtnLockBit=1; //нажатие зафиксировано
if (BtnLongCoun >= (BTN_LONG_TIME))
return;
if (++BtnLongCoun >= (BTN_LONG_TIME))
BtnFlags |= (BtnMask << 4); //установка бита длинного нажатия (старшие 4 бита флагов)
}
else{ //клавиша отжата
if (BtnLockCoun){ //обработка дребезга
BtnLockCoun --;
return;
}
if (! BtnLockBit) //отжатие зафиксировано
return;
BtnLockBit =0;
if (BtnLongCoun < (BTN_LONG_TIME))
BtnFlags |= BtnMascLast; //установка бита короткого нажатия (младшие 4 бита флагов)
BtnLongCoun = 0;
}
}
//чтени маски нажатых кнопок
//возвращает маску нажатых кнопок (бит 0-3 - коротк нажат, бит 4-7 - длинн нажат)
uint8_t BtnGet (void)
{
uint8_t temp = BtnFlags;
BtnFlags = 0;
return temp;
}
button = BtnGet(); //читаем значение кнопок
if (button == BTN_SHRT1) {}
if (button == BTN_SHRT2) {}
if (button == BTN_SHRT3) {}
if (button == BTN_SHRT4) {}
if (button == BTN_LONG1) {}
if (button == BTN_LONG2) {}
if (button == BTN_LONG3) {}
if (button == BTN_LONG4) {}
// Посмотреть относительное перемещение (по сравнению с прошлым вызовом)
int16_t enc_GetRelativeMove(void)
{
// Для хранения предыдущего значения счетчика
static uint16_t CNT_last = 0;
// Текущее значение, чтоб только один раз было запрошено
uint16_t CNT_now = TIM3->CNT;
// Посчитаем перемещение
int16_t CNT_diff = (int16_t)(CNT_now - CNT_last);
// Сохраним текущее значение как предыдущее
CNT_last = CNT_now;
// Вернем перемещение
return CNT_diff;
}
temp = (int8_t)enc_GetRelativeMove();
if (temp < 0) { - temp }
if (temp > 0) { + temp }
Чт янв 20, 2022 23:53:52
Чт янв 20, 2022 23:56:57
Такая реакция, как будто он на арабском написалЭто же вообще ниже плинтуса!
Пт янв 21, 2022 10:48:07
// Menus Name | Next | Prev | Parent | Child | SelectFunction
MENU_ITEM(m_0, m_1, null_menu, null_menu, null_menu, STANDART_SCREEN); // STANDART_SCREEN
MENU_ITEM(m_1, m_2, null_menu, null_menu, null_menu, POWER); // POWER
MENU_ITEM(m_2, m_3, null_menu, null_menu, null_menu, CHARGE); // CHARGE
MENU_ITEM(m_3, m_4, null_menu, null_menu, null_menu, OPERATION); // OPERATION
MENU_ITEM(m_4, m_0, null_menu, null_menu, null_menu, TIME); // TIME
MENU_ITEM(m_5, m_7, null_menu, m_6, m_6, SETTING_ENTER); // SETTING_ENTER
MENU_ITEM(m_6, null_menu, null_menu, m_5, m_5, CLEER_PARAMETRS); // CLEER_PARAMETRS
MENU_ITEM(m_7, m_13, m_5, m_8, m_10, CALIBRATIONS_DEVICES); // CALIBRATIONS_DEVICES
MENU_ITEM(m_8, m_11, null_menu, m_9, m_7, UMAX_LIMIT); // UMAX_LIMIT
MENU_ITEM(m_9, m_12, null_menu, m_10, m_8, IMAX_LIMIT); // IMAX_LIMIT
MENU_ITEM(m_10, null_menu, null_menu, m_7, m_9, SAVE_SETTINGS); // SAVE_SETTINGS
MENU_ITEM(m_11, null_menu, m_8, null_menu, null_menu, UMAX_LIMIT_1); // UMAX_LIMIT_1
MENU_ITEM(m_12, null_menu, m_9, null_menu, null_menu, IMAX_LIMIT_1); // IMAX_LIMIT_1
MENU_ITEM(m_13, m_15, null_menu, m_14, m_14, CALIBRATION_VOLTMETR); // CALIBRATION_VOLTMETR
MENU_ITEM(m_14, m_17, null_menu, m_13, m_13, CALIBRATION_AMPERMETR); // CALIBRATION_AMPERMETR
MENU_ITEM(m_15, m_16, m_13, null_menu, null_menu, VOLTMETR_1); // VOLTMETR_1
MENU_ITEM(m_16, m_15, m_15, null_menu, null_menu, VOLTMETR_2); // VOLTMETR_2
MENU_ITEM(m_17, m_18, m_14, null_menu, null_menu, AMPERMETR_1); // AMPERMETR_1
MENU_ITEM(m_18, m_17, m_17, null_menu, null_menu, AMPERMETR_2); // AMPERMETR_2
Пт янв 21, 2022 11:09:36
// Menus Name | Next | Prev | Parent | Child | SelectFunction
MENU_ITEM(m_0, m_1, null_menu, null_menu, null_menu, STANDART_SCREEN); // STANDART_SCREEN
MENU_ITEM(m_1, m_2, null_menu, null_menu, null_menu, POWER); // POWER
MENU_ITEM(m_2, m_3, null_menu, null_menu, null_menu, CHARGE); // CHARGE
MENU_ITEM(m_3, m_4, null_menu, null_menu, null_menu, OPERATION); // OPERATION
MENU_ITEM(m_4, m_0, null_menu, null_menu, null_menu, TIME); // TIME
MENU_ITEM(m_5, m_7, null_menu, m_6, m_6, SETTING_ENTER); // SETTING_ENTER
MENU_ITEM(m_6, null_menu, null_menu, m_5, m_5, CLEER_PARAMETRS); // CLEER_PARAMETRS
MENU_ITEM(m_7, m_13, m_5, m_8, m_10, CALIBRATIONS_DEVICES); // CALIBRATIONS_DEVICES
MENU_ITEM(m_8, m_11, null_menu, m_9, m_7, UMAX_LIMIT); // UMAX_LIMIT
MENU_ITEM(m_9, m_12, null_menu, m_10, m_8, IMAX_LIMIT); // IMAX_LIMIT
MENU_ITEM(m_10, null_menu, null_menu, m_7, m_9, SAVE_SETTINGS); // SAVE_SETTINGS
MENU_ITEM(m_11, null_menu, m_8, null_menu, null_menu, UMAX_LIMIT_1); // UMAX_LIMIT_1
MENU_ITEM(m_12, null_menu, m_9, null_menu, null_menu, IMAX_LIMIT_1); // IMAX_LIMIT_1
MENU_ITEM(m_13, m_15, null_menu, m_14, m_14, CALIBRATION_VOLTMETR); // CALIBRATION_VOLTMETR
MENU_ITEM(m_14, m_17, null_menu, m_13, m_13, CALIBRATION_AMPERMETR); // CALIBRATION_AMPERMETR
MENU_ITEM(m_15, m_16, m_13, null_menu, null_menu, VOLTMETR_1); // VOLTMETR_1
MENU_ITEM(m_16, m_15, m_15, null_menu, null_menu, VOLTMETR_2); // VOLTMETR_2
MENU_ITEM(m_17, m_18, m_14, null_menu, null_menu, AMPERMETR_1); // AMPERMETR_1
MENU_ITEM(m_18, m_17, m_17, null_menu, null_menu, AMPERMETR_2); // AMPERMETR_2
Пт янв 21, 2022 12:02:24
typedef struct ScreenItem {
SCREEN_OBJECT obj_type; // Element type
char *menu_text; // Menu text link
void (*exec_func)(uint8_t v); // Menu callback or null
uint16_t Left, Top, Width, Height; // Coordinates of menu item
int TextColor, BGColor; // Colors
const uint8_t *Pictogramm; // Pointer to pictogramm, or NULLPTR
} ScreenItem_t;
ScreenItem_t Scr1_Button2 = {SO_BUTTON, "ADC", *TestPress2, 0, 54, 32, 32, COLOR_LIME, COLOR_BLACK, NULLPTR};
ScreenItem_t Scr1_Button8 = {SO_BUTTON, "Voltage", *VScreenItem_t ScrTDR_Sw = {SO_BUTTON + SO_ADJUSTABLE, "<- Pairs ->", *TDR_SwitchPairs, 132, 200, 134, 21 ,COLOR_LIME, COLOR_BLACK, NULLPTR};
ScreenItem_t ScrTDR_quit = {SO_BUTTON, "Exit", *TDR_Exit, 269, 200, 50, 21, COLOR_LIME, COLOR_BLACK, NULLPTR};
oltageTest_CB, 180, 54, 90, 32, COLOR_LIME, COLOR_BLACK, NULLPTR};
ScreenItem_t ScrSett_BrLVL = {SO_BUTTON + SO_ADJUSTABLE, "BackLight", *BLPress_CallBack, 0, 51, 110, 35, COLOR_WHITE, COLOR_BLACK, NULLPTR};
Пт янв 21, 2022 15:08:26
Пт янв 21, 2022 15:15:12
Пт янв 21, 2022 15:25:45
Пт янв 21, 2022 16:21:21
Пт янв 21, 2022 16:24:42
Пт янв 21, 2022 18:57:29
Сб янв 22, 2022 08:50:16
Сб янв 22, 2022 08:58:59
Сб янв 22, 2022 14:37:16
Вот так вот не надо говорить, чего стоит только вот этот шедеврAVI-crak писал(а):а потом выкатит очередной шедевр, от которого мозги плавятся.
// threshold in ms for press/hold
#define PRESSTHRESHOLD (9)
#define HOLDTHRESHOLD (199)
// events
typedef enum{
EVT_NONE, // no events with given key
EVT_PRESS, // pressed
EVT_HOLD, // hold more than KEY_HOLDTIME ms
EVT_RELEASE // released
} keyevent;
uint16_t d = (uint16_t)(Tms - lastT);
keybase *k = &allkeys[i];
keyevent e = k->event;
switch(e){
case EVT_NONE: // just pressed
case EVT_RELEASE:
if((k->counter += d) > PRESSTHRESHOLD)
k->event = EVT_PRESS;
break;
case EVT_PRESS: // hold
if((k->counter += d)> HOLDTHRESHOLD)
k->event = EVT_HOLD;
break;
default:
break;
}
Там везде указатели используются, куда не плюнь.ivan dimir писал(а):А через указатель как сделать меню?
typedef const struct Menu_Item {
const struct Menu_Item *Next; /**< указатель на следующий пункт меню этого пункта меню */
const struct Menu_Item *Previous; /**< указатель на предыдущий пункт меню этого пункта меню */
const struct Menu_Item *Parent; /**< указатель на родительский пункт меню этого пункта меню */
const struct Menu_Item *Child; /**< указатель на дочерний пункт меню этого пункта меню */
void (*SelectCallback)(void); /**< указатель на функцию */
} Menu_Item_t;
MENU_ITEM(m_0, m_1, null_menu, null_menu, null_menu, STANDART_SCREEN); // STANDART_SCREEN
STANDART_SCREEN();
id = menu->SelectCallback;
if (button == BTN_SHRT3) {
if(id == SETTING_ENTER) { lcd_clear(); Menu_Navigate(MENU_CHILD); }
if(id == CLEER_PARAMETRS) { lcd_clear(); Menu_Navigate(MENU_CHILD); }
if(id == CALIBRATIONS_DEVICES) { lcd_clear(); Menu_Navigate(MENU_CHILD); }
if(id == UMAX_LIMIT || id == IMAX_LIMIT) { lcd_clear(); Menu_Navigate(MENU_CHILD); }
if(id==CALIBRATION_VOLTMETR || id==CALIBRATION_AMPERMETR) { lcd_clear(); Menu_Navigate(MENU_CHILD); }
if(id==STANDART_SCREEN || id==POWER || id==CHARGE || id==OPERATION || id==TIME) {
if (U_I == 0) { x_pwm_1 -=10; }
if (U_I == 1) { x_pwm_2 -=10; }
}
Сб янв 22, 2022 17:35:40
Dimon456 писал(а):А с чего вы начинали? Ответьте мне на вопрос. Случайно не с такого же шедевра, как у ТС? Или может сразу начали с методов эффективного программирования?
Чт фев 03, 2022 23:20:29
if(READ_BIT(GPIOB->IDR,GPIO_IDR_IDR_5)==0)
{
// delay_ms(10);
pauza++;
if(pauza>200)
{
flag=1;
}
// pauza++;
}
else
{
pauza2++;
//. flag=0;
if(pauza2>200)
{
flag1=1;
}
// pauza2++;
}
if(flag==1&&flag1==1)
{
// delay_ms(10);
flag=0;
flag1=0;
pauza=0;
pauza2=0;
menu_lcd++;
menu_btn++;
}
Сб фев 05, 2022 20:59:48
if(READ_BIT(GPIOB->IDR,GPIO_IDR_IDR_5)==0)
{
pauza++;
if(pauza>200)flag=1;
}else
{
pauza2++;
if(pauza2>200) flag1=1;
};
if((flag==1)&&(flag1==1))
{
flag=0;
flag1=0;
pauza=0;
pauza2=0;
menu_lcd++;
menu_btn++;
};
/// чем-то выполнять каждую 1мс
uint32_t tmp;
tmp = (GPIOB->IDR >> 5) & 1; // масса кнопки Vcc
tmp = 1 - tmp; // масса кнопки Gnd
pauza = pauza * tmp + tmp; // 255 раз подряд единица
tmp = pauza >> 5; // > 255
tmp = 1 - tmp;
pauza *= tmp; // условие обнуляет pauza
if (tmp == 0)
{
menu_lcd++;
menu_btn++;
};