BCD 数学例程而不是使用除法和取模(使用 MSP430F427 MCU)

问题描述 投票:0回答:1

我使用的是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。这就是我认为我应该做的。然而,我在实现位移位和按位操作来更改代码方面有点迟缓。任何帮助将不胜感激。

c embedded microcontroller msp430 bcd
1个回答
0
投票

鉴于:

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] )
    ...
© www.soinside.com 2019 - 2024. All rights reserved.