在淘宝上买了一个时钟数码管模块,采用2片595驱动数码管,需要单片机3路IO口,根据数码管动态扫描原理进行显示,宽工作电压3.3V到5V,4位共阳。
在单片机上驱动成功了,就想在pi上也驱动下,显示下当前的系统时间。
#!/usr/bin/python
# -*- coding:utf-8 -*-
'''
595-CLK NanoPI NEO2 Pi
VCC <-> 5V(Pin4)
GND <-> GND(Pin6)
SCLK <-> GPIOG6(Pin8)198
RCLK <-> GPIOG7(Pin10)199
DIO <-> GPIOA6(Pin12)6
'''
import gpio as GPIO
import time
# BCM GPIO编号
SHCP = 198 # 数据输入时钟线 11:SHCP/SCK(shift register clock input)
STCP = 199 # 输出存储器锁存时钟线 12:STCP/RCK(storage register clock input)
DS = 6 # 串行数据输入 14:DS/SER(serial data input)
# 控制各个位显示的数字
dig0 = 0
dig1 = 0
dig2 = 0
dig3 = 0
# 控制要显示的数码管所在的位置
bit_show = 0
def setup():
#采用BCM编号
GPIO.setup(SHCP, GPIO.OUT, initial=False)
GPIO.setup(STCP, GPIO.OUT, initial=False)
GPIO.setup(DS, GPIO.OUT, initial=False)
def Send595(dig, seg):
for i in range(8):
#先将移位时钟置为低 SHCP_L
GPIO.output(SHCP, False)
if seg & 0x80 == 0x80:
GPIO.output(DS, True)
else:
GPIO.output(DS, False)
#再移位寄存器时钟置为高,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
GPIO.output(SHCP, True)
seg <<= 1
for i in range(8):
#先将移位时钟置为低 SHCP_L;
GPIO.output(SHCP, False)
if dig & 0x80 == 0x80:
GPIO.output(DS, True)
else:
GPIO.output(DS, False)
#再移位寄存器时钟置为高,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
GPIO.output(SHCP, True)
dig <<= 1
#先把段码和位码移位到寄存器,然后再将储寄存器产生上升沿,使之从并口输出
GPIO.output(STCP, False)
GPIO.output(STCP, True)
# 选择8位数码管驱动 动态扫描
def DisplayCallBack(is_two_dot_show):
global dig3, dig2, dig1, dig0
global bit_show
TWO_DOT_ON = 0x7F
TWO_DOT_OFF = 0xFF
# 共阳 段码 0、1、2、3、4、5、6、7、8、9
seg_code =
# 分别选中第1、2、3、4位码 高电平有效共阳数码管
dig_code =
if bit_show == 0:
Send595(dig_code, seg_code)
bit_show = 1
elif bit_show == 1:
Send595(dig_code, seg_code)
bit_show = 2
elif bit_show == 2:
if is_two_dot_show == True:
Send595(dig_code, seg_code & TWO_DOT_ON)
else:
Send595(dig_code, seg_code & TWO_DOT_OFF)
bit_show = 3
elif bit_show == 3:
Send595(dig_code, seg_code)
bit_show = 0
def DisplayTimeShow(hour, min):
global dig3, dig2, dig1, dig0
dig3 = hour / 10 % 10
dig2 = hour % 10
dig1 = min / 10 % 10
dig0 = min % 10
if __name__ == '__main__':
#采用BCM编号
setup()
is_dot = False
try:
while True:
t = time.localtime()
DisplayTimeShow(t.tm_hour, t.tm_min)
if t.tm_sec % 2 == 0:
is_dot = True
else:
is_dot = False
DisplayCallBack(is_dot)#这个里面会造成时间不准,有一定的阻塞
time.sleep(0.001)
except KeyboardInterrupt:
GPIO.cleanup()
在淘宝上买了一个时钟数码管模块,采用2片595驱动数码管,需要单片机3路IO口,根据数码管动态扫描原理进行显示,宽工作电压3.3V到5V,4位共阳。
在单片机上驱动成功了,就想在pi上也驱动下,显示下当前的系统时间。
#!/usr/bin/python
# -*- coding:utf-8 -*-
'''
595-CLK NanoPI NEO2 Pi
VCC <-> 5V(Pin4)
GND <-> GND(Pin6)
SCLK <-> GPIOG6(Pin8)198
RCLK <-> GPIOG7(Pin10)199
DIO <-> GPIOA6(Pin12)6
'''
import gpio as GPIO
import time
# BCM GPIO编号
SHCP = 198 # 数据输入时钟线 11:SHCP/SCK(shift register clock input)
STCP = 199 # 输出存储器锁存时钟线 12:STCP/RCK(storage register clock input)
DS = 6 # 串行数据输入 14:DS/SER(serial data input)
# 控制各个位显示的数字
dig0 = 0
dig1 = 0
dig2 = 0
dig3 = 0
# 控制要显示的数码管所在的位置
bit_show = 0
def setup():
#采用BCM编号
GPIO.setup(SHCP, GPIO.OUT, initial=False)
GPIO.setup(STCP, GPIO.OUT, initial=False)
GPIO.setup(DS, GPIO.OUT, initial=False)
def Send595(dig, seg):
for i in range(8):
#先将移位时钟置为低 SHCP_L
GPIO.output(SHCP, False)
if seg & 0x80 == 0x80:
GPIO.output(DS, True)
else:
GPIO.output(DS, False)
#再移位寄存器时钟置为高,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
GPIO.output(SHCP, True)
seg <<= 1
for i in range(8):
#先将移位时钟置为低 SHCP_L;
GPIO.output(SHCP, False)
if dig & 0x80 == 0x80:
GPIO.output(DS, True)
else:
GPIO.output(DS, False)
#再移位寄存器时钟置为高,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
GPIO.output(SHCP, True)
dig <<= 1
#先把段码和位码移位到寄存器,然后再将储寄存器产生上升沿,使之从并口输出
GPIO.output(STCP, False)
GPIO.output(STCP, True)
# 选择8位数码管驱动 动态扫描
def DisplayCallBack(is_two_dot_show):
global dig3, dig2, dig1, dig0
global bit_show
TWO_DOT_ON = 0x7F
TWO_DOT_OFF = 0xFF
# 共阳 段码 0、1、2、3、4、5、6、7、8、9
seg_code =
# 分别选中第1、2、3、4位码 高电平有效共阳数码管
dig_code =
if bit_show == 0:
Send595(dig_code, seg_code)
bit_show = 1
elif bit_show == 1:
Send595(dig_code, seg_code)
bit_show = 2
elif bit_show == 2:
if is_two_dot_show == True:
Send595(dig_code, seg_code & TWO_DOT_ON)
else:
Send595(dig_code, seg_code & TWO_DOT_OFF)
bit_show = 3
elif bit_show == 3:
Send595(dig_code, seg_code)
bit_show = 0
def DisplayTimeShow(hour, min):
global dig3, dig2, dig1, dig0
dig3 = hour / 10 % 10
dig2 = hour % 10
dig1 = min / 10 % 10
dig0 = min % 10
if __name__ == '__main__':
#采用BCM编号
setup()
is_dot = False
try:
while True:
t = time.localtime()
DisplayTimeShow(t.tm_hour, t.tm_min)
if t.tm_sec % 2 == 0:
is_dot = True
else:
is_dot = False
DisplayCallBack(is_dot)#这个里面会造成时间不准,有一定的阻塞
time.sleep(0.001)
except KeyboardInterrupt:
GPIO.cleanup()