【问题标题】:Converting Decimal to Binary on the Microbit在 Microbit 上将十进制转换为二进制
【发布时间】:2026-02-20 00:15:02
【问题描述】:

我认为将我的 BBC Microbit 变成一个数字时钟——特别是二进制数字时钟是一个有趣的想法。为此,我在 Python 中编写了一些代码:

from microbit import *

def makeBinary(intValue,padding):
    number = intValue
    returnValue = ""
    brightness = 4 #value 0 to 8
    while number > 0:
        bit = number % 2
        if bit > 0:
            bit = brightness
        quotient = number / 2
        returnValue = str(bit)+returnValue
        number = quotient
    for i in range(len(returnValue),padding):
        returnValue = "0"+returnValue
    return returnValue

timeAdvance = 0
minuteAdvance = 0
hourAdvance = 0
secondCounter = 0
while True:
    if button_a.was_pressed():
        #advance hours
        hourAdvance = hourAdvance + 1
        if hourAdvance > 23:
            hourAdvance = 0
        timeAdvance = (hourAdvance*60*60*1000)+(minuteAdvance*60*1000)
    elif button_b.was_pressed():
        #advance minutes
        minuteAdvance = minuteAdvance + 1
        if minuteAdvance > 59:
            minuteAdvance = 0
        timeAdvance = (hourAdvance*60*60*1000)+(minuteAdvance*60*1000)
    else:
        #calculate and display time
        if (running_time()-secondCounter) > 1000:
            secondCounter = running_time()
            seconds = (running_time()/1000)%60
            minutes = ((running_time()+timeAdvance)/1000/60)%60
            hours = ((running_time()+timeAdvance)/1000/60/60)%24
            pmString = "0"
            addthirtyMString = "00000"
            addthirtySString = "00000"
            if hours>12:
                pmString = "9"
                hours = hours - 12
            if minutes>29:
                addthirtyMString = "00900"
                minutes = minutes - 30
            if seconds>29:
                addthirtySString = "00900"
                seconds = seconds - 30
            hourString = makeBinary(hours,4)
            minuteString = makeBinary(minutes,5)
            secondString = makeBinary(seconds,5)
            time = Image(pmString+hourString+":"+minuteString+":"+addthirtyMString+":"+secondString+":"+addthirtySString)
            display.show(time)

问题是它不起作用!在 Microbit 上运行它会导致二进制字段全部返回 1,除非数字为 0。因此 10:48:01AM (错误地)显示为

 ****
*****

*****

应该显示为

 * * 
*  * 
  *  
    *

鉴于上午 / 下午 LED 和加 30 秒 / 加 30 分钟标记工作正常,这显然只是格式化十进制数的二进制表示的问题(makeBinary 函数)。我最初尝试使用“格式”来执行此操作 - 但 microPython,至少在 microBit 上,显然不喜欢它。

当我在“真实”计算机上运行 makeBinary 时,它运行良好。有谁知道这里可能有什么问题?或者对其他将十进制转换为二进制字符串而不使用任何可能混淆 MicroBit 的函数的简单方法有什么建议?

【问题讨论】:

    标签: python-3.x micropython bbc-microbit


    【解决方案1】:

    microbit 使用 python 3 for micropython。这意味着两个整数相除通常会返回一个浮点值,而不是整数。如果您明确想要整数除法,您应该使用//(这也适用于 Python 2。)总结一下:

              Py 2          Py 3 and microbit
    35 / 10     3                3.5
    35 // 10    3                3
    35.0 / 10   3.5              3.5
    

    由于 hours 以浮点数形式出现,因此会混淆 make_binary() 函数,该函数需要一个 int。

            quotient = number // 2
    

    [...]

            seconds = (running_time()//1000)%60
            minutes = ((running_time()+timeAdvance)//60000)%60
            hours = ((running_time()+timeAdvance)//3600000)%24
    

    应该解决除法的第一个问题。

    如果您在计算机上安装和使用 python 3,您可能会发现它更容易调试。

    现在,python 已经有了一个bin() 函数,它接受一个整数并以字符串形式返回一个二进制表达式

    >>> bin(58)
    '0b111010'
    

    您的代码应该使用它而不是自己编写。

    【讨论】:

    • 感谢 James - 您的整数/浮点数答案完全符合要求!事实上,我试过 bin - 但是 Microbit 在修剪 0b 和填充到所需长度时抛出了一个摇摆器(也许也是由于我自己对 Python 3 中的格式的误解?)不管!现在一切正常。
    最近更新 更多