0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在樹莓派Pico上使用TM1637 4位數(shù)碼管模塊的方法

jf_zGNBEhbi ? 來源:趣無盡 ? 2023-11-30 09:02 ? 次閱讀

教程重點(diǎn)介紹在樹莓派 Pico 上使用 TM1637 4 位數(shù)碼管模塊的方法。

所需組件

– 樹莓派 Pico 或 Pico W
– TM1637 4 位數(shù)碼管模塊
– 面包板和跳線
– microUSB 數(shù)據(jù)線

TM1637 是一種帶鍵盤掃描接口LED(發(fā)光二極管顯示器)驅(qū)動(dòng)控制專用電路,內(nèi)部集成有 MCU 數(shù)字接口、數(shù)據(jù)鎖存器、LED 高壓驅(qū)動(dòng)、鍵盤掃描等電路。TM1637 驅(qū)動(dòng)的數(shù)碼管模塊因其控制引腳數(shù)量少而廣受歡迎。在這 4 個(gè)引腳中,其中兩個(gè)是電源引腳,其余兩個(gè)引腳控制模塊上的顯示值。

引腳名稱功能

b78b6146-8f18-11ee-939d-92fbcf53809c.jpg

CLK 時(shí)鐘引腳有助于保持時(shí)鐘脈沖與模塊和微控制器的同步。
DIO 數(shù)據(jù)引腳有助于從微控制器發(fā)送和接收數(shù)據(jù)。
GND 接地 (GND) 用于與外部設(shè)備建立公共接地。
VCC 電源 (VCC) 輸入引腳,用于為模塊供電。接受 3.3-5V VCC。

樹莓派 Pico I2C 引腳

RP2040 芯片有兩個(gè) I2C 控制器。兩個(gè) I2C 控制器都可以通過樹莓派 Pico 的 GPIO 引腳訪問。下表顯示了 GPIO 引腳與兩個(gè) I2C 控制器的連接。控制器的每個(gè)連接都可以通過多個(gè)GPIO引腳進(jìn)行配置,如圖所示。但在使用 I2C 控制器之前,你應(yīng)該在軟件中配置要與特定 I2C 控制器一起使用的 GPIO 引腳。

I2C 控制器 GPIO 引腳

I2C0 – SDA GP0/GP4/GP8/GP12/GP16/GP20
I2C0 – SCL GP1/GP5/GP9/GP13/GP17/GP21
I2C1 – SDA GP2/GP6/GP10/GP14/GP18/GP26
I2C1 – SCL GP3/GP7/GP11/GP15/GP19/GP27

兩個(gè)設(shè)備之間的連接相當(dāng)簡單。我們用 GP26 連接 CLK,用 GP27 連接 DIO。你也可以使用其他 SDA/SCL 引腳組合,如上表所示。

請(qǐng)遵循下圖:
b79e3abe-8f18-11ee-939d-92fbcf53809c.png

安裝 TMP1637 庫

要使用 TM1637 數(shù)碼管模塊對(duì)樹莓派 Pico 進(jìn)行編程,我們需要來自 GitHub 的 TM1637 庫。

復(fù)制此庫并將其保存在名為 tm1637.py 的樹莓派 Pico 中。在 Thonny 中打開一個(gè)新文件。復(fù)制下面給出的庫或從此鏈接獲取。將其保存到樹莓派 Pico,名稱 tm1637.py,放在根目錄或 lib 文件夾下。

from micropython import const
from machine import Pin
from time import sleep_us, sleep_ms
 
TM1637_CMD1 = const(64)  # 0x40 data command
TM1637_CMD2 = const(192) # 0xC0 address command
TM1637_CMD3 = const(128) # 0x80 display control command
TM1637_DSP_ON = const(8) # 0x08 display on
TM1637_DELAY = const(10) # 10us delay between clk/dio pulses
TM1637_MSB = const(128)  # msb is the decimal point or the colon depending on your display
 
# 0-9, a-z, blank, dash, star
_SEGMENTS = bytearray(b'x3Fx06x5Bx4Fx66x6Dx7Dx07x7Fx6Fx77x7Cx39x5Ex79x71x3Dx76x06x1Ex76x38x55x54x3Fx73x67x50x6Dx78x3Ex1Cx2Ax76x6Ex5Bx00x40x63')
 
class TM1637(object):
    """Library for quad 7-segment LED modules based on the TM1637 LED driver."""
    def __init__(self, clk, dio, brightness=7):
        self.clk = clk
        self.dio = dio
 
        if not 0 <= brightness <= 7:
            raise ValueError("Brightness out of range")
        self._brightness = brightness
 
        self.clk.init(Pin.OUT, value=0)
        self.dio.init(Pin.OUT, value=0)
        sleep_us(TM1637_DELAY)
 
        self._write_data_cmd()
        self._write_dsp_ctrl()
 
    def _start(self):
        self.dio(0)
        sleep_us(TM1637_DELAY)
        self.clk(0)
        sleep_us(TM1637_DELAY)
 
    def _stop(self):
        self.dio(0)
        sleep_us(TM1637_DELAY)
        self.clk(1)
        sleep_us(TM1637_DELAY)
        self.dio(1)
 
    def _write_data_cmd(self):
        # automatic address increment, normal mode
        self._start()
        self._write_byte(TM1637_CMD1)
        self._stop()
 
    def _write_dsp_ctrl(self):
        # display on, set brightness
        self._start()
        self._write_byte(TM1637_CMD3 | TM1637_DSP_ON | self._brightness)
        self._stop()
 
    def _write_byte(self, b):
        for i in range(8):
            self.dio((b >> i) & 1)
            sleep_us(TM1637_DELAY)
            self.clk(1)
            sleep_us(TM1637_DELAY)
            self.clk(0)
            sleep_us(TM1637_DELAY)
        self.clk(0)
        sleep_us(TM1637_DELAY)
        self.clk(1)
        sleep_us(TM1637_DELAY)
        self.clk(0)
        sleep_us(TM1637_DELAY)
 
    def brightness(self, val=None):
        """Set the display brightness 0-7."""
        # brightness 0 = 1/16th pulse width
        # brightness 7 = 14/16th pulse width
        if val is None:
            return self._brightness
        if not 0 <= val <= 7:
            raise ValueError("Brightness out of range")
 
        self._brightness = val
        self._write_data_cmd()
        self._write_dsp_ctrl()
 
    def write(self, segments, pos=0):
        """Display up to 6 segments moving right from a given position.
        The MSB in the 2nd segment controls the colon between the 2nd
        and 3rd segments."""
        if not 0 <= pos <= 5:
            raise ValueError("Position out of range")
        self._write_data_cmd()
        self._start()
 
        self._write_byte(TM1637_CMD2 | pos)
        for seg in segments:
            self._write_byte(seg)
        self._stop()
        self._write_dsp_ctrl()
 
    def encode_digit(self, digit):
        """Convert a character 0-9, a-f to a segment."""
        return _SEGMENTS[digit & 0x0f]
 
    def encode_string(self, string):
        """Convert an up to 4 character length string containing 0-9, a-z,
        space, dash, star to an array of segments, matching the length of the
        source string."""
        segments = bytearray(len(string))
        for i in range(len(string)):
            segments[i] = self.encode_char(string[i])
        return segments
 
    def encode_char(self, char):
        """Convert a character 0-9, a-z, space, dash or star to a segment."""
        o = ord(char)
        if o == 32:
            return _SEGMENTS[36] # space
        if o == 42:
            return _SEGMENTS[38] # star/degrees
        if o == 45:
            return _SEGMENTS[37] # dash
        if o >= 65 and o <= 90:
            return _SEGMENTS[o-55] # uppercase A-Z
        if o >= 97 and o <= 122:
            return _SEGMENTS[o-87] # lowercase a-z
        if o >= 48 and o <= 57:
            return _SEGMENTS[o-48] # 0-9
        raise ValueError("Character out of range: {:d} '{:s}'".format(o, chr(o)))
 
    def hex(self, val):
        """Display a hex value 0x0000 through 0xffff, right aligned."""
        string = '{:04x}'.format(val & 0xffff)
        self.write(self.encode_string(string))
 
    def number(self, num):
        """Display a numeric value -999 through 9999, right aligned."""
        # limit to range -999 to 9999
        num = max(-999, min(num, 9999))
        string = '{0: >4d}'.format(num)
        self.write(self.encode_string(string))
 
    def numbers(self, num1, num2, colon=True):
        """Display two numeric values -9 through 99, with leading zeros
        and separated by a colon."""
        num1 = max(-9, min(num1, 99))
        num2 = max(-9, min(num2, 99))
        segments = self.encode_string('{0:0>2d}{1:0>2d}'.format(num1, num2))
        if colon:
            segments[1] |= 0x80 # colon on
        self.write(segments)
 
    def temperature(self, num):
        if num < -9:
            self.show('lo') # low
        elif num > 99:
            self.show('hi') # high
        else:
            string = '{0: >2d}'.format(num)
            self.write(self.encode_string(string))
        self.write([_SEGMENTS[38], _SEGMENTS[12]], 2) # degrees C
 
    def show(self, string, colon=False):
        segments = self.encode_string(string)
        if len(segments) > 1 and colon:
            segments[1] |= 128
        self.write(segments[:4])
 
    def scroll(self, string, delay=250):
        segments = string if isinstance(string, list) else self.encode_string(string)
        data = [0] * 8
        data[4:0] = list(segments)
        for i in range(len(segments) + 5):
            self.write(data[0+i:4+i])
            sleep_ms(delay)
 
 
class TM1637Decimal(TM1637):
    """Library for quad 7-segment LED modules based on the TM1637 LED driver.
    This class is meant to be used with decimal display modules (modules
    that have a decimal point after each 7-segment LED).
    """
 
    def encode_string(self, string):
        """Convert a string to LED segments.
        Convert an up to 4 character length string containing 0-9, a-z,
        space, dash, star and '.' to an array of segments, matching the length of
        the source string."""
        segments = bytearray(len(string.replace('.','')))
        j = 0
        for i in range(len(string)):
            if string[i] == '.' and j > 0:
                segments[j-1] |= TM1637_MSB
                continue
            segments[j] = self.encode_char(string[i])
            j += 1
        return segments

樹莓派 Pico MicroPython:TM1637 代碼

樹莓派 Pico W 需要預(yù)加載 MicroPython UF2 文件才能在 MicroPython 中對(duì)其進(jìn)行編程。你可以閱讀我們的樹莓派 Pico 入門指南,其中我們展示了在 MicroPython 中開始編程 RP2040 所需的所有步驟。

b7b7c790-8f18-11ee-939d-92fbcf53809c.png
如上圖所示完成所有連接后,使用 USB 數(shù)據(jù)線將 Pico 連接到你的計(jì)算機(jī)。打開 IDE,將以下代碼粘貼到新項(xiàng)目中。

import tm1637
from machine import Pin
import time
tm = tm1637.TM1637(clk=Pin(0), dio=Pin(1))
 
#set brightness(0-7)
tm.brightness(5)
# display "10:24"
tm.numbers(10, 24, colon=True)
time.sleep(2)
# Word
tm.show("AbCd", colon=False)
time.sleep(2)
# display "COOL"
tm.write([0b00111001, 0b00111111, 0b00111111, 0b00111000])
time.sleep(2)
# Clear all
tm.show("    ")
time.sleep(2)
# display "bEEF"
tm.hex(0xbeef)
time.sleep(2)
# display "-123"
tm.number(-123)
time.sleep(2)
# show temperature '24*C'
tm.temperature(24)
time.sleep(2)
#scroll display contents
tm.scroll('RPI-ICU', delay=250)

通過單擊“運(yùn)行”圖標(biāo)或按 F5 鍵來運(yùn)行代碼。將腳本保存到你的樹莓派 Pico中,作為 main.py 或任何其他文件擴(kuò)展名為 “.py” 的名稱。

成功上傳代碼后,你必須看到 TM1637 數(shù)碼管模塊顯示更改的字符,每次更新之間有 2 秒的延遲。

b7796590-8f18-11ee-939d-92fbcf53809c.jpg

TM1637 MicroPython 代碼說明

首先,我們導(dǎo)入必要的模塊。TM1637 模塊用于與 7 段顯示器通信,Pin 模塊用于將 Pico W 引腳設(shè)置為輸出引腳,Time 模塊用于設(shè)置代碼執(zhí)行之間的延遲。

import tm1637
from machine import Pin
import time

然后,我們定義一個(gè)名為 tm 的實(shí)例,并啟動(dòng) Raspberry Pi Pico 的引腳 0 和 1,分別與引腳 CLK 和 DIO 連接。

tm = tm1637.TM1637(clk=Pin(0), dio=Pin(1))

tm.brightness 可以設(shè)置為介于 1 到 7 之間的值。將其設(shè)置為“1”會(huì)將 TM1637 亮度設(shè)置為最低,“7”會(huì)亮起所有 LED。

tm.brightness(5)

接下來的行在冒號(hào)的兩側(cè)顯示 2 個(gè)獨(dú)立的數(shù)字,前導(dǎo)為零。如果不希望冒號(hào)顯示在數(shù)字之間,則可以將參數(shù)冒號(hào)設(shè)置為 False。

tm.numbers(10, 24, colon=True)
time.sleep(2)

寫入函數(shù)可用于點(diǎn)亮 LED 的每個(gè)部分。它的參數(shù)是 8 位二進(jìn)制數(shù),其中每個(gè)位對(duì)應(yīng)于 7 段顯示器的一個(gè)段。

tm.write([0b00111001, 0b00111111, 0b00111111, 0b00111000])

為了更好地理解上面的代碼,讓我們看到一個(gè) 7 段顯示,其中標(biāo)記了段。

   __2__
  |     |    |  0 ->  011 1111 -> 0x3f
1 |     | 3  |  1 ->  010 0001 -> 0x21
  |__7__|    |  2 ->  111 0110 -> 0x76
  |     |    |  4 ->  ...
6 |     | 4  |        ...
  |__5__|    |  9 ->  ...      -> 0x5f

在函數(shù) tm.write 中,第一個(gè)參數(shù)是 0b00111001,它將在 TM1637 模塊上顯示單詞“cool”的第一個(gè)字母(即字母 c)。參數(shù)中最低有效位表示段“a”,最高有效位表示段“DP”。因此,0b00111001 將點(diǎn)亮 7 段顯示中的段 a、d、e 和 f。同樣,參數(shù) 0b00111111、0b001111111 和 0b00111000 將分別顯示字母“o”、“o”和“l(fā)”。

接下來,我們使用 tm.show 函數(shù)顯示字符串 ‘heya’,使用 tm.hex 顯示十六進(jìn)制值,使用 tm.number 顯示負(fù)數(shù)。函數(shù) tm.number 可以顯示數(shù)字 -999 到 9999,并且數(shù)字將右對(duì)齊。

tm.show('heya', colon=False)
tm.hex(0xbeef)
tm.number(-123)

如果要顯示的內(nèi)容不適合 TM1637 的 4 位段,則可以使用 scroll() 函數(shù)滾動(dòng)內(nèi)容。delay 參數(shù)以毫秒為單位取值,它是字符在向左滾動(dòng)之前在片段中停留的時(shí)間。

scroll('scrolling', delay=250)

最后

將代碼上傳到電路板后,TM1637 4 位數(shù)碼管模塊將顯示所有不同的數(shù)字和文本。







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 發(fā)光二極管
    +關(guān)注

    關(guān)注

    13

    文章

    1189

    瀏覽量

    66107
  • LED驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    72

    文章

    976

    瀏覽量

    137858
  • 數(shù)碼管
    +關(guān)注

    關(guān)注

    32

    文章

    1871

    瀏覽量

    90724
  • 鎖存器
    +關(guān)注

    關(guān)注

    8

    文章

    904

    瀏覽量

    41386
  • 樹莓派
    +關(guān)注

    關(guān)注

    116

    文章

    1681

    瀏覽量

    105388

原文標(biāo)題:在樹莓派 Pico 上使用 TM1637 4 位數(shù)碼管模塊

文章出處:【微信號(hào):趣無盡,微信公眾號(hào):趣無盡】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    TM1637數(shù)碼管模塊的使用

    這個(gè)數(shù)碼管模塊有意思的地方不是中間有兩個(gè)小點(diǎn),而是它的控制方式:只需要兩個(gè)引腳就能夠控制,通信方式與IIC很像。
    的頭像 發(fā)表于 11-01 09:08 ?1.1w次閱讀
    <b class='flag-5'>TM1637</b><b class='flag-5'>數(shù)碼管</b><b class='flag-5'>模塊</b>的使用

    TM1637驅(qū)動(dòng)共陽數(shù)碼管 CL2661BH為什么用共陰編碼才可以?

    TM1637驅(qū)動(dòng)共陽數(shù)碼管 CL2661BH為什么用共陰編碼才可以?不知道為什么要用共陰的編碼
    發(fā)表于 02-28 15:08

    為什么TM1637驅(qū)動(dòng)共陽極數(shù)碼管要用共陰極的編碼?

    為什么TM1637驅(qū)動(dòng)共陽極數(shù)碼管要用共陰極的編碼?code unsigned char tab[] = {0x3F,/*0*/0x06,/*1*/0x5B,/*2*/0x4F,/*3*/0x66
    發(fā)表于 02-29 22:09

    DS1302時(shí)鐘模塊簡介

    【Arduino】使用DS1302時(shí)鐘模塊搭配TM1637位數(shù)碼管制作簡易電子鐘材料準(zhǔn)備DS1302時(shí)鐘模塊DS1302芯片簡介DS1302時(shí)鐘
    發(fā)表于 07-26 06:34

    基于SMT32的數(shù)碼管顯示程序

    1、四位數(shù)碼管的簡單介紹因?yàn)樵趯W(xué)校做項(xiàng)目的時(shí)候使用到了數(shù)碼管顯示,所以就編寫了一個(gè)基于SMT32的數(shù)碼管顯示程序。通過看手冊(cè)知道這個(gè)四位數(shù)碼管采用T
    發(fā)表于 08-11 08:32

    如何使用DS1302時(shí)鐘模塊搭配TM1637位數(shù)碼管制作簡易電子鐘?

    如何使用DS1302時(shí)鐘模塊搭配TM1637位數(shù)碼管制作簡易電子鐘?
    發(fā)表于 09-26 08:35

    STM32F103單片機(jī)驅(qū)動(dòng)TM1637數(shù)碼管顯示模塊方法

    位數(shù)碼管顯示模塊實(shí)際運(yùn)行效果下面先看一下TM1637數(shù)碼管連接的具體線路圖 實(shí)際使用的模塊沒有帶按鍵,只用了
    發(fā)表于 12-08 07:08

    采用四位數(shù)碼管實(shí)現(xiàn)時(shí)間的倒計(jì)時(shí)

    目錄實(shí)驗(yàn)?zāi)康模簡栴}總結(jié):實(shí)驗(yàn)?zāi)康模鹤鳛橐粋€(gè)共享項(xiàng)目中的一部分,采用四位數(shù)碼管實(shí)現(xiàn)時(shí)間的倒計(jì)時(shí)。問題總結(jié):因?yàn)橘?zèng)送的資料是arduino的程序,所以需要自己移植到stm32中。一開始以為TM1637
    發(fā)表于 01-12 08:01

    如何用2553單片機(jī)/TM1637實(shí)現(xiàn)按鍵倒計(jì)時(shí)響鈴以及時(shí)間的顯示

    TM1637數(shù)碼管顯示。注:TM1637數(shù)碼管資料如下:資料鏈接:https://pan.baidu.com/s/1POymj8LqbfPZexBZc-EpXg提取碼:up
    發(fā)表于 02-23 06:11

    數(shù)碼管驅(qū)動(dòng)芯片規(guī)格書-TM1637_V2[1].1

    數(shù)碼管驅(qū)動(dòng)芯片規(guī)格書-TM1637,LED驅(qū)動(dòng)控制專用電路
    發(fā)表于 12-07 14:36 ?41次下載

    tm1637驅(qū)動(dòng)數(shù)碼管程序

    本文介紹了tm1637驅(qū)動(dòng)數(shù)碼管程序,TM1637是一種帶鍵盤掃描接口的LED(發(fā)光二極顯示器)驅(qū)動(dòng)控制專用電路,內(nèi)部集成有MCU數(shù)字接口,數(shù)據(jù)鎖存器,LED高壓驅(qū)動(dòng),鍵盤掃描等電路
    發(fā)表于 12-19 11:59 ?4.7w次閱讀
    <b class='flag-5'>tm1637</b>驅(qū)動(dòng)<b class='flag-5'>數(shù)碼管</b>程序

    TM1637 MSP430 單片機(jī) 數(shù)碼管 程序 驅(qū)動(dòng) G2553

    電子發(fā)燒友網(wǎng)站提供《TM1637 MSP430 單片機(jī) 數(shù)碼管 程序 驅(qū)動(dòng) G2553.pdf》資料免費(fèi)下載
    發(fā)表于 11-19 17:06 ?21次下載
    <b class='flag-5'>TM1637</b> MSP430 單片機(jī) <b class='flag-5'>數(shù)碼管</b> 程序 驅(qū)動(dòng) G2553

    【白嫖福利】【TM1637】簡單易懂!51單片機(jī)完整的數(shù)碼管驅(qū)動(dòng)程序(數(shù)碼管和按鍵拓展芯片)

    概述使用單片機(jī)的過程中發(fā)現(xiàn)某些IO口不夠用或者單片機(jī)的IO口比較少,比如如果IO口直驅(qū)數(shù)碼管的話會(huì)用去很多IO口造成不必要的資源浪費(fèi)方案使用TM1637模塊,使用的是I2c的IC,只
    發(fā)表于 11-23 17:06 ?29次下載
    【白嫖福利】【<b class='flag-5'>TM1637</b>】簡單易懂!51單片機(jī)完整的<b class='flag-5'>數(shù)碼管</b>驅(qū)動(dòng)程序(<b class='flag-5'>數(shù)碼管</b>和按鍵拓展芯片)

    STM32F103單片機(jī)驅(qū)動(dòng)TM1637數(shù)碼管顯示模塊

    TM1637位數(shù)碼管顯示模塊實(shí)際運(yùn)行效果下面先看一下TM1637數(shù)碼管連接的具體線路圖 實(shí)際使用的
    發(fā)表于 11-25 10:51 ?89次下載
    STM32F103單片機(jī)驅(qū)動(dòng)<b class='flag-5'>TM1637</b><b class='flag-5'>數(shù)碼管</b>顯示<b class='flag-5'>模塊</b>

    【Arduino】使用DS1302時(shí)鐘模塊搭配TM1637位數(shù)碼管制作簡易電子鐘

    【Arduino】使用DS1302時(shí)鐘模塊搭配TM1637位數(shù)碼管制作簡易電子鐘材料準(zhǔn)備DS1302時(shí)鐘模塊DS1302芯片簡介DS1302時(shí)鐘
    發(fā)表于 01-18 09:12 ?28次下載
    【Arduino】使用DS1302時(shí)鐘<b class='flag-5'>模塊</b>搭配<b class='flag-5'>TM1637</b>四<b class='flag-5'>位數(shù)碼管</b>制作簡易電子鐘