【K210+micropython】使用HS420561k-32四位数码管显示数字
相关知识准备
一、四位数码管
四位数码管可分为:共阳和共阴两种。共阳极数码管是指数码管八段发光二极管的阳极(正极)都连在一起,而阴极对应的各段可分别控制;共阴极数码管是指数码管的八段发光二极管的阴极(负极)都连在一起,而阳极对应的各段分别控制。共阴级输入高电平有效,共阳级输入低电平有效。
四位数码管引脚定义如下图:
二、代码
1.驱动库
hs420561k32.py
import utime
from Maix import GPIO
from fpioa_manager import fm
number={
'0':
[0,0,0,0,0,0,1,1],#0
'1':
[1,1,1,1,0,0,1,1],#1
'2':
[0,0,1,0,0,1,0,1],#2
'3':
[0,0,0,0,1,1,0,1],#3
'4':
[1,0,0,1,1,0,0,1],#4
'5':
[0,1,0,0,1,0,0,1],#5
'6':
[0,1,0,0,0,0,0,1],#6
'7':
[0,0,0,1,1,1,1,1],#7
'8':
[0,0,0,0,0,0,0,1],#8
'9':
[0,0,0,0,1,0,0,1],#9
}
class HS420561K32:
def __init__(self,pins):
# 注册引脚
fm.register(pins[0],fm.fpioa.GPIOHS0) # a
fm.register(pins[1],fm.fpioa.GPIOHS1) # b
fm.register(pins[2],fm.fpioa.GPIOHS2) # c
fm.register(pins[3],fm.fpioa.GPIOHS3) # d
fm.register(pins[4],fm.fpioa.GPIOHS4) # e
fm.register(pins[5],fm.fpioa.GPIOHS5) # f
fm.register(pins[6],fm.fpioa.GPIOHS6) # g
fm.register(pins[7],fm.fpioa.GPIOHS7) # dp
fm.register(pins[8],fm.fpioa.GPIOHS8) # 1
fm.register(pins[9],fm.fpioa.GPIOHS9) # 2
fm.register(pins[10],fm.fpioa.GPIOHS10) # 3
fm.register(pins[11],fm.fpioa.GPIOHS11) # 4
d1 = GPIO(GPIO.GPIOHS0,GPIO.OUT)
d2 = GPIO(GPIO.GPIOHS1,GPIO.OUT)
d3 = GPIO(GPIO.GPIOHS2,GPIO.OUT)
d4 = GPIO(GPIO.GPIOHS3,GPIO.OUT)
d5 = GPIO(GPIO.GPIOHS4,GPIO.OUT)
d6 = GPIO(GPIO.GPIOHS5,GPIO.OUT)
d7 = GPIO(GPIO.GPIOHS6,GPIO.OUT)
d8 = GPIO(GPIO.GPIOHS7,GPIO.OUT)
d9 = GPIO(GPIO.GPIOHS8,GPIO.OUT)
d10= GPIO(GPIO.GPIOHS9,GPIO.OUT)
d11 = GPIO(GPIO.GPIOHS10,GPIO.OUT)
d12 = GPIO(GPIO.GPIOHS11,GPIO.OUT)
#数码管a~g dp对应的开发板引脚
self.d_Pins=[d1,d2,d3,d4,d5,d6,d7,d8]
#数码管位段1 2 3 4对应的引脚
self.w_Pins=[d9,d10,d11,d12]
def display(self, num,dp):
global number
count=0
for pin in self.d_Pins:#显示num的值
pin.value(number[num][count])
count+=1
if dp==1:
self.d_Pins[7].value(0)
def clear(self):
for i in self.w_Pins:
i.value(0)
for i in self.d_Pins:
i.value(1)
def showData(self, num):
#分割出数值的百位、千位、个位和小数位的值
d_num=num
location=d_num.find('.')
if location>0:
d_num=d_num.replace('.','')
while len(d_num)<4:
d_num='0'+d_num
for i in range(0,4):
utime.sleep_us(2000)
self.clear()
self.w_Pins[3-i].value(1)
if i==location-1:
self.display(d_num[i],1)
else:
self.display(d_num[i],0)
if location<0:
for i in range(0,4):
utime.sleep_us(2000)
self.clear()
self.w_Pins[3-i].value(1)
self.display(d_num[i],0)
if __name__=="__main__":
pins = [6,7,8,9,10,15,21,22,23,24,25,30] # 引脚连接顺序对应abcdefg(dp)1234
hs32 = HS420561K32(pins)
utime.clock()
while True:
print(utime.ticks())
num = str(utime.ticks()/1000)[:4]
hs32.showData(num)
以上代码是根据博主TPYBoard的博文中TPYBoard驱动四位数码管的代码移植而来,并进行了简单的类封装。
遇到的问题和总结
- 接线和注册引脚问题
千万不可胡乱接线和注册引脚。
从上表可知,最好使用第三列空着的引脚,也就是没有其他特殊功能的引脚。不然就会像我一样,最开始胡乱把1~10脚都接上且注册了GPIOHSx,然后上电运行,发现板子上的TXD灯十分的亮(最亮的那种,闪眼的红)。IDE终端里什么信息也没有,就像卡死一样,过几秒还会断开连接。。。 - 74hc595驱动
一块四位数码管需要12个引脚输入,多一位数码管需要多1个引脚输入。K210这种本来引脚数就不是十分充裕的控制器,其实最好不要采用直接连接的方式驱动,更好的办法是使用74hc595进行驱动。