立即注册

扫一扫,访问微社区

micropython-microbit 中文社区

查看: 47|回复: 2

新作DL1414数字钟 -- [更新中]

[复制链接]

该用户从未签到

发表于 5 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 swanduron 于 2018-4-18 21:48 编辑

----------------------------------2018年4月15日更新--------------------------------------------

其实我是一个网工,没错,就是那种联通拉线的(笑),但是一直对嵌入式开发很有兴趣。早些时候研究过python编程的操作,现在有了micropython,自然也不肯放过。

DL1414是我非常喜欢的一种显示器件,字体复古,寿命极长,只有红色,多为HP或者西门子生产,97~99年产品居多。目前淘宝价格一般都在4~5RMB之间。在一些很古老的仪器和设备上能看到它的踪影。

DL1414

DL1414


自从学会了用Micropython驱动HC595,就一直非常期待完成这样一款作品。试过不少micropython开发板,从ESP8266到PYB,一直到Pyb Nano,终于实现了。

本制作的项目约束

  • 制作一款带有温度、湿度测量的数字时钟
  • 带有高精度掉电时钟
  • 基于GPS对时,不设时钟调整功能
  • 带有一些动画效果

----------------------------------2018年4月18日更新--------------------------------------------

实在是太忙了,PMP考试真的比妹纸还厉害,榨干你分分钟的。

第一个要解决的问题,是DL1414的驱动和显示的清单。DL1414的说明书,网上很容易找到。我从中节选两个最重要的部分,列在下面

1.png 2.png

从图中可以看到,A0和A1选择4位数字的显示,WR片选是低电平有效,A0~A6是数字输入端。所以,实际的驱动策略,我的选择是先选字,再选准输入的字符,最后拉低WR,再拉高WR,完成一次写字操作。

既定了本次制作,只使用24个字符显示信息,所以就使用6块DL1414,两片595串联,第一片是选字,第二片是选片。

3.png


这里附上我595驱动部分的代码块,大家可以看看。写的比较笨拙,单是在本文结束的时候,一定会把所有文件和设计图分享上来。这段代码的特殊之处在于bytes函数的使用。这个函数在标准python里面极少使用。这个函数的作用,是通过十进制整数产生一个字节串,举个例子,bytes((1,)),会产生一个0x01出来,这样直接通过spi总线写出去,就可以直接驱动595了。这一块我啃了好久。

  1.     def display_writer(self, content=''):
  2.         content = self.content_role(content)
  3.         if self.display_buffer == content:  # 如果新来的字符串和上次显示的一样,就直接结束函数,避免浪费时间
  4.             return None
  5.         else:
  6.             self.display_buffer = content
  7.         working_content = []  #working_content用以产生一系列的元组,每个元组的结构为(字符,DL1414片号,字符位置)
  8.         for word_id in range(len(content)):
  9.             cal_id = word_id + 1
  10.             display_id_raw = cal_id // 4
  11.             char_id = cal_id % 4
  12.             if char_id > 0:
  13.                 display_id = display_id_raw + 1
  14.             else:
  15.                 display_id = display_id_raw
  16.             if char_id == 0:
  17.                 char_id = 4
  18.             working_content.append((content[word_id], 255 - (2 ** (display_id - 1)), char_id))

  19.         for each_char in working_content:
  20.             self.spi.write(b'\xff\x00')  # 拉高片选使得所有1414不可操作,避免之前数据的干扰
  21.             self.rclk.value(1)
  22.             self.rclk.value(0)
  23.             self.spi.write(bytes([each_char[1], ord(each_char[0])]))  # 片选+目标字  #产生字节串,并写入SPI总线
  24.             digit0_value, digit1_value = self.char_mapping[each_char[2]]
  25.             self.digit0.value(digit0_value)
  26.             self.digit1.value(digit1_value)
  27.             self.rclk.value(1)
  28.             self.rclk.value(0)
复制代码




手机扫码浏览
回复

使用道具 举报

  • TA的每日心情
    开心
    2018-3-31 23:28
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 4 天前 | 显示全部楼层
    期待更新
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-11-23 19:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 4 天前 | 显示全部楼层
    Me Too,
    回复

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|micropython-microbit 中文社区 ( 鄂ICP备17012469号 )

    GMT+8, 2018-4-20 14:58 , Processed in 0.126436 second(s), 22 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表