树莓派 GPIO学习笔记(1)--4位数码管编程

实验器材:

  • 4位数码管(3461BS[共阴])
  • 树莓派B

数码管基本知识:

  1. 数码管驱动方式

    1. 静态驱动。每个数码管的每个片段都有一个自己的I/O端口进行驱动。优点是亮度高,缺点时占用I/O端口多。比如要驱动4个数码管,每个数码管有8个片段,那么总共需要4*8 = 27个I/O端口。

    2. 动态驱动。每个数码管的a,b,c,d,e,f,g,dp同名片段连在一起,同时每个数码管有自己的独立的控制I/O,用于控制是否显示。比如4位数码管,总共有12个针脚。那么每个8个针脚用于控制显示片段,4个针脚用于控制每个数码管的显示。
      3461BS共阴数码管,那么控制片段显示的针脚为LOW的时候,发光。但是控制端,还是必须是HIGH,对应的数码管才会显示。
      如果需要每个数码管显示不同的数字,那么必须通过在1~2ms内反复刷新数码。

树莓派GPIO的连接方式:

4位数码管引脚图:

http://c.hiphotos.baidu.com/zhidao/pic/item/a2cc7cd98d1001e9a348c00fb80e7bec54e797be.jpg

将数码管和GPIO连接起来,然后对数码管每个片段进行编码

按照 hgfedcba的顺序对每个数码管编码

0的二进制代码为
h g f e d c b a
1 1 0 0 0 0 0 0 转换成16进制为0xc0

segCode = [0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90]  #0~9

完整代码

#!/usr/bin/env python

import RPi.GPIO as GPIO
import time

BIT0 = 24 #数码管1
BIT1 = 5#数码管2
BIT2 = 6#数码管3
BIT3 = 26#数码管4

segCode = [0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90]  #0~9
pins = [19,22,12,20,21,13,25,16,26,6,5,24]
bits = [BIT0, BIT1, BIT2, BIT3]

def print_msg():
  print 'Program is running...'
  print 'Please press Ctrl+C end the program...'

def digitalWriteByte(val):
  GPIO.output(19, val & (0x01 << 0))
  GPIO.output(22, val & (0x01 << 1))
  GPIO.output(12, val & (0x01 << 2))
  GPIO.output(20, val & (0x01 << 3))
  GPIO.output(21, val & (0x01 << 4))
  GPIO.output(13, val & (0x01 << 5))
  GPIO.output(25, val & (0x01 << 6))
  GPIO.output(16, val & (0x01 << 7))

def display_1(): 
  show()
  for i in range(10):
    digitalWriteByte(segCode[i])
    time.sleep(0.2)
  hide()

def hide():
  GPIO.output(BIT0, GPIO.LOW) 
  GPIO.output(BIT1, GPIO.LOW) 
  GPIO.output(BIT2, GPIO.LOW) 
  GPIO.output(BIT3, GPIO.LOW) 

def show():
  GPIO.output(BIT0, GPIO.HIGH) 
  GPIO.output(BIT1, GPIO.HIGH) 
  GPIO.output(BIT2, GPIO.HIGH) 
  GPIO.output(BIT3, GPIO.HIGH) 

def showNum(bit,num):
  hide()
  GPIO.output(bits[bit], GPIO.HIGH)
  digitalWriteByte(segCode[num])
  time.sleep(0.005)

def display_3(num):
  b0 = num % 10
  b1 = num % 100 / 10 
  b2 = num % 1000 / 100
  b3 = num / 1000

  if num < 10:
    showNum(0,b0)

  elif num >= 10 and num < 100:
    showNum(0,b0)
    showNum(1,b1)
  elif num >= 100 and num < 1000:
    showNum(0,b0)
    showNum(1,b1)
    showNum(2,b2)
  elif num >= 1000 and num < 10000:
    showNum(0,b0)
    showNum(1,b1)
    showNum(2,b2)
    showNum(3,b3)
  else:
    print 'Out of range, num should be 0~9999 !'

def setup():
  #GPIO.setmode(GPIO.BOARD)    #Number GPIOs by its physical location
  GPIO.setmode(GPIO.BCM)
  for pin in pins:
    GPIO.setup(pin, GPIO.OUT)    #set all pins' mode is output
    GPIO.output(pin, GPIO.HIGH)  #set all pins are high level(3.3V)

def loop():
  while True:
    print_msg()
    display_1()
    time.sleep(1)

    tmp = int(raw_input('Please input a num(0~9999):'))
    for i in range(500):
      display_3(tmp)
    time.sleep(1)


def destroy():   #When program ending, the function is executed. 
  for pin in pins:  
    GPIO.output(pin, GPIO.LOW) #set all pins are low level(0V) 
    GPIO.setup(pin, GPIO.IN)   #set all pins' mode is input

if __name__ == '__main__': #Program starting from here 
  setup() 
  try:
    loop()

  except KeyboardInterrupt:  
    destroy()

以上代码参照
http://blog.csdn.net/jcdjx/article/details/41347059?utm_source=tuicool

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值