在 Microbit 上将十进制转换为二进制
Converting Decimal to Binary on the Microbit
我认为将我的 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(错误地)显示为
****
*****
*****
应该显示为
* *
* *
*
*
鉴于 am/pm 指示灯和添加 30 秒/添加 30 分钟标记工作正常,这显然只是格式化十进制数的二进制表示的问题(makeBinary
功能)。我最初尝试使用 'format' 来执行此操作 - 但 microPython,至少在 microBit 上,显然不喜欢它。
当我在 'real' 计算机上 运行 makeBinary
时,它工作正常。有谁知道这里可能出了什么问题?或者对其他将十进制转换为二进制字符串的简单方法的任何建议,而不使用任何可能混淆 MicroBit 的函数?
microbit使用python3 for micropython。这意味着两个整数的除法通常 return 一个浮点值,而不是一个整数。如果你明确想要整数除法,你应该使用 //
(这也适用于 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 以浮点形式出现,它混淆了需要 int 的 make_binary()
函数。
quotient = number // 2
[...]
seconds = (running_time()//1000)%60
minutes = ((running_time()+timeAdvance)//60000)%60
hours = ((running_time()+timeAdvance)//3600000)%24
应该解决除法的第一个问题。
如果您在计算机上安装和使用 python 3,您可能会发现它更容易调试。
现在,python 已经有一个 bin()
函数,它接受一个整数和 return 一个二进制表达式作为字符串
>>> bin(58)
'0b111010'
并且您的代码应该使用它而不是自己编写。
我认为将我的 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(错误地)显示为
****
*****
*****
应该显示为
* *
* *
*
*
鉴于 am/pm 指示灯和添加 30 秒/添加 30 分钟标记工作正常,这显然只是格式化十进制数的二进制表示的问题(makeBinary
功能)。我最初尝试使用 'format' 来执行此操作 - 但 microPython,至少在 microBit 上,显然不喜欢它。
当我在 'real' 计算机上 运行 makeBinary
时,它工作正常。有谁知道这里可能出了什么问题?或者对其他将十进制转换为二进制字符串的简单方法的任何建议,而不使用任何可能混淆 MicroBit 的函数?
microbit使用python3 for micropython。这意味着两个整数的除法通常 return 一个浮点值,而不是一个整数。如果你明确想要整数除法,你应该使用 //
(这也适用于 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 以浮点形式出现,它混淆了需要 int 的 make_binary()
函数。
quotient = number // 2
[...]
seconds = (running_time()//1000)%60
minutes = ((running_time()+timeAdvance)//60000)%60
hours = ((running_time()+timeAdvance)//3600000)%24
应该解决除法的第一个问题。
如果您在计算机上安装和使用 python 3,您可能会发现它更容易调试。
现在,python 已经有一个 bin()
函数,它接受一个整数和 return 一个二进制表达式作为字符串
>>> bin(58)
'0b111010'
并且您的代码应该使用它而不是自己编写。