Пн ноя 06, 2023 22:40:47
Пн ноя 06, 2023 22:52:27
Вт ноя 07, 2023 11:41:56
Вт ноя 07, 2023 12:06:33
Вт ноя 07, 2023 12:33:56
ioan dobrev писал(а): на любую кнопку нужна функция
Вт ноя 07, 2023 20:48:57
Вт ноя 07, 2023 21:53:43
typedef struct menuitem {
char name[17]; //выводимое имя пункта
int32_t min; //минимальное значение параметра, который настраивается в меню
int32_t max; //максимальное значение
int32_t value; //текущее значение, Меняется кнопками "вверх" и "вниз"
int32_t oldvalue; //значение до сохранения
int32_t step; //шаг изменения значения
struct menuitem *left; //соседнее меню слева
struct menuitem *right; //соседнее меню справа
int32_t (* action)(); //действие пункта меню. Может быть как просто применение текущего значения параметра, так и целая подпрограмма.
uint8_t id; //просто номер
} menuitem;
menuitem mainmenu={{0x41, 0xBC, 0xBE, 0xBB, 0xB8, 0xBF, 0x79, 0xE3, 0x61, 0x20, 0x79, 0xE3, 0x61, 0x70, 0x61, 0x3A, 0x00}, 0, 65000, 0, 0, 0, NULL, NULL, NULL, 0};
menuitem cortres={{0xA8, 0x6F, 0x70, 0x6F, 0xB4, 0x20, 0x4B, 0x3A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00}, 0, 100000, 5000, 5000, 100, NULL, NULL, NULL, 1};
menuitem voltres={{0xA8, 0x6F, 0x70, 0x6F, 0xB4, 0x20, 0x48, 0x3A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00}, 1, 4000, 500, 500, 50, NULL, NULL, NULL, 2};
menuitem blanktime={{0x42, 0x70, 0x65, 0xBC, 0xC7, 0x20, 0xB4, 0xBB, 0x79, 0x78, 0x6F, 0xBF, 0xC3, 0x3A, 0x20, 0x20, 0x00}, 0, 1000, 30, 30, 1, NULL, NULL, NULL, 3};
menuitem dynamic={{0xE0, 0xB8, 0xBD, 0x61, 0xBC, 0xB8, 0xBA, 0x61, 0x20, 0xB8, 0xB4, 0x70, 0xC3, 0x3A, 0x20, 0x20, 0x00}, 0, 1, 0, 0, 1, NULL, NULL, NULL, 4};
menuitem channels={{0x4B, 0x61, 0xBD, 0x61, 0xBB, 0x6F, 0xB3, 0x20, 0xB3, 0x78, 0x6F, 0xE3, 0x61, 0x3A, 0x20, 0x20, 0x20}, 1, 2, 1, 1, 1, NULL, NULL, NULL, 5};
menuitem learn={"Start learning? ", 0, 1, 0, 0, 1, NULL, NULL, NULL, 6}; //запас
menuitem soundsample={"Sound sample №:", 0, 1, 0, 0, 1, NULL, NULL, NULL, 7};
menuitem *curitem;
int32_t save()
{
curitem->oldvalue=curitem->value;
FramStoreValue(curitem->value, curitem->id);
LedOn(3, 1000);
return 0;
};
mainmenu.left=&cortres;
mainmenu.right=&blanktime;
cortres.left=&channels;
cortres.right=&blanktime;
cortres.action=&save;
cortres.oldvalue=FramLoadValue(cortres.id);
cortres.value=cortres.oldvalue;
blanktime.right=&dynamic;
blanktime.left=&cortres;
blanktime.action=&save;
blanktime.oldvalue=FramLoadValue(blanktime.id);
blanktime.value=blanktime.oldvalue;
while(millis<presstime+PRESSDELAY){}; //антидребезг
delay(100);
if(up()){
curitem->value+=curitem->step;
if(curitem->value > curitem->max){curitem->value = curitem->max;};
presstime=millis;
redraw=1;
};
if(down()){
curitem->value-=curitem->step;
if(curitem->value < curitem->min){curitem->value = curitem->min;};
presstime=millis;
redraw=1;
};
if(ok()){
curitem->action();
};
if(esc()){
curitem->value=curitem->oldvalue;
curitem=&mainmenu;
redraw=1;
};
if(left()){
curitem->value=curitem->oldvalue;
curitem=curitem->left;
redraw=1;
};
if(right()){
curitem->value=curitem->oldvalue;
curitem=curitem->right;
redraw=1;
};
Вт ноя 07, 2023 22:06:42
Точнее, за каждый элемент. И это и есть ответ на вопрос>TEHb< писал(а):Во-первых, надо объявить тип, который будет отвечать за один элемент меню.
. И чтобы окончательно понять преимущество такого подхода, необходимо изучить, что есть ООП (объектно-ориентированное программирование).ioan dobrev писал(а):в чём его суть?
Ср ноя 08, 2023 19:46:35
Ср ноя 08, 2023 20:06:04
Чт ноя 09, 2023 10:30:05
menuitem mainmenu={{0x41, 0xBC, 0xBE, 0xBB, 0xB8, 0xBF, 0x79, 0xE3, 0x61, 0x20, 0x79, 0xE3, 0x61, 0x70, 0x61, 0x3A, 0x00}, 0, 65000, 0, 0, 0, NULL, NULL, NULL, 0};
menuitem cortres={{0xA8, 0x6F, 0x70, 0x6F, 0xB4, 0x20, 0x4B, 0x3A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00}, 0, 100000, 5000, 5000, 100, NULL, NULL, NULL, 1};
menuitem voltres={{0xA8, 0x6F, 0x70, 0x6F, 0xB4, 0x20, 0x48, 0x3A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00}, 1, 4000, 500, 500, 50, NULL, NULL, NULL, 2};
menuitem blanktime={{0x42, 0x70, 0x65, 0xBC, 0xC7, 0x20, 0xB4, 0xBB, 0x79, 0x78, 0x6F, 0xBF, 0xC3, 0x3A, 0x20, 0x20, 0x00}, 0, 1000, 30, 30, 1, NULL, NULL, NULL, 3};
menuitem dynamic={{0xE0, 0xB8, 0xBD, 0x61, 0xBC, 0xB8, 0xBA, 0x61, 0x20, 0xB8, 0xB4, 0x70, 0xC3, 0x3A, 0x20, 0x20, 0x00}, 0, 1, 0, 0, 1, NULL, NULL, NULL, 4};
menuitem channels={{0x4B, 0x61, 0xBD, 0x61, 0xBB, 0x6F, 0xB3, 0x20, 0xB3, 0x78, 0x6F, 0xE3, 0x61, 0x3A, 0x20, 0x20, 0x20}, 1, 2, 1, 1, 1, NULL, NULL, NULL, 5};
menuitem learn={"Start learning? ", 0, 1, 0, 0, 1, NULL, NULL, NULL, 6}; //запас
menuitem soundsample={"Sound sample №:", 0, 1, 0, 0, 1, NULL, NULL, NULL, 7};
menuitem *curitem;
int32_t save()
{
curitem->oldvalue=curitem->value;
FramStoreValue(curitem->value, curitem->id);
LedOn(3, 1000);
return 0;
};
cortres.left=&channels;
cortres.right=&blanktime;
cortres.action=&save;
cortres.oldvalue=FramLoadValue(cortres.id);
cortres.value=cortres.oldvalue;
blanktime.right=&dynamic;
blanktime.left=&cortres;
blanktime.action=&save;
blanktime.oldvalue=FramLoadValue(blanktime.id);
blanktime.value=blanktime.oldvalue;
mainmenu.left=&cortres;
mainmenu.right=&blanktime;
struct
{
volatile uint16_t Ua;
volatile uint16_t Ub;
volatile uint16_t Uc;
volatile uint16_t Ia;
volatile uint16_t Ib;
volatile uint16_t Ic;
}par,*par_p;
par_p=∥
Чт ноя 09, 2023 10:35:33
>TEHb< писал(а): struct menuitem *left; //соседнее меню слева
struct menuitem *right; //соседнее меню справа
ioan dobrev писал(а):меню на указателях
ioan dobrev писал(а):В скопках что указано
ioan dobrev писал(а):{0x41, 0xBC, 0xBE, 0xBB, 0xB8, 0xBF, 0x79, 0xE3, 0x61, 0x20, 0x79, 0xE3, 0x61, 0x70, 0x61, 0x3A, 0x00}
>TEHb< писал(а):char name[17]; //выводимое имя пункта
Чт ноя 09, 2023 10:46:25
cortres.right=&blanktime;
/nastroyki.flag_obriv_a=&c;
Чт ноя 09, 2023 10:57:14
struct menuitem *right;
Чт ноя 09, 2023 11:04:34
char name[17];
Чт ноя 09, 2023 11:16:02
ioan dobrev писал(а):какие уменьшают или увеличивают параметры в меню
>TEHb< писал(а): if(up()){
curitem->value+=curitem->step;
if(curitem->value > curitem->max){curitem->value = curitem->max;};
presstime=millis;
redraw=1;
};
Чт ноя 09, 2023 11:34:59
UP - верх .Doun- вниз
Чт ноя 09, 2023 11:51:37
ioan dobrev писал(а):какой то параметр G
ioan dobrev писал(а):Покажите как вы выводите на LCD?
utoa(curitem->value, string2, 10);
stringlenght=0;
while(string2[stringlenght]){stringlenght++;};
for(stringcounter=16; stringcounter>=0; stringcounter--)
{
if (stringlenght>=0){string2[stringcounter]=string2[stringlenght]; stringlenght--;}
else {string2[stringcounter]=20;};
};
LCD1602_PrintStringOfPosition(0, curitem->name);
LCD1602_PrintStringOfPosition(16, string2);
Чт ноя 09, 2023 12:00:13
utoa
Чт ноя 09, 2023 12:04:01