海纳百客

海纳百客

micro:bit 编程模拟时钟表盘

吃瓜阿阳

友情提示点击顶部放大镜 可以使用站内搜索 记住我们的地址 www.hainabaike.com

使用 micro:bit 的屏幕显示模拟时钟,利用亮度表示秒。这里提供两种实现方式,分别是 MicroPython 和 MakeCode 图形化编程。效果如下。

MicroPython 实现代码如下。

from microbit import *

DS1302_REG_SECOND = (0x80)
DS1302_REG_MINUTE = (0x82)
DS1302_REG_HOUR   = (0x84)
DS1302_REG_DAY    = (0x86)
DS1302_REG_MONTH  = (0x88)
DS1302_REG_WEEKDAY= (0x8A)
DS1302_REG_YEAR   = (0x8C)
DS1302_REG_WP     = (0x8E)
DS1302_REG_CTRL   = (0x90)
DS1302_REG_RAM    = (0xC0)

class DS1302:
    def __init__(self, clk, dio, cs):
        self.clk = clk
        self.dio = dio
        self.cs  = cs

    def DecToHex(self, dat):
        return (dat//10) * 16 + (dat%10)

    def HexToDec(self, dat):
        return (dat//16) * 10 + (dat%16)

    def write_byte(self, dat):
        for i in range(8):
            self.dio.write_digital((dat >> i) & 1)
            self.clk.write_digital(1)
            self.clk.write_digital(0)

    def read_byte(self):
        d = 0
        for i in range(8):
            d = d | (self.dio.read_digital()<<i)
            self.clk.write_digital(1)
            self.clk.write_digital(0)
        return d

    def getReg(self, reg):
        self.cs.write_digital(1)
        self.write_byte(reg)
        t = self.read_byte()
        self.cs.write_digital(0)
        return t

    def setReg(self, reg, dat):
        self.cs.write_digital(1)
        self.write_byte(reg)
        self.write_byte(dat)
        self.cs.write_digital(0)

    def wr(self, reg, dat):
        self.setReg(DS1302_REG_WP, 0)
        self.setReg(reg, dat)
        self.setReg(DS1302_REG_WP, 0x80)
                
    def start(self):
        t = self.getReg(DS1302_REG_SECOND + 1)
        self.wr(DS1302_REG_SECOND, t & 0x7f)

    def stop(self):
        t = self.getReg(DS1302_REG_SECOND + 1)
        self.wr(DS1302_REG_SECOND, t | 0x80)
        
    def Second(self, second = None):
        if second == None:
            return self.HexToDec(self.getReg(DS1302_REG_SECOND+1))%60
        else:
            self.wr(DS1302_REG_SECOND, self.DecToHex(second%60))

    def Minute(self, minute = None):
        if minute == None:
            return self.HexToDec(self.getReg(DS1302_REG_MINUTE+1))
        else:
            self.wr(DS1302_REG_MINUTE, self.DecToHex(minute%60))

    def Hour(self, hour = None):
        if hour == None:
            return self.HexToDec(self.getReg(DS1302_REG_HOUR+1))
        else:
            self.wr(DS1302_REG_HOUR, self.DecToHex(hour%24))

    def Weekday(self, weekday = None):
        if weekday == None:
            return self.HexToDec(self.getReg(DS1302_REG_WEEKDAY+1))
        else:
            self.wr(DS1302_REG_WEEKDAY, self.DecToHex(weekday%8))

    def Day(self, day = None):
        if day == None:
            return self.HexToDec(self.getReg(DS1302_REG_DAY+1))
        else:
            self.wr(DS1302_REG_DAY, self.DecToHex(day%32))

    def Month(self, month = None):
        if month == None:
            return self.HexToDec(self.getReg(DS1302_REG_MONTH+1))
        else:
            self.wr(DS1302_REG_MONTH, self.DecToHex(month%13))

    def Year(self, year = None):
        if year == None:
            return self.HexToDec(self.getReg(DS1302_REG_YEAR+1)) + 2000
        else:
            self.wr(DS1302_REG_YEAR, self.DecToHex(year%100))

mx=(2,3,4,4,4,3,2,1,0,0,0,1)
my=(0,0,1,2,3,4,4,4,3,2,1,0)

ds=DS1302(clk=pin13,dio=pin14,cs=pin15)
old = -1
while 1:
    s = ds.Second()
    if old != s:
        old = s
        m=ds.Minute()
        a=s//5
        b=s%5
        if b==4:
            display.set_pixel(mx[a],my[a],0)
        else:
            display.set_pixel(mx[a],my[a],b*3)
        if s%2:
            display.set_pixel(2, 2, 5)
        else:
            display.set_pixel(2, 2, 0)
    sleep(200)

MakeCode 程序如下。

via

    标签:

    发布评论 条评论)

    评论列表