先上原理图
我手里的是型号SR410361K的 4段数码管是共阳的(低电平驱动),先发送数据,然后发送片选
共阴 共阳的图如下:
如何测量呢?
-
首先将数字万用表档位调节到蜂鸣器/二极管档,红表笔和黑表笔接在数码管任意 2 个脚上,组合可以有很多种,但总有一个 LED 会发光的,找到一个就可以啦。
-
然后红表笔不动,黑表笔逐个接触剩余的引脚,如果能看到数码管不同的发光段被点亮,则此数码管为共阳极。
-
相反黑表笔不动,红表笔逐个接触剩余的引脚,如果能看到数码管不同的发光段被点亮,则此数码管为共阴极。
此判断方法,还可以通过接触数码管的所有引脚,来判断此数码管所有的发光段是否可以正常点亮。
软件驱动的话,需要取字模,有相关人做了上位机,大家可以去找找,如下图,这样想要什么显示,进行勾选选择即可。
使用rp2040 micropython 驱动测试代码如下:
from machine import Pin
import utimepin_sclk = Pin(13, Pin.OUT); pin_sclk.off() # 上升跳变时锁存
pin_rlck = Pin(12, Pin.OUT); pin_rlck.off() # 上升跳变时数据位移
pin_dio = Pin(11, Pin.OUT); pin_dio.off() # 待移入数据位
mapper = { # 共阳方式段码对照'0': 0xC0, '1': 0xF9, '2': 0xA4, '3': 0xB0,'4': 0x99, '5': 0x92, '6': 0x82, '7': 0xF8,'8': 0x80, '9': 0x90, 'A': 0x88, 'B': 0x83,'C': 0xA7, 'D': 0xA1, 'E': 0x86, 'F': 0x8E,
}'''
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
mapper = { # 共阴方式段码对照'0': 0x3F, '1': 0x06, '2': 0x5B, '3': 0x4F,'4': 0x66, '5': 0x6D, '6': 0x7D, '7': 0x07,'8': 0x7F, '9': 0x6F, 'A': 0x77, 'B': 0x7C,'C': 0x39, 'D': 0x5E, 'E': 0x79, 'F': 0x71,
}
'''
def jump_up(pin):pin.on() # 产生跳变#utime.sleep_ms(1)pin.off() # 保持一段时间后关闭def send_data(num, is_position=False, has_point=False):'向位称寄存器送数据'if is_position: # 位码处理( 1~4位)value = {1:0x01, 2:0x02, 3:0x04, 4:0x08,5:0x10,6:0x20,7:0x40,8:0x80}.get(num, 0)else: # 段码处理value = mapper.get(str(num), 0)value = value & 0x7F if has_point else value # 共阳方式# value = (~value | 0x80) if has_point else ~value # 共阴方式#print("value")#print(value)for i in range(8):pin_dio.value(1 if (value << i) & 0x80 else 0) # 从最高位开始送数据jump_up(pin_sclk) # 每送完一位后就让位移寄存器跳变一下step=0
num =0while True:send_data(int(5))send_data(1,is_position=True)jump_up(pin_rlck)send_data(int(6))send_data(2,is_position=True)jump_up(pin_rlck)send_data(int(7))send_data(3,is_position=True)jump_up(pin_rlck)send_data(int(8))send_data(4,is_position=True)jump_up(pin_rlck)send_data(int(1))send_data(5,is_position=True)jump_up(pin_rlck)send_data(int(2))send_data(6,is_position=True)jump_up(pin_rlck)send_data(int(3))send_data(7,is_position=True)jump_up(pin_rlck)send_data(int(4))send_data(8,is_position=True)jump_up(pin_rlck)# 显示千位
# send_data(int(num/1000))
# send_data(4, is_position=True)
# jump_up(pin_rlck)# 显示百位#send_data(int(num / 100 % 10))#send_data(3, is_position=True)#jump_up(pin_rlck)# 显示十位#send_data(int(num // 10 % 10))#send_data(int(6))#send_data(2, is_position=True)#jump_up(pin_rlck)# 显示个位#send_data(int(num % 10))#send_data(int(5))#send_data(1, is_position=True)#jump_up(pin_rlck)#send_data(1,is_position=True)#send_data(int(num % 10))#jump_up(pin_rlck)# if step%100==0:
# num += 1
# if num>9999: num=0
# step += 1