首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >十进制转换为BCD

十进制转换为BCD
EN

Stack Overflow用户
提问于 2016-02-12 18:57:45
回答 5查看 12.9K关注 0票数 0

我目前正在做一项任务,使用微控制器和电路来显示二进制数,通过LED显示。我必须使用三个按钮:一个用来增加,一个用来减少,最后一个用来重置。我的线路和配置都完成了。另一方面,我的代码有一些小故障,我不能只在我的腰带下用一个入门到C类来修复。我在使用代码编写器。第一个问题:我的计数器在“十”部分(MSB)不停止在9,而是开始显示二进制10-15。前四位是1(右),后四位是十(左) ex:1010 0001,但最大值是1001 1001。问题二:从零开始,如果我减值,计数器显示的是95而不是99。例句:从0000 0000开始,递减显示1001 0101。我尝试使用if语句来创建一个条件,如果大于10,MSB就停止,但是代码没有运行。我对代码所做的几乎任何修改都会阻止它正常工作。

代码语言:javascript
复制
#include <msp430.h>

unsigned int dec2bcd(unsigned int num);
void delay(void);

int main(void) {
WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer

P1DIR = 0xFF;
P2DIR = 0xF0;
unsigned int c;
unsigned int count = 0x00;

while(1){
    if((P2IN & BIT0) == BIT0){
        count++;
        c = dec2bcd(count);
    }

    else if((P2IN&BIT1) == BIT1){
        count--;
        c = dec2bcd(count);
    }

    else if((P2IN&BIT2) == BIT2){
        count = 0x00;
        c = dec2bcd(count);
    }

    delay();
    P1OUT = c;

}

}

unsigned int dec2bcd(unsigned int num)
{
    unsigned int ones = 0;
    unsigned int tens = 0;
    unsigned int temp = 0;

    ones = num%10;
    temp = num/10;
    tens = temp<<4;
    return (tens + ones);
}

void delay(void)
{
    volatile unsigned int i, j;
    for(i=10000; i>0; i--)
    {
        for(j=3; j>0; j--){
    }
}
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-02-12 20:33:37

你为什么看到95?

正如@Olaf所提到的,msp430使用16位整数。

当你做count = 0u -1时,数一数到65535

代码语言:javascript
复制
unsigned int dec2bcd(unsigned int num) // num is now 65535
{
    unsigned int ones = 0;
    unsigned int tens = 0;
    unsigned int temp = 0;

    ones = num%10; // 65535%10 = 5
    temp = num/10; // 65535/10 = 6553
    tens = temp<<4;  // what's displayed is by tens is actually the lower
                     // 4 bits of tens, so tens is 6553%16=9
    return (tens + ones);// so the result is 95
}

为什么tens可以超过10

同样的问题,因为您的输入大于99。

代码语言:javascript
复制
unsigned int dec2bcd(unsigned int num) // say num is now 100
{
    unsigned int ones = 0;
    unsigned int tens = 0;
    unsigned int temp = 0;

    ones = num%10; // 100%10 = 0
    temp = num/10; // 100/10 = 10, or 0x0A
    tens = temp<<4;  
    return (tens + ones);// so the result is A0
}

你该怎么做?

在您的代码中,将范围限制在0-99,您可以选择环绕(99+1=0,0-1=99)或饱和(99+1=99,0-1=0)。但是,您还需要自己编写它:C语言不提供它。

票数 1
EN

Stack Overflow用户

发布于 2016-02-12 19:30:15

我现在手头上还没有一条LED,但这显示了如何在十进制范围内工作,但只能在输出点进行转换。实际值保持在0..99范围内(注意当我递减时模数是如何实现的)。然后,将值拆分为BCD小块,并将它们合并以进行输出。

代码语言:javascript
复制
#include <stdio.h>

void display(int num, char *msg)
{
    int lsnib = num % 10;                        // decimal value of each nibble
    int msnib = num / 10;
    int ledpatt = (msnib << 4) + lsnib;          // recombine as BCD
    printf("%02X Expected %s\n", ledpatt, msg);
}

int main(void){
    int value;

    value = 42;
    display (value, "forty two");       // display 42

    value = 0;
    display (value, "zero");            // display 0

    value = 99;
    display (value, "ninety nine");     // display 99

    value = (value + 1) % 100;          // increment from 99
    display (value, "zero");            // should display 0

    value = (value -1 + 100) % 100;     // decrement from 0
    display (value, "ninety nine");     // should display 99

    return 0;
}

程序输出

代码语言:javascript
复制
42 Expected forty two
00 Expected zero
99 Expected ninety nine
00 Expected zero
99 Expected ninety nine
票数 1
EN

Stack Overflow用户

发布于 2016-02-12 19:11:46

是否有任何限制使用这个:

代码语言:javascript
复制
if((P2IN & BIT0) == BIT0){
    count++;
    if (count == 100)
        count = 0;
    c = dec2bcd(count);
}

else if((P2IN&BIT1) == BIT1){
    if (count == 0)
        count = 100;
    count--;
    c = dec2bcd(count);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35370200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档