Raspberry Pi Pico 有关LCD1602与超声波传感器HC-SR04的测距显示系统

树莓派24/100 - Pico与1602显示屏相连输出2行文本 树莓派Pico与一个1602显示单元相连,利用I2C接口,显示两行文本。 阅读详情

效果图

写在前面

本文只涉及到应用层,不讲原理。读者可以结合代码自行理解,如有错误,感谢大家积极指出。

提前准备

  • 需要的器件有Raspberry Pi Pico、LCD1602液晶显示屏与超声波传感器HC-SR04。
  • 下载LCD1602驱动:点我下载。
    如果不想下载可以直接复制我后面的相关代码写入到Raspberry Pi Pico中。

接线

  • VCC和GND随便连地线和电源线即可。
  • HC-SR04的trigger线接GPIO18,echo线接GPIO26。
  • LCD1602的SDA接GPIO0,SCL接GPIO1。

LCD1602的驱动代码(下载了驱动的可以直接跳)

lcd_api.py

import time

class LcdApi:
    
    # Implements the API for talking with HD44780 compatible character LCDs.
    # This class only knows what commands to send to the LCD, and not how to get
    # them to the LCD.
    #
    # It is expected that a derived class will implement the hal_xxx functions.
    #
    # The following constant names were lifted from the avrlib lcd.h header file,
    # with bit numbers changed to bit masks.
    
    # HD44780 LCD controller command set
    LCD_CLR             = 0x01  # DB0: clear display
    LCD_HOME            = 0x02  # DB1: return to home position

    LCD_ENTRY_MODE      = 0x04  # DB2: set entry mode
    LCD_ENTRY_INC       = 0x02  # DB1: increment
    LCD_ENTRY_SHIFT     = 0x01  # DB0: shift

    LCD_ON_CTRL         = 0x08  # DB3: turn lcd/cursor on
    LCD_ON_DISPLAY      = 0x04  # DB2: turn display on
    LCD_ON_CURSOR       = 0x02  # DB1: turn cursor on
    LCD_ON_BLINK        = 0x01  # DB0: blinking cursor

    LCD_MOVE            = 0x10  # DB4: move cursor/display
    LCD_MOVE_DISP       = 0x08  # DB3: move display (0-> move cursor)
    LCD_MOVE_RIGHT      = 0x04  # DB2: move right (0-> left)

    LCD_FUNCTION        = 0x20  # DB5: function set
    LCD_FUNCTION_8BIT   = 0x10  # DB4: set 8BIT mode (0->4BIT mode)
    LCD_FUNCTION_2LINES = 0x08  # DB3: two lines (0->one line)
    LCD_FUNCTION_10DOTS = 0x04  # DB2: 5x10 font (0->5x7 font)
    LCD_FUNCTION_RESET  = 0x30  # See "Initializing by Instruction" section

    LCD_CGRAM           = 0x40  # DB6: set CG RAM address
    LCD_DDRAM           = 0x80  # DB7: set DD RAM address

    LCD_RS_CMD          = 0
    LCD_RS_DATA         = 1

    LCD_RW_WRITE        = 0
    LCD_RW_READ         = 1

    def __init__(self, num_lines, num_columns):
        self.num_lines = num_lines
        if self.num_lines > 4:
            self.num_lines = 4
        self.num_columns = num_columns
        if self.num_columns > 40:
            self.num_columns = 40
        self.cursor_x = 0
        self.cursor_y = 0
        self.implied_newline = False
        self.backlight = True
        self.display_off()
        self.backlight_on()
        self.clear()
        self.hal_write_command(self.LCD_ENTRY_MODE | self.LCD_ENTRY_INC)
        self.hide_cursor()
        self.display_on()

    def clear(self):
        # Clears the LCD display and moves the cursor to the top left corner
        self.hal_write_command(self.LCD_CLR)
        self.hal_write_command(self.LCD_HOME)
        self.cursor_x = 0
        self.cursor_y = 0

    def show_cursor(self):
        # Causes the cursor to be made visible
        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY |
                               self.LCD_ON_CURSOR)

    def hide_cursor(self):
        # Causes the cursor to be hidden
        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY)

    def blink_cursor_on(self):
        # Turns on the cursor, and makes it blink
        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY |
                               self.LCD_ON_CURSOR | self.LCD_ON_BLINK)

    def blink_cursor_off(self):
        # Turns on the cursor, and makes it no blink (i.e. be solid)
        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY |
                               self.LCD_ON_CURSOR)

    def display_on(self):
        # Turns on (i.e. unblanks) the LCD
        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY)

    def display_off(self):
        # Turns off (i.e. blanks) the LCD
        self.hal_write_command(self.LCD_ON_CTRL)

    def backlight_on(self):
        # Turns the backlight on.
        
        # This isn't really an LCD command, but some modules have backlight
        # controls, so this allows the hal to pass through the command.
        self.backlight = True
        self.hal_backlight_on()

    def backlight_off(self):
        # Turns the backlight off.

        # This isn't really an LCD command, but some modules have backlight
        # controls, so this allows the hal to pass through the command.
        self.backlight = False
        self.hal_backlight_off()

    def move_to(self, cursor_x, cursor_y):
        # Moves the cursor position to the indicated position. The cursor
        # position is zero based (i.e. cursor_x == 0 indicates first column).
        self.cursor_x = cursor_x
        self.cursor_y = cursor_y
        addr = cursor_x & 0x3f
        if cursor_y & 1:
            addr += 0x40    # Lines 1 & 3 add 0x40
        if cursor_y & 2:    # Lines 2 & 3 add number of columns
            addr += self.num_columns
        self.hal_write_command(self.LCD_DDRAM | addr)

    def putchar(self, char):
        # Writes the indicated character to the LCD at the current cursor
        # position, and advances the cursor by one position.
        if char == '\n':
            if self.implied_newline:
                # self.implied_newline means we advanced due to a wraparound,
                # so if we get a newline right after that we ignore it.
                pass
            else:
                self.cursor_x = self.num_columns
        else:
            self.hal_write_data(ord(char))
            self.cursor_x += 1
        if self.cursor_x >= self.num_columns:
            self.cursor_x = 0
            self.cursor_y += 1
            self.implied_newline = (char != '\n')
        if self.cursor_y >= self.num_lines:
            self.cursor_y = 0
        self.move_to(self.cursor_x, self.cursor_y)

    def putstr(self, string):
        # Write the indicated string to the LCD at the current cursor
        # position and advances the cursor position appropriately.
        for char in string:
            self.putchar(char)

    def custom_char(self, location, charmap):
        # Write a character to one of the 8 CGRAM locations, available
        # as chr(0) through chr(7).
        location &= 0x7
        self.hal_write_command(self.LCD_CGRAM | (location << 3))
        self.hal_sleep_us(40)
        for i in range(8):
            self.hal_write_data(charmap[i])
            self.hal_sleep_us(40)
        self.move_to(self.cursor_x, self.cursor_y)

    def hal_backlight_on(self):
        # Allows the hal layer to turn the backlight on.
        # If desired, a derived HAL class will implement this function.
        pass

    def hal_backlight_off(self):
        # Allows the hal layer to turn the backlight off.
        # If desired, a derived HAL class will implement this function.
        pass

    def hal_write_command(self, cmd):
        # Write a command to the LCD.
        # It is expected that a derived HAL class will implement this function.
        raise NotImplementedError

    def hal_write_data(self, data):
        # Write data to the LCD.
        # It is expected that a derived HAL class will implement this function.
        raise NotImplementedError

    def hal_sleep_us(self, usecs):
        # Sleep for some time (given in microseconds)
        time.sleep_us(usecs)

pico_i2c_lcd.py

import utime
import gc

from lcd_api import LcdApi
from machine import I2C

# PCF8574 pin definitions
MASK_RS = 0x01       # P0
MASK_RW = 0x02       # P1
MASK_E  = 0x04       # P2

SHIFT_BACKLIGHT = 3  # P3
SHIFT_DATA      = 4  # P4-P7

class I2cLcd(LcdApi):
    
    #Implements a HD44780 character LCD connected via PCF8574 on I2C

    def __init__(self, i2c, i2c_addr, num_lines, num_columns):
        self.i2c = i2c
        self.i2c_addr = i2c_addr
        self.i2c.writeto(self.i2c_addr, bytes([0]))
        utime.sleep_ms(20)   # Allow LCD time to powerup
        # Send reset 3 times
        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)
        utime.sleep_ms(5)    # Need to delay at least 4.1 msec
        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)
        utime.sleep_ms(1)
        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)
        utime.sleep_ms(1)
        # Put LCD into 4-bit mode
        self.hal_write_init_nibble(self.LCD_FUNCTION)
        utime.sleep_ms(1)
        LcdApi.__init__(self, num_lines, num_columns)
        cmd = self.LCD_FUNCTION
        if num_lines > 1:
            cmd |= self.LCD_FUNCTION_2LINES
        self.hal_write_command(cmd)
        gc.collect()

    def hal_write_init_nibble(self, nibble):
        # Writes an initialization nibble to the LCD.
        # This particular function is only used during initialization.
        byte = ((nibble >> 4) & 0x0f) << SHIFT_DATA
        self.i2c.writeto(self.i2c_addr, bytes([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytes([byte]))
        gc.collect()
        
    def hal_backlight_on(self):
        # Allows the hal layer to turn the backlight on
        self.i2c.writeto(self.i2c_addr, bytes([1 << SHIFT_BACKLIGHT]))
        gc.collect()
        
    def hal_backlight_off(self):
        #Allows the hal layer to turn the backlight off
        self.i2c.writeto(self.i2c_addr, bytes([0]))
        gc.collect()
        
    def hal_write_command(self, cmd):
        # Write a command to the LCD. Data is latched on the falling edge of E.
        byte = ((self.backlight << SHIFT_BACKLIGHT) |
                (((cmd >> 4) & 0x0f) << SHIFT_DATA))
        self.i2c.writeto(self.i2c_addr, bytes([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytes([byte]))
        byte = ((self.backlight << SHIFT_BACKLIGHT) |
                ((cmd & 0x0f) << SHIFT_DATA))
        self.i2c.writeto(self.i2c_addr, bytes([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytes([byte]))
        if cmd <= 3:
            # The home and clear commands require a worst case delay of 4.1 msec
            utime.sleep_ms(5)
        gc.collect()

    def hal_write_data(self, data):
        # Write data to the LCD. Data is latched on the falling edge of E.
        byte = (MASK_RS |
                (self.backlight << SHIFT_BACKLIGHT) |
                (((data >> 4) & 0x0f) << SHIFT_DATA))
        self.i2c.writeto(self.i2c_addr, bytes([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytes([byte]))
        byte = (MASK_RS |
                (self.backlight << SHIFT_BACKLIGHT) |
                ((data & 0x0f) << SHIFT_DATA))      
        self.i2c.writeto(self.i2c_addr, bytes([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytes([byte]))
        gc.collect()

注意:记得都要upload到pico里。

main文件代码(upload到pico里面会自动打开)

main.py

import machine
from machine import Pin
from machine import I2C
from lcd_api import LcdApi
from pico_i2c_lcd import I2cLcd
import utime

I2C_ADDR = 0x27
I2C_NUM_ROWS = 4
I2C_NUM_COLS = 20

# 超声波测距,单位:厘米
def getDistance(trigger, echo):
    # 产生10us的方波
    trigger.low()
    utime.sleep_us(2)
    trigger.high()
    utime.sleep_us(10)
    trigger.low()
    end, start = 0, 0
    while echo.value() == 0:
        start = utime.ticks_us()
    while echo.value() == 1:
        end = utime.ticks_us()
    d = (end - start) * 0.0343 / 2 
    return d


# 主程序
trigger = Pin(18, Pin.OUT)
echo = Pin(26, Pin.IN)

while True:
    distance = getDistance(trigger, echo)
    i2c = I2C(0, sda=machine.Pin(0), scl=machine.Pin(1), freq=400000)
    lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)
    lcd.putstr("distance:{:.2f} cm".format(distance))
    utime.sleep(3)
树莓派通过 I2C 驱动 LCD1602 液晶屏 在树莓派上LCD 1602 液晶屏模块的使用非常简单,可以用 I2C 方式的驱动,只要使能0,5V,tx,tf四根线就可实现使能,屏幕上自带调压电阻可以调整亮度对比度。找不到的,用我下面共享的,保存为LCD1602.py作为驱动和程序放在同目录即可。前一阵用废旧的树莓派做了一个NAS服务器,手里还要一块闲置的LCD 1602 液晶屏模块,可以用来实时显示IP,作为NAS的服务器输出显示。注意1,LCD1602模块不显示可以调整一下电阻,亮度太高也不行的。第二步,启用树莓派的I2C功能。 阅读详情

相关推荐

LCD1602液晶显示屏的入门级应用(一)

嵌入式小白,今天用到1602,被CGRAM DDRAM CGROM搞得乱七八糟,特此记录一下,供大家参考。首先,1602液晶显示屏除了电源、地以外,有3个控制引脚 RS R/W E 和8个数据引脚DB0-7。建议8个数据引脚接在同一组上,程序写起来比较简单。硬件连接参考如图。连接上硬件电路,就要写程序了,从名字可以看出来,1602显示两行,每行16个字符,一个字符包含的点阵可以自己设置(后边介绍)...

weixin_42133183的博客 8万+

树莓派-LCD1602

本文讲解有关树莓派使用LCD1602屏幕显示信息的例程

旗狼 905

(七)树莓派系列教程:树莓派4B连接LCD1602液晶显示屏并且显示内容

树莓派连接LCD1602液晶显示屏,并显示内容 一、效果图 所需要硬件: LCD1602液晶显示屏 IIC转接LCD1602模块(转成IIC通讯) 二、设置树莓派,启动IIC通讯功能 因为树莓派刚烧录完系统后IIC功能是没有启动的,在命令行分别输入以下命令: raspi-config ; 进入树莓派设置界面 >>>Interfacing Options ; 设置 >>>P5 I2C ; 选择I2C选项 >>>enable ; 启动I2

K_AAbb的博客 1万+

树莓派驱动IIC协议lcd1602

树莓派iic控制lcd1602

2301_76440321的博客 1364

【树莓派Pico设备驱动】-LCD1602显示屏I2C方式驱动(基于PCF8574)

LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。

视觉与物联智能 864

物联网全栈开发实战系列文章汇总(共1361篇,持续更新)

物联网全栈开发实战专栏将涵盖各类单片机、嵌入式设备及驱动开发实例。从仿真到硬件,从单个实例到综合实例,从单个设备到多个设备的各种方式通信、联网等等。以实例为线索,从硬件到用户终端,掌握物联网全栈开发基础。.................................

视觉与物联智能 1万+

物联网开发笔记(25)- 使用Micropython开发ESP32开发板之控制LCD1602显示屏

使用Micropython开发ESP32开发板之控制LCD1602显示屏

zhusongziye的博客 5220

智能垃圾桶(四)——树莓派pico实现超声波测距(HC-SR04)

pico实现超声波模块

河海大学研究生在读的学习笔记 1899

优信电子所有博客汇总(导航搜索)

本文用于汇总我们发布过的所有有关传感器、单片机、模块以及调试学习心得的文章,优信粉们可以使用 ctrl+F 搜索相关的内容以便快速寻找文章,CSDN为目前我们与用户共同分享学习进步的一个平台,更多的学习内容我们技术人员会逐步更新发布,评论区也可以提交大家需求以便我们有针对性的更新文章!...

优信电子的博客 1万+

Raspberry_Pi_Pico_I2C_1602_LCD_16x2:带有MicroPython的I2C 1602 LCD的Pico的简单用法

Raspberry_Pi_Pico_I2C_1602_LCD_16x2 带有MicroPython的I2C 1602 LCD的Pico的简单用法 我简化了其他人的工作,因为我发现这确实令人困惑。 由于Pico仍然很新,因此我想在此方面帮助其他人。 要开始了解我正在将Qapass 1602A与i2c背包一起使用,如图所示,您的LCD可能有所不同。 我在准确设置时遇到了麻烦,我感到自己并不孤单。 我就像图片一样连接了我的电线,这很重要,因为此代码(main.py)中的一位必须像这样进行接线。 main.py,第14行。'''i2c = I2C(0,scl = Pin(1),sda = Pin(0),freq = 400000)''''''I2C('''之后的零是我说的是这个零,表示您的SDA,SCL位于0、1(像默认值一样) 用于代码设置。 这就是我做的。 我在树莓派4上使用Thonn

HC-SR04:使用Raspberry Pi Pico PIO代码使用HC-SR04读取距离

该存储库已更新并移至 请使用新的存储库! 旧文本: HC-SR04使用Raspberry Pi Pico PIO HC-SR04是超声波测距仪()。 基本上,它通过向Trig引脚发送脉冲并测量Echo引脚上的脉冲来工作。 回波脉冲的长度表示到设备前面的物体的距离。 HC-SR04使用5V,而Pico使用3V3。 因此,回声引脚需要节省一个。 算法 读取HC-SR04的pio代码包含以下步骤: 在HC-SR04的Trig引脚上施加脉冲以开始测量。 数据表指示此脉冲的长度应为10 us 测量回波针上的脉冲长度 等待60毫秒,然后再进行新的测量,以确保没有发现先前测量的回波 设置和读取针脚(如果您之前已经做过的话)是直截了当的,但对于我来说,创建和读取特定长度的脉冲并不适合。 使HC-SR04算法起作用涉及两种类型的定时: 产生触发脉冲的延迟 测量回波脉冲的长度 延迟以确保没有接收

Arduino入门实战:从硬件思维到项目开发的全流程解析

物理计算是连接数字世界与物理世界的核心技术,它通过微控制器读取传感器数据并控制执行器,实现对现实环境的感知与交互。其原理基于嵌入式系统的实时响应与信号处理,技术价值在于降低了硬件开发门槛,使开发者能快速实现智能硬件原型。在智能家居、机器人、物联网等应用场景中,Arduino作为开源硬件平台,以其易用性和丰富的生态成为入门首选。本文以Arduino入门课程为切入点,深入解析如何构建硬件思维,涵盖数字/模拟信号处理、传感器集成和电机控制等核心技能,并通过智能台灯、避障小车等实战项目,系统讲解从电路搭建、代码调试

weixin_33748818的博客 418

树莓派2 I2C 接口 LCD1602显示驱动程序

树莓派2 I2C驱动的LCD1602显示,根据“Arduino IIC I2C 接口 LCD1602转接板程序”改写,在树莓派2中能正常运行

树莓派1602+c语言,树莓派 Pico + LCD1602 显示个性化字符

让 LCD 显示屏显示个性化的字符,有点类似于创作一套 emoji 那样有趣。下面我们介绍实现的方法。用到的东西– 树莓派 Pico– LCD1602 显示屏(带 I2C 模块)– 面包板– 跳线若干接线如图所示接线。SCL-Pin 2 (GP1)SDA-Pin 1(GPO)VCC-Pin 40(VBUS)GND-Pin 38 (GND)编程接线完成下面开始编程。首先确保你的 Pico 已经安装了...

weixin_29291185的博客 1280

PICOBLAZE控制LCD1602的源码.7z

PICOBLAZE控制LCD1602的源码.7z

B站李沐讲论文笔记AlexNet

B站李沐讲论文笔记AlexNet

夏知识不进脑子薇的博客 780

树莓派 使用 i2c 连接 LCD1602/LCD1602A 模块

成品 准备 LCD1602/LCD1602A 模块 IIC LCD1602 拓展板 配置 raspi-config >>> Interfacing Options >>> P5 I2C >>> enabled 连接 拓展板与LCD1602连接(正放LCD1602与拓展板,拓展板在上,拓展板四pin朝向左方) VCC、GND SDA、SCL 分别与树莓派对应连接(3.3v 下方,依次为SDA、SCL) 重启树莓派 代码 ''' 16

Destinyabc的博客 3471

一键转换B站M4S缓存为MP4:无需FFMPEG命令的简易工具

本文介绍了一款专为B站用户设计的绿色工具,可将缓存的M4S视频和音频文件一键转换为通用MP4格式。该工具完全图形化操作,无需学习复杂的FFmpeg命令,解决了普通用户处理B站缓存视频的痛点。文章详细讲解了从下载、配置到转换的完整流程,并提供了常见问题排查与安全使用建议,帮助用户高效、安全地管理离线视频内容。

joy55的博客 475

树莓派玩耍笔记3 -- LCD1602显示篇

本文使用树莓派连接LCD1602 字符显示屏,打印信息,算是树莓派比较基础的功能,也是比较好玩的部分。

longerzone的专栏 3万+

STC32-USB-CAN:基于STC32G的国产双通道隔离CAN分析调试设备设计与实战

本文详细介绍了基于国产STC32G单片机设计双通道隔离CAN分析调试设备的全过程。该设备实现了双通道隔离CAN数据监控、中继转发及USB高速通信,并支持故障注入测试。核心采用全国产器件,通过实战测试验证了其在1Mbps波特率下长时间稳定工作的可靠性,为工程师提供了高性价比的CAN总线调试解决方案。

weixin_42465140的博客 94

脑电数据预处理十四:主成分分析(PCA)用于伪迹去除与降维

本文探讨了主成分分析(PCA)在脑电图(EEG)预处理中的双重应用。针对EEG数据的高维特性和伪迹干扰问题,PCA既可有效去除高振幅伪迹(如眼动、心电等),又能实现数据降维。文章详细解析了PCA的核心原理,包括正交基向量投影和方差最大保留机制,并提供了基于MNE-Python的完整实现方案。通过代码示例展示了PCA在伪迹去除和降维中的具体应用效果,包括功率谱密度和时域波形的可视化对比。虽然ICA在复杂伪迹处理上更具优势,但PCA以其算法简单、计算高效的特点,成为EEG分析流程中不可或缺的基础工具。

qq_32516809的博客 1411

逗比学树莓派之lcd1602显示

树莓派通过GPIO连接1602的效   3 果演示,使用wiringPi库和其附带的LCD   4 库进行GPIO和1602的操作

QRqing 1万+

【完整梳理验证】企业微信第三方应用接入全流程java版

由企业内部的开发者自己开发部署,相当于是企业自己的资产,调用接口基本没有任何限制。由SaaS服务商的开发者开发并部署在服务商侧,面向所有企业。需要企业授权使用(先试用后付费),服务商仅可获取企业授权部分的权限,相当于白名单控制。由服务商的开发者开发,但部署在企业内部。一般是线下签约采购方式,因此权限几乎与自建应用无异,企业管理员只需要配置不对服务商开放的敏感权限,相当于黑名单控制。服务商后台地址:企业微信服务商官网企业管理后台地址:企业微信管理后台服务商,可以理解为 SAAS 中的运营端。企业管理端,可以理

Hello, New World! 2742
上一篇: Codeforces Round 935 (Div. 3) A-E
下一篇: 手把手教会你用yolov8从环境配置到检测任务实战
@KevenDuan
博客等级 码龄6年 5204粉丝 26原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@KevenDuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值