从机械弹跳到数字稳定:矩阵键盘消抖技术的演进与实战

从机械抖动到数字稳定:深入解析按键消抖的物理原理与软件实现 本文深入解析按键消抖的物理原理与软件实现,探讨从机械抖动到数字稳定的技术演进。重点分析51单片机在按键实验中的应用,涵盖独立按键和矩阵按键的消抖算法,包括基础延时消抖、状态机实现及高级数字滤波技术,为嵌入式系统提供可靠的按键处理解决方案。 阅读详情

从机械弹跳到数字稳定:矩阵键盘消抖技术的演进与实战

在嵌入式系统开发中,矩阵键盘作为经典输入设备,其稳定性和响应速度直接影响用户体验。然而,机械按键的物理特性导致的信号抖动问题,一直是工程师需要解决的核心挑战。从早期的硬件滤波到现代的软件算法,消抖技术经历了显著演进,尤其在资源受限的单片机环境中,如何平衡实时性、准确性与资源消耗,成为开发者必须掌握的技能。本文将深入探讨矩阵键盘消抖技术的原理、演进历程及实战应用,帮助读者构建高效可靠的输入处理系统。

1. 矩阵键盘的工作原理与抖动根源

矩阵键盘通过行列扫描机制实现多按键检测,大幅节省I/O资源。以4×4矩阵为例,16个按键仅需8个引脚:4行作为输出,4列作为输入。扫描时,控制器逐行输出低电平并检测列线状态。当某行被拉低时,若该行有按键按下,对应列线会被拉低,通过行列坐标即可确定按键位置。

机械按键的物理结构导致抖动问题不可避免。当按键按下或释放时,金属触点会在毫秒级时间内产生多次弹跳,导致电平快速波动。若不处理,单片机可能误判为多次按键。抖动时间通常持续5-20ms,具体取决于按键材质和结构。例如,蓝桥杯竞赛常用的微动开关抖动时间约10ms,需针对性设计消抖方案。

提示:抖动并非故障而是物理现象,高质量按键抖动时间较短,但无法完全消除。

早期解决方案依赖硬件滤波,常见RC低通电路或施密特触发器。RC电路通过电容充放电平滑信号,但会增加电路复杂度和成本。施密特触发器提供迟滞特性,但需额外芯片。在资源受限的嵌入式系统中,硬件方案逐渐被软件替代,尤其在蓝桥杯等竞赛平台,软件消抖成为主流选择。

2. 传统软件消抖方法与局限性

软件消抖的核心思想是通过延时或状态机规避抖动期。最基础的方法是延时检测:检测到按键变化后延时10-20ms再次检测,若状态一致则确认有效。以下为典型实现代码:

// 简单延时消抖函数
void delay_ms(unsigned int ms) {
    while(ms--) {
        for(int i=0; i<120; i++);
    }
}

uint8_t read_key() {
    if(KEY_PIN == 0) {          // 检测按键按下
        delay_ms(15);           // 跳过抖动期
        if(KEY_PIN == 0) {      // 确认状态
            while(KEY_PIN == 0); // 等待释放
            return 1;
        }
    }
    return 0;
}

这种方法简单易实现,但存在明显缺陷:延时期间CPU被阻塞,无法执行其他任务,导致系统响应性下降。在需要实时处理的应用中,这种方案难以满足要求。

状态机消抖是更高效的解决方案。通过定义按键状态(空闲、抖动检测、按下确认、释放检测),系统无需阻塞等待。以下为四状态实现示例:

typedef enum {
    KEY_IDLE,
    KEY_DEBOUNCE,
    KEY_PRESSED,
    KEY_RELEASE
} key_state_t;

key_state_t key_state = KEY_IDLE;

void key_fsm() {
    switch(key_state) {
        case KEY_IDLE:
            if(KEY_PIN == 0) key_state = KEY_DEBOUNCE;
            break;
        case KEY_DEBOUNCE:
            delay_ms(10);
            if(KEY_PIN == 0) key_state = KEY_PRESSED;
            else key_state = KEY_IDLE;
            break;
        case KEY_PRESSED:
            if(KEY_PIN == 1) key_state = KEY_RELEASE;
            break;
        case KEY_RELEASE:
            // 处理按键事件
            key_state = KEY_IDLE;
            break;
    }
}

状态机方案资源占用更少,但实现复杂度较高,需要合理设计状态转移逻辑。

3. 现代定时器消抖技术与实战应用

现代MCU内置高性能定时器,为消抖提供硬件支持。定时器中断定期扫描按键状态(如每2ms),结合状态机实现非阻塞检测。这种方法在蓝桥杯单片机设计中尤为常见,以下为基于STC15F2K60S2的实现:

#define DEBOUNCE_TIME 5   // 5ms消抖时间

volatile uint8_t key_count = 0;
volatile uint8_t key_pressed = 0;

void timer0_init() {
    TMOD |= 0x01;        // 定时器0模式1
    TH0 = (65536 - 2000) / 256; // 2ms中断
    TL0 = (65536 - 2000) % 256;
    ET0 = 1;             // 使能定时器中断
    TR0 = 1;             // 启动定时器
    EA = 1;              // 全局中断使能
}

void timer0_isr() interrupt 1 {
    static uint8_t last_state = 0xFF;
    uint8_t current_state = P3 & 0x0F; // 读取按键状态
    
    if(current_state == last_state) {
        if(key_count < DEBOUNCE_TIME) key_count++;
    } else {
        key_count = 0;
    }
    
    if(key_count >= DEBOUNCE_TIME) {
        key_pressed = current_state;
    }
    
    last_state = current_state;
}

定时器方案彻底消除阻塞问题,系统可同时处理多项任务。对于矩阵键盘,需结合行列扫描算法。以下示例展示蓝桥杯CT107D开发板的4×4键盘扫描:

uint8_t matrix_scan() {
    uint8_t row, col, key_val = 0;
    
    for(row=0; row<4; row++) {
        P3 = ~(1 << row);      // 逐行拉低
        _nop_();               // 短暂延时稳定信号
        
        col = P4 & 0x0F;       // 读取列状态
        if(col != 0x0F) {
            // 计算键值:行号*4 + 列索引
            while((P4 & 0x0F) != 0x0F); // 等待释放
            return (row << 2) | (__builtin_ffs(~col) - 1);
        }
    }
    return 0xFF; // 无按键
}

实际项目中需考虑多键同时按下的情况(按键冲突)。可通过两次扫描验证:先检测所有按键,再逐行确认,或采用线反转法等更高级算法。

4. 高级功能实现:双击与长按检测

除基本消抖外,现代交互常需识别复杂操作如双击、长按。这些功能需扩展状态机并结合定时计数。以下为双击检测实现方案:

typedef struct {
    uint8_t count;
    uint8_t state;
    uint16_t timer;
} key_data_t;

key_data_t key;

void check_double_click() {
    switch(key.state) {
        case 0: // 等待第一次按下
            if(key_pressed) {
                key.state = 1;
                key.timer = 0;
            }
            break;
        case 1: // 第一次按下消抖
            if(key.timer > 10) { // 10ms后确认
                key.state = 2;
                key.timer = 0;
            }
            break;
        case 2: // 等待释放
            if(!key_pressed) {
                key.state = 3;
                key.timer = 0;
            }
            break;
        case 3: // 等待第二次按下
            if(key.timer < 300) { // 300ms内检测
                if(key_pressed) {
                    key.count = 2;
                    key.state = 4;
                }
            } else {
                key.count = 1; // 单击
                key.state = 0;
            }
            break;
        case 4: // 第二次按下处理
            // 执行双击操作
            key.count = 0;
            key.state = 0;
            break;
    }
}

// 定时器中断中递增计时
void timer_isr() {
    if(key.state != 0) key.timer++;
}

长按检测类似,但需持续监测按下时间。例如,定义超过1秒为长按:

if(key_pressed) {
    hold_timer++;
    if(hold_timer > 500) { // 500*2ms=1s
        // 触发长按操作
        hold_timer = 0;
    }
} else {
    hold_timer = 0;
}

这些高级功能极大丰富交互可能性,但需注意资源消耗和响应实时性的平衡。

5. 优化策略与最佳实践

在实际项目中,消抖算法需根据具体场景优化。以下策略可提升性能:

动态调整消抖时间:不同按键抖动特性可能不同,可根据环境自适应。例如:

// 根据抖动次数动态调整
if(jitter_count > 5) {
    debounce_time = 20; // 高抖动环境
} else {
    debounce_time = 10; // 低抖动环境
}

硬件结合方案:对于关键按键,可结合硬件滤波(如0.1μF电容)减少软件负担。

扫描频率优化:矩阵键盘扫描频率不宜过高或过低。通常10-100Hz足够,过高浪费资源,过低可能漏检快速操作。

以下对比不同消抖方案特性:

方案类型资源消耗实时性实现复杂度适用场景
延时阻塞低差简单简单系统、初学者项目
状态机中良中等多数嵌入式应用
定时器中断高优复杂实时系统、竞赛项目
硬件滤波硬件成本优简单高可靠性要求场合

在蓝桥杯等竞赛中,推荐采用定时器中断+状态机方案,保证实时性的同时兼顾功能完整性。注意避免常见错误如未处理按键释放、未防抖多次触发等。

调试时可通过LED或串口输出状态信息,实时监控按键行为。例如:

if(key_event) {
    printf("Key: %d, State: %d\n", key_num, key_state);
    P0 = ~key_num; // LED显示键值
}

从机械抖动到数字稳定,消抖技术的演进体现了嵌入式系统优化的发展脉络。现代MCU的强大性能使复杂算法成为可能,但理解底层原理仍是设计高效系统的关键。通过合理选择方案、优化参数和严格测试,可构建出响应迅速、稳定可靠的输入处理系统。

蓝桥杯嵌入式国赛实战解析:从寄存器到示波器的硬核调试 嵌入式系统开发本质是软硬件协同的物理过程,其核心在于理解MCU寄存器操作、时序约束与真实信号行为。当GPIO翻转、ADC采样、I2C通信等底层动作脱离理想模型,便需借助示波器观测电平跳变、上升沿时间、总线竞争等物理现象,实现精准调试。这种能力直接决定在资源受限、环境扰动(如温漂、电源波动、EMI)下系统的鲁棒性,广泛应用于工业控制、智能传感与边缘计算终端。蓝桥杯嵌入式国赛正是以此为标尺,将DS18B20单总线时序、LCD1602忙信号失效应对、双MCU事件解耦等典型场景转化为对工程直觉与实测能力的深度考察。 阅读详情

相关推荐

情系淮思:五款车规MCU横向对比与VCU选型

本文对比五款车规MCU中的S32K312与S32K324,聚焦核心架构、存储、通信及安全特性。S32K324为双核160MHz Cortex-M7,内存、外设(如以太网、QuadSPI、SAI)全面升级,支持高实时并行处理与复杂应用;而S32K312为单核120MHz,适用于中端车身控制。两者均满足ASIL B功能安全,具备完整安全引擎。选型建议:中端用S32K312,高端复杂系统优选S32K324。

本不平凡 336

从机械弹跳到数字稳定:单片机按键消抖技术的演进与实战

本文深入探讨单片机按键消抖技术的演进,从机械抖动原理到现代软件算法。重点分析状态机消抖、矩阵键盘优化及双击检测等高级功能实现,为嵌入式开发者提供高可靠性解决方案,提升系统稳定性和用户体验。

docker7nomad的博客 1047

21 硬件工程师笔面试高频考点真题解析——单片机

本文系统介绍了单片机的核心概念与应用知识,包括:单片机定义与选型要点(性能、存储、外设等);核心参数(主频、I/O、通信接口等);最小系统组成(电源、复位、晶振、BOOT);常见外设(GPIO、ADC、定时器等);GPIO工作模式(输入/输出);死机原因分析(硬件干扰、软件错误等);上电故障排查流程(电源、时钟、程序等);与DSP、FPGA的对比(控制vs运算vs可编程);常用通信总线特点(UART、I2C、SPI、CAN);看门狗功能(超时复位防死机)。内容涵盖单片机硬件设计关键要点,适合嵌入式开发者参考

XU157303764的博客 1328

从机械抖动到数字稳定:按键消抖技术的演进与实战优化

本文深入探讨了按键消抖技术的演进,从机械抖动原理到数字稳定方案,重点分析了单片机处理独立按键和矩阵按键的抖动问题。通过对比硬件滤波、软件延时、状态机和定时器中断等方法的优劣,提供了实战优化策略,帮助开发者实现高效可靠的按键输入系统。

sugar的博客 938

【Qt笔记】1.VSCode搭建Qt运行环境

Qt6之后已经抛弃qmake,使用cmake。cmake相对qmake来说只有优点没有缺点。使用VSCode搭建完Qt的运行环境就能开开心心debug了.vscode需要使用的插件:2.Qt tools3.CMakec++插件可以不关注,缺啥都会提醒你.正常安装即可。

没有手牌的博客 2万+

极化码理论及算法研究4-巴氏参数、GA算法以及matlab仿真

目录 (如要找其他内容,欢迎访问我的主页寻找) #前言 #极化码概述 #极化码定义 #极化码编码 #极化码译码 #5G标准中极化码的编译码概述 #5G标准中极化码的编码 #5G标准中极化码的译码 #总结 极化码编码 ...

1万+

从机械抖动到数字稳定:51单片机按键消抖技术的艺术与科学

本文深入探讨51单片机按键消抖技术的原理与实现,从机械抖动现象分析到软件延时和状态机消抖方法,再到硬件RC滤波电路设计。针对矩阵键盘的特殊挑战,提供了多重采样和自适应算法等解决方案,确保在嵌入式系统中实现稳定可靠的按键输入。

beta5的博客 555

autoware 激光-相机联合标定

autoware进行激光-相机联合标定 ~~~ 刚开始进行激光-相机联合标定的时候,出现了不少问题,在此记录一下整体标定流程,以防忘记。在此,特别感谢佳明师弟,在录制数据集时提供的帮助。 ~~~ 0.系统配置: Ubuntu18.04系统 ROS Melodic opencv 3.2.0 vlp-16 一.安装autoware 这部分网上教程挺多的,但我在编译的过程中仍存在不少bug,唉~_~。 二.安装calibration_camera_lidar,从a...

nuo112的博客 1万+

基于单片机的温控风扇控制

具体功能: 1.DS18B20采集温度,数码管显示当前温度值,采用三极管驱动数码管显示; 2.采用PWM调速的原理来实现风扇速度的控制: 当温度低于温度的下限值时,电机不转, 当温度介于上限和下限之间时电机转速缓慢, 当温度大于上限值时,电机全速转动; 3.三个按键可以设置温度上下限; 4.温度测量范围:0-99.9度;

2401_82402501的博客 197

从理论到实践:基于Zemax的高分辨率生物显微镜光学系统仿真与优化指南

本文详细介绍了基于Zemax的高分辨率生物显微镜光学系统仿真与优化全流程。从阿贝分辨率公式、柯勒照明等理论基础出发,逐步讲解Zemax建模、像差优化、制造可行性分析等核心步骤,并提供常见问题解决方案。通过实际案例展示如何将理论设计转化为可制造的优化方案,帮助工程师掌握从仿真到实际应用的关键技术。

weixin_29229989的博客 486

MoveIt2项目想换掉KDL求解器?试试这个trac_ik插件(附源码编译避坑指南)

本文详细介绍了如何在MoveIt2项目中用trac_ik插件替代KDL求解器,提升机械臂运动学求解的效率和成功率。内容涵盖环境准备、源码编译避坑、项目集成及性能调优,特别适合需要高精度控制的协作机械臂应用场景。通过实测数据对比,trac_ik在求解时间和奇异点处理上显著优于传统KDL求解器。

weixin_30730053的博客 699

基本定时器(TIM6/TIM7)

基本定时器最简单,就干一件事:到点了触发中断。定时器本质就是计数器,每个时钟脉冲加1,数到ARR就溢出、产生中断、清0重来。三个核心寄存器:PSC(预分频器):对输入时钟分频CNT(计数器):从0往上数ARR(自动重装载值):数到这个值就溢出,CNT清0,产生更新中断公式:  定时周期 = (PSC+1) × (ARR+1) / 定时器时钟  更新事件频率 = 定时器时钟 / ((PSC+1) × (ARR+1)) 例:TIM6时钟84MHz,要定时0.5秒(2

2401_89890233的博客 283

双目相机立体匹配算法概述(含Python代码)

立体匹配任务是计算机视觉中的一个重要问题,旨在从一对具有相同场景的图像中估计每个像素的视差(disparity)。本文对现有的传统算法和深度学习算法进行了综述,以便于各位选择合适的立体匹配算法用于深度估计或三维建模。

m0_59257547的博客 8295

7-2 按键控制LED流水灯(SDCC + Notepad++ + STC-ISP/普中ISP)

本节基于上节定时器T0设计,实现按键控制LED流水灯。通过配置12MHz晶振下16位定时器模式,初值设为64536(0xFC18),每1毫秒溢出一次,替代原有Delay方法。启用定时器中断,设置TR0启动,TF0标志自动置位触发中断,配合外部按键控制流水灯状态,提升系统实时性与效率。

xunyan6234的博客 92

【Unity程序技巧】Unity中单例模式管理器

单例模式(Singleton Pattern)是 最简单的设计模式之一

秩沅 1660

基于STC8G1K08A单片机的PCA捕获外部信号(100~1000HZ)程序实现

基于STC8G1K08A单片机的PCA捕获外部信号(100~1000HZ)程序实现

weixin_74013772的博客 256

TMS320F28335 学习笔记(二):系统时钟、PLL 与看门狗

本文系统介绍F28335的时钟架构与看门狗应用,涵盖外部晶振、PLL倍频生成系统时钟(SYSCLKOUT)、高速/低速外设时钟分频配置,以及看门狗的启用、关闭与喂狗机制。强调时钟配置准确性对延时、PWM、通信等外设的重要性,指出常见错误如晶振不匹配、未等待PLL锁定、随意修改PLL或喂狗周期过长等问题,并提供初始化框架与验证方法,帮助开发者正确配置时钟系统,确保程序稳定运行。

2403_83044722的博客 378

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

代码小白笔记:江科大 51 单片机 LCD1602 课程详解

本文为单片机新手梳理江科大51课程中LCD1602的驱动逻辑,聚焦“看懂代码”而非深究寄存器。通过解析接线、底层函数(延时、写命令/数据)、初始化流程及光标定位,详解字符、字符串、数字(十进制、十六进制、二进制)的显示原理,核心在于理解“RS控制指令/数据”、“地址映射规则”及“数字转字符”的位运算技巧,帮助读者快速上手并自定义显示内容。

2301_81429079的博客 632

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MCU复位电路不加单片机可行吗?PCB踩坑记

第一版板子长按偶发不触发,经查为Key脚走线穿越DC-DC电感下方,受开关噪声干扰导致判定失败。改用丽晶微EY407-383329(SOT23-6)专用复位ASIC,硬件实现3秒长按、1秒双路互补脉冲输出,无需MCU参与,省去软件消抖与定时器资源。关键点:Key线避开通路、就近加104P去耦、低有效接法正确、输出极性匹配、RESET上拉可靠、扩流器件靠近输出。全靠硬件实现稳定复位,主控死机仍可工作。建议依8项排查清单验证,量产前索取规格书并打样验证。

ELITECHIP_ECM的博客 283

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

MCU 启动流程解析:从 SRAM 到 DDR

MCU 的性能瓶颈通常不在 DDR 带宽,而在访问延迟与确定性。因此,关键代码、中断向量、栈以及功能安全数据应放在片内 SRAM;大块传感器数据缓冲、堆和冷数据则放在 DDR。启动流程的核心可以概括为三步:Boot ROM 搬运、Remap 切换、SRAM 执行。

Where there is life, there is hope. 298

MCU的ADC采样怎么配

一块采集板,室温下读电池电压挺准,一上高低温箱就差出0.3V。软件反复查了三遍,没改一行代码,最后发现是参考电压选错了——电源纹波直接灌进了测量基准。ADC这东西,代码就那么几行,坑全在配置里。这篇拿ATmega16当例子,把采样链路从头讲清:参考电压怎么选、时钟为什么卡在50到200kHz、结果为什么要讲究读取顺序。这些规则不只对AVR成立,换成车规MCU,思路一样。

qq_43241255的博客 197

HAL库基本定时器框架分析

这部分是在main.c里面调用的,使能定时器外设和中断位。实时真正干活的操作在中断处理函数里进行。流程1 定时器外设初始化和中断配置。流程2 使能定时器中断相关位。流程3 中断处理函数。

tecoes的博客 34

PHY内部环回通过,能证明网口整条链路正常吗?

PHY内部环回通过,只能证明该测试路径在记录条件下工作正常,不能直接证明变压器、RJ45、网线和对端组成的整条链路正常。采购收到“环回合格”报告时,应先确认数据从哪里发出、在哪里折返、又在哪里检查。

Voohu_Elsa的博客 196

【QT】系统相关:UDP回显客户端

🎬 艾莉丝的简介: 1.1.3 UI界面布局设计 UI控件组成:布局层级:布局拉伸策略: 1.2.2 widget.cpp实现文件 1.2.3 main.cpp 1.3 关键类型与API原理 1.3.1 quint16 :Qt自定义固定宽度无符号16位整数,等价。 端口号协议规定占2字节(16bit),使用规避C++标准字节长度不确定的平台兼容性问题。 1.3.2 QUdpSocket核心API :发送UDP报文,客户端不需要bind绑定端口,操作系统自动分配临时随机源端口。 信号:套接字缓冲区

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 269

H桥驱动芯片怎么用

实习的时候拿L293D驱动一个小直流电机,程序写的是正转,电机纹丝不动;换了个输入组合,电机动了,芯片烫得发热。后来才明白,H桥的四种状态全写在真值表里,不看表瞎试,轻则不转,重则直通烧管。这篇用L293D当例子,把这张表一次讲透。一、H桥长什么样四个开关管摆成一个H形:电机挂在H中间那一横上,左上、左下、右上、右下各一个开关。对角线导通,电流方向就定死:左上加右下导通,电流从左往右过电机,正转;右上加左下导通,电流反过来,反转。

qq_43241255的博客 315

FWD八位单片机调试问题

一个是加权求平均值,现在是用的峰值来对比恢复电压,可以给采样到的几次峰值进行加权求平均,但它会引入一点时间上的滞后,并且要注意如果电压发生突变,比如说从220V突然跳变到140V或者300V,那采样的第一次是正常电压,加上后面几次不正常的电压进行加权平均,算的值是非常不准的,后面的周期采样会准,但是由于第一次采样不准,很影响后续的分闸合闸操作,对于过欠压的检测这个系统来说是毁灭性打击。LED任务是一个时间敏感任务,需要一个绝对精准的后台来管控,中断拥有绝对的实时性,硬件计时,时间精度很高,并且非阻塞。

qq_63242661的博客 199
上一篇: 从零开始手搓STM32F407系统板【PCB布局→布线→焊接→调试全指南】
下一篇: IAR环境下W25N04外部Flash烧录算法实现与调试
python9snake
博客等级 码龄1天 0粉丝 1724原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值