Пн июл 22, 2019 10:10:31
Пн июл 22, 2019 10:13:49
надо знать инструментарий, с которым работаешь, без этого никакROMan2947 писал(а):если б я знал про это
Пн июл 22, 2019 10:14:04
Пн июл 22, 2019 10:17:49
Пн июл 22, 2019 10:20:34
Пн июл 22, 2019 11:56:27
char result[16];
uint32_t replaceDigit(uint32_t value, uint8_t idx, uint8_t upDown)
{
ltoa(value, result, 10);
uint8_t digit = result[idx];
if (upDown == 1 && digit < '9') digit++;
if (upDown == 0 && digit > '0') digit--;
return atol(result);
}
volatile uint32_t val_ = 87'654'321;
uint32_t val = val_;
val_ = replaceDigit(val, 2, 1);
uint32_t replaceDigit(uint32_t value, uint8_t idx, uint8_t upDown)
{
static const uint32_t tbl[] = { 1, 10, 100, 1000, 10'000, 100'000, 1'000'000, 10'000'000 };
uint32_t pval = tbl[idx];
uint8_t digit = value / pval % 10;
if (upDown == 1 && digit < 9) value += pval;
if (upDown == 0 && digit > 0) value -= pval;
return value;
}
if (upDown == 1 && digit < 9 && value + pval <= maxValue) value += pval;
.....
val = replaceDigit(val, 2, 1, 87'657'654);
Пн июл 22, 2019 12:24:41
Пн июл 22, 2019 12:25:56
Пн июл 22, 2019 12:31:18
Где одну то ? Ему нужно изменить число, состоящее из нескольких цифр !jcxz писал(а):Ну да - автору нужно изменить всего одну цифру, .... бла-бла-бла ...
Пн июл 22, 2019 13:54:04
Пн июл 22, 2019 16:53:11
Пн июл 22, 2019 17:14:30
Примените этот вопрос к себе. И внимательно почитайте задачу.jcxz писал(а):Может стоит всё-таки прочитать исходное сообщение автора, а не фантазировать?
Пн июл 22, 2019 21:01:22
static uint32_t const tPow10[] = {
10000000ul,
1000000ul,
100000ul,
10000ul,
1000ul,
100ul,
10ul,
};
void write_TEKdata_setup_eeprom(char type_counter)
{
TEK_data=0;
for(uint8_t it=0;it<7;it++)
{
TEK_data+=masiv_razryadov[it]*tPow10[it]; // собираем число из разрядов
}
if (type_counter=='G') eeprom_write_block(&TEK_data,&TEK_pokazania_GWS,4);
else if (type_counter=='H') eeprom_write_block(&TEK_data,&TEK_pokazania_HWS,4);
}
void read_TEKdata_setup_eeprom(char type_counter)
{
TEK_data=0;
if (type_counter=='G') eeprom_read_block(&TEK_data,&TEK_pokazania_GWS,4);
else if (type_counter=='H') eeprom_read_block(&TEK_data,&TEK_pokazania_HWS,4);
uint8_t it=0;
unsigned long tek_TEMP=TEK_data;
for(it=0;it<7;it++)
{
masiv_razryadov[it]=tek_TEMP/tPow10[it]; //разбиваем число на разряды
tek_TEMP%=tPow10[it];
}
}
static uint8_t flag =0;
void steep_function_TEK (uint8_t i)
{
write_command(0x80|(cursor_address));
char massiv1[7]={0};
sprintf(massiv1,"%d",setup_buffer[i]);
print_LCD(massiv1);
write_command(0x80|cursor_address);
}
int setup_TEKpokazania(char type_counter)
{
char GWSstring[13]={"GWS: counter"}; // шапка
char HWSstring[13]={"HWS: counter"}; // шапка
if(!flag)
{
read_TEKdata_setup_eeprom(type_counter);
cursor_address=0x44;
memcpy(setup_buffer,masiv_razryadov,7);
write_command(clear_display); // очищаем дисплей
write_command(0x80|0x02);
if(type_counter=='G') print_LCD(GWSstring); // печатаем шапку
if(type_counter=='H') print_LCD(HWSstring);
write_command(0x80|cursor_address);
char massiv1[15]={0};
sprintf(massiv1,"%d%d%d%d%d%d%d%c",setup_buffer[0],setup_buffer[1],setup_buffer[2],setup_buffer[3],setup_buffer[4],setup_buffer[5],setup_buffer[6],'l');
print_LCD(massiv1); // пишем данные
cursor_address=0x44; // адресс курсора на позиция для мигания
write_command(0x80|cursor_address); // устанвливаем курсор
flag=1;
write_command(0x0f); // включаем курсор мигающий
return 0;
}
write_command(0x0f); // включаем курсор мигающий
static uint8_t steep_TEK = 1;
switch(KeyCode)
{
cursor_address=0x44;
case Enter:
if(steep_TEK<0x07)
{
if(steep_TEK<0x07)
{
write_command(0x80|(cursor_address+=0x01));
}
i++;
steep_TEK++;
}
else
{
memcpy(masiv_razryadov,setup_buffer,8);
write_TEKdata_setup_eeprom(type_counter);
i=0;
steep_TEK = 1;
write_command(clear_display); // очищаем дисплей
write_command(0x80|0x02); //
write_command(0xC);
char massiv[15]={"SET count OK"};
print_LCD(massiv);
_delay_ms(2000);
flag=0; Level=3; PtrPunkt=Ptr_config_function->Ptr5; (*PtrPunkt)();cursor_address=0x42; break;
}
break;
case UP: if ((setup_buffer[i]++)<9) {steep_function_TEK(i); break;}
if ((setup_buffer[i]++)>9) {setup_buffer[i]=0; steep_function_TEK(i); break;}
break;
case DN: if ((setup_buffer[i]--)>0) {steep_function_TEK(i); break;}
if ((setup_buffer[i]--)>9) {setup_buffer[i]=9; steep_function_TEK(i); break;}
break;
case Cancel: flag=0; Level=3; write_command(0xC);PtrPunkt=Ptr_config_function->Ptr5; steep_TEK = 1; cursor_address=0x42; (*PtrPunkt)();break;
}
return 0;
}
Вт июл 23, 2019 02:04:02
char massiv1[15]={0};
sprintf(massiv1,"%d%d%d%d%d%d%d%c",setup_buffer[0],setup_buffer[1],setup_buffer[2],setup_buffer[3],setup_buffer[4],setup_buffer[5],setup_buffer[6],'l');
Вт июл 23, 2019 09:16:19
uint8_t replaceDigit(uint32_t& value, uint8_t idx, uint8_t upDown)
{
static const uint32_t tbl[] = { 1, 10, 100, 1000, 10'000, 100'000, 1'000'000, 10'000'000 };
uint32_t pval = tbl[idx];
uint8_t digit = value / pval % 10;
if (upDown == 1 && digit < 9) value += pval, digit++;
if (upDown == 0 && digit > 0) value -= pval, digit--;
return digit;
}
TEK_data=0;
for(uint8_t it=0;it<7;it++)
{
TEK_data+=masiv_razryadov[it]*tPow10[it]; // собираем число из разрядов
}
uint8_t it=0;
unsigned long tek_TEMP=TEK_data;
for(it=0;it<7;it++)
{
masiv_razryadov[it]=tek_TEMP/tPow10[it]; //разбиваем число на разряды
tek_TEMP%=tPow10[it];
}
Вт июл 23, 2019 10:54:20
Вт июл 23, 2019 11:02:28
это вот вообще никак не сязано с тем, как лучше редактировать строку поскольку при посимвольной правке всегда известно, какой именно символ изменился, и можно выводить только его - это дело чисто вкуса и "экономии" ресурсов, до исчерпания которых вряд ли кто добирался хоть раз.jcxz писал(а):можно отправлять в LCD только изменяемый прямоугольный регион пикселов. Что будет намного быстрее и экономнее по ресурсам
теперь я понимаю, окуда берутся гении разработки интерфейсов вы всерьез считаете, что может существовать необходимость менять разряд, допустим, 100 раз в секунду, в то время как показывать человеку 3 раза в секунду?jcxz писал(а):Так как отображение - не имеет смысла делать чаще, чем человек может увидеть, а изменение (редактирование) - должно происходить по некоторым событиям (нажатиям кнопок, переключениям энкодера и т.п.) совсем никак не связанным с процессом отображения.
Вт июл 23, 2019 11:16:30
А ведь именно так и есть. Например, счётчик каких-то прерываний, происходящих, скажем, 100 раз в секунду. В прерывании просто берём то самое число (одно!) и инкрементируем (ну, или добавляем +10 или +100 - не важно). И нет необходимости тут же его раскладывать на символы. Это проще сделать именно тогда когда придёт время отображать.ARV писал(а):вы всерьез считаете, что может существовать необходимость менять разряд, допустим, 100 раз в секунду, в то время как показывать человеку 3 раза в секунду?
Вт июл 23, 2019 12:04:32
Вт июл 23, 2019 12:53:36
совсем не так есть. вы перепутали интерфейс человек-МК с интерфейсом МК-периферия. когда человек воздействует на число (а именно этот момент тут рассматривается) нет необходимости изменять число чаще, чем отображать. в случае, когда число изменяется "само по себе" данная проблема вообще не возникает, ибо все изменения делаются стандартными элементарными арифметическими операторами Си без дележа на разряды и т.п.WiseLord писал(а):А ведь именно так и есть.
что процесс/участок другой - разве кто спорил? речь о том, что только после каждого изменения числа надо уведомить тот другой участок о необходимости отобразить число. не чаще и не реже - ровно на каждое изменение. можно и чаще, можно и реже - но не нужно.jcxz писал(а):А вывод на LCD - это совсем другой процесс, и совсем другой драйвер/участок кода
может и не нужно, но пока что все реализации в данной теме (последние страницы) без этого не обходятся. хотя можно и многоэтажным if-ом обойтись - было бы желаниеjcxz писал(а):преобразования числа в строку деление вообще не нужно