数码管简介
数码管是一种半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数码管多一个用于显示小数点的发光二极管单元DP(decimal point)。
它价格便宜、使用简单,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示 时间、日期、温度等所有可用数字表示的参数的器件。在电器特别是家电领域应用极为广泛,如显示屏、空调、热水器、冰箱等等。
绘制七段数码管
需求如下:
使用Python的turtle图形库完成数码管的绘制,数码管以如下两种形式显示系统当前日期:
样式1:
样式2:
分析:
第一次接触数码管是在单片机的课程中,当时是使用51单片机编程对其进行编程控制,最后的课程项目也使用到了数码管显示时间及温度。
数码管的控制主要是对数码管每段的控制,对应到硬件上就是每个引脚的电平的控制;而本题是使用图形界面绘制数码管,核心仍然是数码管每一段的控制,需要注意的就是每个数码管中每段数码管绘制规律的一致性,这样有利于提取出绘制函数,节省代码量及思考容量。
下面的代码中的drawDigit(number)为主要函数,作用是绘制显示值为number的数码管。此处定义的绘制规律为:
以数字8中间的横为起点,从左向右写横,此为第一步;此后顺时针完成剩下六段的绘制。
若以上描述无法理解,请运行代码,将速度调慢,让画笔出现,便可方便的观察到代码的控制逻辑。
清楚了这一点之后,下面代码就很容易明白了。
样式1 的实现:
#使用turtle库绘制七段数码管样式的系统当前日期
import turtle, datetime
def drawLine(draw): #绘制数码管的每一段
if(draw):
turtle.down()
else:
turtle.up()
turtle.fd(40)
turtle.right(90)
def drawDigit(i): #绘制数码管的每个数字
if i in [2,3,4,5,6,8,9]:
drawLine(True)
else:
drawLine(False)
if i in [0,1,3,4,5,6,7,8,9]:
drawLine(True)
else:
drawLine(False)
if i in [0,2,3,5,6,8]:
drawLine(True)
else:
drawLine(False)
if i in [0,2,6,8]:
drawLine(True)
else:
drawLine(False)
turtle.left(90)
if i in [0,4,5,6,8,9]:
drawLine(True)
else:
drawLine(False)
if i in [0,2,3,5,6,7,8,9]:
drawLine(True)
else:
drawLine(False)
if i in [0,1,2,3,4,7,8,9]:
drawLine(True)
else:
drawLine(False)
turtle.right(180)
turtle.penup()
turtle.fd(20)
def drawData(time): #绘制日期
for i in time:
drawDigit(eval(i))
def main():
turtle.setup(800,350,200,200)
turtle.speed(100)
turtle.pensize(5)
turtle.penup()
turtle.fd(-300)
turtle.hideturtle()
drawData(datetime.datetime.now().strftime('%Y%m%d'))
turtle.mainloop()
main()
样式2的实现:
样式2只需要注意汉字的输出即可。
#使用turtle库绘制七段数码管样式的系统当前日期
import turtle, datetime
def drawGap(): #绘制数码管间距
turtle.up()
turtle.fd(5)
def drawLine(draw): #绘制数码管的每一段
drawGap()
if(draw):
turtle.down()
else:
turtle.up()
turtle.fd(40)
drawGap()
turtle.right(90)
def drawDigit(i): #绘制数码管的每个数字
if i in [2,3,4,5,6,8,9]:
drawLine(True)
else:
drawLine(False)
if i in [0,1,3,4,5,6,7,8,9]:
drawLine(True)
else:
drawLine(False)
if i in [0,2,3,5,6,8]:
drawLine(True)
else:
drawLine(False)
if i in [0,2,6,8]:
drawLine(True)
else:
drawLine(False)
turtle.left(90)
if i in [0,4,5,6,8,9]:
drawLine(True)
else:
drawLine(False)
if i in [0,2,3,5,6,7,8,9]:
drawLine(True)
else:
drawLine(False)
if i in [0,1,2,3,4,7,8,9]:
drawLine(True)
else:
drawLine(False)
turtle.right(180)
turtle.penup()
turtle.fd(20)
def drawData(time): #绘制日期
turtle.pencolor("red")
for i in time:
if i == '-':
turtle.write('年',font=("Arial", 18, "normal"))
turtle.fd(38)
turtle.pencolor("green")
elif i == '+':
turtle.write('月',font=("Arial", 18, "normal"))
turtle.pencolor("blue")
turtle.fd(38)
elif i == '=':
turtle.write('日',font=("Arial", 18, "normal"))
turtle.fd(38)
else:
drawDigit(eval(i))
def main():
turtle.setup(800,350,200,200)
turtle.speed(100)
turtle.pensize(5)
turtle.penup()
turtle.fd(-300)
turtle.hideturtle()
drawData(datetime.datetime.now().strftime('%Y-%m+%d='))
turtle.mainloop()
main()