我使用的是MSP430F427 MCU,我有下面的代码来提取个位(d5)、十位(d4)和百位(d3)。我期望一个 4 位数字的值,例如 1000+,但必须仅显示 3 位数字(百位、十位、个位)。即 count = 1783,我必须只显示 783。下面的代码已经可以工作了。
但是,在编译过程中,会出现警告,要求在执行此操作时不要进行除法和模运算,因为这非常耗电。 (描述资源路径位置 (ULP 5.1) 检测到模运算。建议在运行时将它们移至 RAM 或不使用,因为这些是处理/功耗密集型)
void updateDisplay(signed long counter_value) {
if (count<0)
{
NEG_ON;
}
else
{
NEG_OFF;
}
D3_NULL;
D4_NULL;
D5_NULL;
// Ensure that counter_value is positive or zero for further processing
counter_value = abs(counter_value);
// Display the appropriate digit on the LCD based on the count value
uint8_t d3= (counter_value/100)%10;
uint8_t d4= (counter_value/10)%10;
uint8_t d5= counter_value%10;
if (d3 != 0)
{
switch (d3)
{
case 1: DIGIT3_DISP_1; break;
case 2: DIGIT3_DISP_2; break;
case 3: DIGIT3_DISP_3; break;
case 4: DIGIT3_DISP_4; break;
case 5: DIGIT3_DISP_5; break;
case 6: DIGIT3_DISP_6; break;
case 7: DIGIT3_DISP_7; break;
case 8: DIGIT3_DISP_8; break;
case 9: DIGIT3_DISP_9; break;
}
}
else
{
DIGIT3_OFF;
}
if (d4 != 0 || d3 != 0)
{
switch (d4)
{
case 0: DIGIT4_DISP_0; break;
case 1: DIGIT4_DISP_1; break;
case 2: DIGIT4_DISP_2; break;
case 3: DIGIT4_DISP_3; break;
case 4: DIGIT4_DISP_4; break;
case 5: DIGIT4_DISP_5; break;
case 6: DIGIT4_DISP_6; break;
case 7: DIGIT4_DISP_7; break;
case 8: DIGIT4_DISP_8; break;
case 9: DIGIT4_DISP_9; break;
}
}
else if (d3 != 0)
{
DIGIT4_DISP_0;
}
switch (d5)
{
case 0: DIGIT5_DISP_0; break;
case 1: DIGIT5_DISP_1; break;
case 2: DIGIT5_DISP_2; break;
case 3: DIGIT5_DISP_3; break;
case 4: DIGIT5_DISP_4; break;
case 5: DIGIT5_DISP_5; break;
case 6: DIGIT5_DISP_6; break;
case 7: DIGIT5_DISP_7; break;
case 8: DIGIT5_DISP_8; break;
case 9: DIGIT5_DISP_9; break;
}
}
我想学习如何将单个数字保存到变量中。即数 674,因此 d3 = 6,d4 = 7,d5 = 4。这就是我认为我应该做的。然而,我在实现位移位和按位操作来更改代码方面有点迟缓。任何帮助将不胜感激。
鉴于:
unsigned divu10( unsigned n)
{
unsigned q, r;
q = (n >> 1) + (n >> 2);
q = q + (q >> 4);
q = q + (q >> 8);
q = q + (q >> 16);
q = q >> 3;
r = n - (((q << 2) + q) << 1);
return q + (r > 9);
}
(来自 使用位移位除以 10?)
然后:
uint8_t* toBCD( unsigned value, uint8_t* bcd, size_t digits )
{
for( size_t i = digits - 1;
i >= 0 && value != 0;
i-- )
{
unsigned a = divu10( value ) ;
bcd[i] = u - a * 10 ;
value = a ;
}
return bcd ;
}
您可以按如下方式获取 BCD 值的最低有效三位数字:
uint8_t bcd[3] = {0} ;
toBCD( abs(counter_value), bcd, sizeof(bcd) ) ;
然后(如果你真的必须的话):
uint8_t d3= bcd[0] ;
uint8_t d4= bcd[1] ;
uint8_t d5= bcd[2] ;
但这确实比直接使用
bcd
数字没有特别的好处,例如:
switch( bcd[0] )
...