【NanoPi NEO Plus2试用体验】+驱动时钟数码管

  • makeWorks
  • LV3工程师
  • |      2017-09-17 22:21:19
  • 浏览量 824
  • 回复:0
在淘宝上买了一个时钟数码管模块,采用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()

        
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子