Вт фев 13, 2024 21:00:16
Вт фев 13, 2024 21:01:04
Вт фев 13, 2024 21:44:44
Ср фев 14, 2024 11:22:37
Ср фев 14, 2024 15:28:21
Ср фев 14, 2024 15:46:35
Бессмысленное утверждение
это пустой трёп.
Ср фев 14, 2024 17:30:52
Ср фев 14, 2024 17:54:25
Ср фев 14, 2024 18:32:56
Ср фев 14, 2024 20:42:37
12345 % 1000 /100 = 345 / 100 = 3
12345 / 100 % 10 = 123 % 10 = 3
PORTD = ~((SEGMENTE[display % 1000/100]));
PORTD = ~(SEGMENTE[display % 100/10]);
PORTD = ~(SEGMENTE[display % 10]);
PORTD = ~(SEGMENTE[display % 10]); # разряд единиц
display /= 10;
PORTD = ~(SEGMENTE[display % 10]); # разряд десятков
display /= 10;
PORTD = ~(SEGMENTE[display % 10]); # разряд сотен
display /= 10;
PORTD = ~(SEGMENTE[display % 10]); # разряд тысяч
Ср фев 14, 2024 21:03:04
PORTD = ~(SEGMENTE[display % 10]); # разряд единиц
display /= 10;
PORTD = ~(SEGMENTE[display % 10]); # разряд десятков
display /= 10;
PORTD = ~(SEGMENTE[display % 10]); # разряд сотен
display /= 10;
PORTD = ~(SEGMENTE[display % 10]); # разряд тысяч
uint i0 = display / 10;
uint digit0 = display - i0 * 10;
uint i1 = i0 / 10;
uint digit1 = i0 - i1 * 10;
...
Чт фев 15, 2024 00:31:25
Потому что это:jcxz писал(а):Зачем для каждого разряда 2 деления? Деление - плохая операция. Даже на тех МК, где она аппаратно есть, выполняется очень медленно.
// Например, num = 234
// Написано программистом
digit = num % 10 # digit = 234 % 10 = 4
num /=10 # num = 234 / 10 = 23
// Оптимизировано компилятором
tmp = (num * 205) << 11; # tmp = (234 * 205) << 11 = 47970 << 11 = 23
digit = num - tpm * 10; # digit = 234 - 23 * 10 = 234 - 230 = 4
num = tmp; # num = 23
for (i = 0; i < DIGITS; i++) {
if (number == 0 && i > dot)
break;
ind[i] = num[number % 10];
number /= 10;
}
for (i = 0; i < DIGITS; i++) {
if (number == 0 && i > dot)
break;
uint16_t i10 = number / 10;
ind[i] = num[number - i10 * 10];
number = i10;
}
Чт фев 15, 2024 01:36:36
Чт фев 15, 2024 07:14:33
Пт фев 16, 2024 16:46:22
for (i = 0; i < DIGITS; i++) {
if (number == 0 && i > dot)
break;
ind[i] = num[number % 10];
number /= 10;
}
for (i = 0; i < DIGITS; i++) {
if (number == 0 && i > dot)
break;
uint16_t i10 = number / 10;
ind[i] = num[number - i10 * 10];
number = i10;
}
enum {DIGITS = 6};
static u8 ind[DIGITS];
static u8 const num[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
#if 0
void f1(uint number, uint dot)
{
for (uint i = 0; i < DIGITS; i++) {
if (number == 0 && i > dot) break;
ind[i] = num[number % 10];
number /= 10;
}
}
#else
void f2(uint number, uint dot)
{
for (uint i = 0; i < DIGITS; i++) {
if (number == 0 && i > dot) break;
uint i10 = number / 10;
ind[i] = num[number - i10 * 10];
number = i10;
}
}
#endif
void f1(uint number, uint dot)
{
for (uint i = 0; i < DIGITS; i++) {
_Z2f1jj: (+1)
00000000 0x2200 MOVS R2,#+0
00000002 0x230A MOVS R3,#+10
if (number == 0 && i > dot) break;
??f1_0: (+1)
00000004 0xB908 CBNZ.N R0,??f1_1
00000006 0x4291 CMP R1,R2
00000008 0xD304 BCC.N ??f1_2
ind[i] = num[number % 10];
number /= 10;
}
??f1_1: (+1)
0000000A 0x1C52 ADDS R2,R2,#+1
0000000C 0x2A06 CMP R2,#+6
0000000E 0xFBB0 0xF0F3 UDIV R0,R0,R3
00000012 0xD3F7 BCC.N ??f1_0
}
??f1_2: (+1)
00000014 0x4770 BX LR ;; return
void f2(uint number, uint dot)
{
for (uint i = 0; i < DIGITS; i++) {
_Z2f2jj: (+1)
00000000 0x2200 MOVS R2,#+0
00000002 0x230A MOVS R3,#+10
if (number == 0 && i > dot) break;
??f2_0: (+1)
00000004 0xB908 CBNZ.N R0,??f2_1
00000006 0x4291 CMP R1,R2
00000008 0xD304 BCC.N ??f2_2
uint i10 = number / 10;
ind[i] = num[number - i10 * 10];
number = i10;
}
??f2_1: (+1)
0000000A 0x1C52 ADDS R2,R2,#+1
0000000C 0x2A06 CMP R2,#+6
0000000E 0xFBB0 0xF0F3 UDIV R0,R0,R3
00000012 0xD3F7 BCC.N ??f2_0
}
??f2_2: (+1)
00000014 0x4770 BX LR ;; return
Пт фев 16, 2024 17:54:55
void Num2Segs(std::unsigned_integral auto number)
{
for(auto i=DIGITS; i; )
{
if(number || i==DIGITS)
{
auto dv = div(number,10);
ind[--i] = Dig2Seg[dv.rem];
number = dv.quot;
}
else ind[--i] = 0;
}
}
void Num2Segs(std::signed_integral auto number)
{
for(auto &x : ind) x=0;
bool neg = number<0;
auto tmp = neg ? -number : number;
for(auto i=DIGITS; i>(neg?1:0); )
{
if(tmp || i==DIGITS)
{
auto dv = div(tmp,10);
tmp = dv.quot;
ind[--i] = Dig2Seg[dv.rem];
if(neg && (tmp==0 || i==1))
{
ind[--i]= Dig2Seg[10]; // минус
break;
}
}
else --i;
}
}
Пт фев 16, 2024 18:11:59
Пт фев 16, 2024 18:17:51
Сб фев 17, 2024 18:52:54
Нет, конечно. Это целиком весь проект часов https://github.com/WiseLord/clock7segmjcxz писал(а):Почти 1.5 КБ на таком простейшем коде??? Серьёзно???
Вс фев 18, 2024 11:33:15