基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与TM1638芯片连接的按键的按键值应用

这篇博客详细介绍了如何在STC12C5A60S2系列1T 8051单片机上使用TM1638键盘数码管模块,包括模块的特性、管脚定义、按键读取原理、显示控制命令寄存器设置,以及具体的编程和实验现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与TM1638芯片连接的按键的按键值应用

STC12C5A60S2系列1T 8051单片机管脚图

在这里插入图片描述在这里插入图片描述

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置

在这里插入图片描述

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍

在这里插入图片描述在这里插入图片描述

TM1638键盘数码管模块概述

TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集
成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。主要应用于冰箱、
空调 、家庭影院等产品的高段位显示屏驱动。

TM1638键盘数码管模块特性说明

• 采用功率CMOS 工艺
• 显示模式 10 段×8 位
• 键扫描(8×3bit)
• 辉度调节电路(占空比8 级可调)
• 串行接口(CLK,STB,DIO)
• 振荡方式:RC 振荡(450KHz+5%)
• 内置上电复位电路
• 采用SOP28封装

TM1638键盘数码管模块管脚定义

在这里插入图片描述

TM1638键盘数码管模块管脚功能说明

在这里插入图片描述

TM1638键盘数码管模块按键读取原理

在这里插入图片描述在这里插入图片描述

TM1638键盘数码管模块按键读取时序

在这里插入图片描述

TM1638键盘数码管模块显示地址寄存器

在这里插入图片描述

TM1638键盘数码管模块键扫数据寄存器

在这里插入图片描述在这里插入图片描述

TM1638键盘数码管模块数据寄存器

在这里插入图片描述

TM1638键盘数码管模块数据命令寄存器

在这里插入图片描述

TM1638键盘数码管模块地址命令寄存器

在这里插入图片描述

TM1638键盘数码管模块显示控制命令寄存器

在这里插入图片描述

TM1638键盘数码管模块数码管串行数据传输

数据接收(写数据)

在这里插入图片描述

数据读取(读数据)

在这里插入图片描述

TM1638键盘数码管模块串行数据地址传输模式时序图

地址自动加1模式时序图

在这里插入图片描述

固定地址模式时序图

在这里插入图片描述

TM1637键盘数码管模块程序设计流程图

地址自动加1模式的程序设计流程图

在这里插入图片描述

固定地址模式的程序设计流程图

在这里插入图片描述

TM1638键盘数码管模块应用电路

TM1638键盘数码管模块驱动共阴数码管硬件电路

在这里插入图片描述

TM1638键盘数码管模块驱动共阳数码管硬件电路

在这里插入图片描述

TM1638键盘数码管模块应用原理图电路

在这里插入图片描述

TM1638键盘数码管模块电气参数

在这里插入图片描述在这里插入图片描述在这里插入图片描述

TM1638键盘数码管模块的数码管显示与TM1638芯片连接的按键的按键值编程

main.c

#include <stc12c5a60s2.h>
#include "Timer0.h"
#include "Key.h"
#include "Digitron.h"
#include "TM1638OfI2C.h"
//#include"intrins.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint

 void PortModeSet()//端口模式设置函数
{
   
   
  P0M1 = 0x00;
  P0M0 = 0x00;
  P1M1 = 0x00;
  P1M0 = 0x00;
  P2M1 = 0x00;
  P2M0 = 0x00;
  P3M1 = 0x00;
  P3M0 = 0x00;
  P4M1 = 0x00;
  P4M0 = 0x00;
 }
 void main()//主函数
{
   
   
  PortModeSet();//端口模式设置函数
//  Uart1Init();//串行口1工作模式1的8位串行口波特率可变初始化函数 波特率为9600bps 晶振为12MHz
  Timer0Init();//定时器0的16位定时模式1用12分频定时2ms初始化函数 晶振为12MHz
  DigitronBootDisplay();//数码管开机显示函数
  TM1638OfI2CInit();//TM1638键盘数码管模块初始化函数 
//  TM1637AutomaticDisplay();//TM1637键盘数码管模块自动显示函数
  while(1)//主循环
 {
   
    
   KeyScanResult();//按键扫描结果函数
  }
 }

TM1638OfI2C.c

#include "TM1638OfI2C.h"
//#include "Key.h"
//#include "Digitron.h"
#include"intrins.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint

 void TM1638OfI2CWriteByte(uchar Data)//TM1638键盘数码管模块写字节函数
{
   
   
  uchar i;//声明字节位个数变量
  for (i = 0; i < 8; i++)//循环字节位个数
 {
   
   
   TM1638CLK = 0;//拉低TM1638键盘数码管模块时钟线端口 让TM1638键盘数码管模块进行输出字节某位操作
   TM1638DIO =  Data & 0x01;//取出该数据的字节最低位 如何取出该数据的字节最低位?为什么是&0x01?而不是|0x01?以两个数据的字节来说明 如:0000 0010 和 0000 0011 它们的最低位分别为0和1 &0x01后是0和1 也是它们的最低位0和1 如果|0x01后都是1 就再也不是它们原来的最低位0和1 
   Data >>= 1;//取出该数据的字节最低位后 剩余字节往右移一位 形成新的数据的字节
   TM1638CLK = 1;//拉高TM1638键盘数码管模块时钟线端口 结束TM1638键盘数码管模块输出字节某位操作
  }
 }
 
 void TM1638OfI2CWriteCommand(uchar Command)//TM1638键盘数码管模块写命令函数
{
   
   
  TM1638STB = 0;//拉低TM1638键盘数码管模块片选线端口 让TM1638键盘数码管模块进行写操作
  TM1638OfI2CWriteByte(Command);//通过TM1638键盘数码管模块写字节函数来写命令
  TM1638STB = 1;//拉高TM1638键盘数码管模块片选线端口 结束TM1638键盘数码管模块写操作
 }

 void TM1638OfI2CWriteData(uchar Address,uint Data)//TM1638键盘数码管模块写数据函数 在指定的显示地址写入数据
{
   
   
  TM1638STB = 0;//拉低TM1638键盘数码管模块片选线端口 让TM1638键盘数码管模块进行写操作
  TM1638OfI2CWriteByte(0x00 | Address);//通过TM1638键盘数码管模块写字节函数来写显示地址
  TM1638OfI2CWriteByte(Data);//通过TM1638键盘数码管模块写字节函数来写数据
  TM1638STB = 1;//拉高TM1638键盘数码管模块片选线端口 结束TM1638键盘数码管模块写操作
 }

 uchar TM1638OfI2CReadByte()//TM1638键盘数码管模块读字节函数
{
   
   
  uchar i;//声明字节位个数变量
  uchar ByteData = 0;//声明字节数据变量
  TM1638DIO = 1;//拉高TM1638键盘数码管模块数据线端口 读入数据
  for(i = 0; i < 8; i++)//循环字节位个数
 {
   
   
   ByteData >>= 1;//字节数据往右移一位 形成新的数据的字节 如:1010 1010 右移一位 变为0101 0101
   TM1638CLK = 0;//拉低TM1638键盘数码管模块时钟线端口 让TM1638键盘数码管模块进行读取字节某位操作
   if(TM1638DIO)//判断TM1638键盘数码管模块数据线端口是否为高电平
   ByteData |= 0x80;//置该数据的字节最高位为1 其余位不变 如何置该数据的字节最高位为1?为什么是|=0x80?而不是&=0x80?以两个数据的字节来说明 如:0100 0000 和 1000 0000 它们的最高位分别为0和1 |=0x80后都是1 也是它们的最高位都置为1 如果&=0x80后最高位分别是0和1 就再也不是它们原来的最高位都置为1 
   TM1638CLK = 1;//拉高TM1638键盘数码管模块时钟线端口 结束TM1638键盘数码管模块读取字节某位操作
  }
  return ByteData;//返回字节数据
 }

 uchar TM1638OfI2CReadKey()//TM1638键盘数码管模块读按键函数
{
   
   
  uchar KeyByteArrary[4];//声明按键字节值数组变量
  uchar i;//声明按键字节值数组个数变量 
  uchar KeyValue = 0;//声明按键数值变量
  TM1638STB=0;//拉低TM1638键盘数码管模块片选线端口 让TM1638键盘数码管模块进行读操作
  TM1638OfI2CWriteByte(0x42); //设置TM1638键盘数码管模块的数据命令寄存器 写键扫数据命令 注意:这里要先写完4个字节键值才能将TM1638STB置1 否则写键值无效
  for (i = 0; i < 4; i++)//循环按键字节值数组中字节值个数 共有4个按键字节值
  KeyByteArrary[i] = TM1638OfI2CReadByte();//发送TM1638ReadByte(0x42)读键扫数据命令后 开始读取按键数据BYTE1—BYTE4共4个字节 从低位开始读取数据 TM1638键盘数码管模块上的K和KS引脚对应的按键按下时 相对应的按键字节值内的字
<think>首先,用户的问题是关于基于51单片机的项目:实现方波频率检测、按键控制LED移位及闪烁频率、数码管显示功能。具体需求是: - 检测P3.0口的方波频率。 - 使用K1键控制LED右移,并根据频率闪烁不同次数。 - 数码管显示0-5。 用户提到了参考站内引用,但引用的内容是关于TM1637键盘数码管模块的,可能数码管显示相关,但用户的需求更广泛。我需要基于这个引用,但用户说“上述引用仅供参考”,所以我应该主要关注用户的实际需求。 系统级指令要求: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 回答结构要清晰,帮助用户逐步解决问题,保证真实可靠。 用户的需求分解: 1. **方波频率检测**:检测P3.0口的方波频率。这通常涉及定时器/计数器。 2. **按键控制LED移位**:K1键控制LED右移。LED可能连接到某个端口,比如P1口。 3. **LED闪烁频率**:LED闪烁频率根据检测到的方波频率变化,闪烁不同次数。 4. **数码管显示**:显示0-5。可能使用数码管模块,如用户提到的TM1637,但用户需求是显示0-5,所以可能是简单的数码管显示。 用户提到“数码管显示0-5”,可能意味着显示数字0到5,或者是显示频率?用户说“数码管显示0-5”,结合上下文,可能是显示一个数字,比如当前状态或频率,但用户指定了0-5,所以或许是一个范围或模式。 回顾用户问题:“数码管显示0-5” – 可能意味着显示数字0、12、3、4、5中的某一个,或者是循环显示?但用户没有指定细节。我需要澄清。 在回答中,我应该逐步设计解决方案。 核心组件: - **51单片机**:如STC89C52或类似,但用户提到STC12C5A60S2,从引用中可以看出,这是1T 8051单片机。 引用[^1]是关于TM1637键盘数码管模块的,描述了其特性:显示模式10段×8位、键扫描(8×3bit)、串行接口(CLK, STB, DIO)等。用户想用数码管显示,所以可能使用这个模块。 用户说“数码管显示0-5”,可能使用TM1637模块显示数字。 另外,按键控制:K1键控制LED右移。用户提到“TM1637键盘数码管模块按键”,所以按键可能来自TM1637模块。 引用中:“TM1637键盘数码管模块数码管显示TM1637芯片连接按键按键”,所以模块数码管按键。 因此,我可以建议使用TM1637模块来实现数码管显示按键输入。 项目总结: - 检测P3.0的方波频率。 - 使用K1键(可能来自TM1637或外部)控制LED右移。 - LED闪烁频率基于检测到的方波频率。 - 数码管显示一些信息,用户说“显示0-5”,可能显示当前频率或状态。 用户说“数码管显示0-5”,这有点模糊。或许在上下文中,它是显示数字0到5,对应于LED的位置或频率范围?我需要假设。 为了清晰,在回答中,我可以定义数码管显示检测到的频率,或者显示一个计数器。 但用户指定“显示0-5”,所以可能显示一个数字从0到5。 或许在按键控制LED移位时,数码管显示当前LED位置(0到5)。 例如,LED从P1.0到P1.7,右移时,位置0到7,但用户说0-5,所以可能只有6个LED?需要指定。 51单片机通常有8位端口,所以LED可能连接到P1口,8个LED。 但用户说“LED移位”,并“显示0-5”,或许数码管显示LED索引从0到5?但索引0到7是8个位置。 用户说“数码管显示0-5”,可能意味着显示数字0、12、3、4、5,或许是频率分档。 为了简化,假设数码管显示一个数字,表示当前状态。 在回答中,我应该定义硬件连接。 建议硬件: - 方波输入:P3.0(T0或T1引脚,用于计数器)。 - LED:连接到P1口,8个LED。 - 按键:K1键,可能连接到P3.2(外部中断0)或使用TM1637的按键。 - 数码管:使用TM1637模块,通过串行接口连接。 从引用,TM1637有CLK、STB、DIO引脚,可以连接单片机的任意IO。 TM1637也支持键扫描,所以按键可以通过TM1637读取。 所以,整体方案: - 使用定时器/计数器检测P3.0的方波频率。 - 使用TM1637显示数码管显示频率或其他。 - 使用TM1637的按键或外部按键作为K1。 - LED闪烁基于频率。 逐步设计: 1. **频率检测**:使用Timer0或Timer1在计数器模式。配置为计数外部脉冲,然后定时测量时间或直接计算频率。 例如,使用门控方式或中断方式。 数学:频率$f = \frac{N}{T}$,其中N是脉冲计数,T是时间间隔。 在代码中实现。 2. **按键控制**:K1键用于LED右移。当按下K1时,LED模式右移一位。 LED初始状态:或许P1.0亮,其他灭。 右移:每次按键,LED亮的位置右移,如从P1.0到P1.1,依此类推。 用户说“控制LED右移”,并“根据频率闪烁不同次数”,所以LED不仅移位,还闪烁。 闪烁频率基于检测到的方波频率。 例如,闪烁次数频率成正比。 3. **LED闪烁**:根据频率闪烁不同次数。或许在移位后,当前LED根据频率闪烁。 闪烁次数:例如,频率高时闪烁次数多。 需要定义映射关系。 4. **数码管显示**:显示0-5。或许显示当前LED位置(0到7)或频率。但用户指定0-5,所以可能显示一个数字0到5,表示状态。 假设数码管显示当前频率范围或LED索引。 为了简单,让数码管显示检测到的频率,但频率可能很大,所以需要缩放或显示部分。 用户说“显示0-5”,所以可能显示一个整数0到5,对应于频率分档。 例如,频率在0-100Hz时显示0,100-200Hz显示1,等等。 但用户没有指定,我需要定义。 在回答中,我可以提供伪代码或C代码。 使用中文回答。 生成相关问题。 引用:在回答中,如果引用段落,添加[^1]。引用是关于TM1637的,所以当提到数码管按键时,可以引用。 回答结构: - 介绍整体方案。 - 分步实现:频率检测、按键处理、LED控制、数码管显示。 - 提供代码示例。 - 生成相关问题。 代码部分:由于涉及多个功能,代码可能较长,但可以提供关键部分。 首先,定义引脚和变量。</think>以下是针对您基于51单片机(如STC12C5A60S2系列)实现方波频率检测、按键控制LED移位及闪烁频率、数码管显示功能的完整解决方案。我将基于您的需求逐步设计,确保结构清晰、真实可靠。您的需求包括: - 检测P3.0口的方波频率。 - K1键控制LED右移(LED连接到P1口),并根据检测到的频率使当前LED闪烁不同次数。 - 数码管显示0-5(这里我假设数码管显示当前LED位置索引0-7,但您指定“0-5”,因此我将映射到0-5显示范围,例如频率分档或LED位置简化显示;实际中可调整)。 硬件参考: - **单片机**:STC12C5A60S21T 8051,高性能,内置定时器/计数器)。 - **方波输入**:P3.0(T0引脚,用于计数器模式)。 - **LED阵列**:连接到P1口(8位,P1.0-P1.7),初始状态P1.0亮(位置0)。 - **按键K1**:使用TM1637键盘数码管模块按键(通过键扫描获取按键),模块的CLK、STB、DIO引脚连接单片机任意IO(如P2.0-P2.2)。TM1637支持8×3键扫描,可读取K1[^1]。 - **数码管显示**:使用TM1637模块10段×8位显示),用于显示数字0-5(例如,显示频率分档或LED位置)。 - **其他**:TM1637模块内置辉度调节和串行接口,简化设计[^1]。 整体方案: 1. **频率检测**:使用Timer0计数器模式测量P3.0方波频率。公式:$f = \frac{N}{T}$,其中$N$是脉冲计数,$T$是定时时间(例如1秒)。 2. **按键处理**:K1键触发外部中断或轮询,实现LED右移(位置索引0-7循环)。 3. **LED闪烁**:基于检测频率,使当前LED闪烁次数变化(频率越高,闪烁次数越多)。 4. **数码管显示**:显示0-5,映射规则:将频率分档(例如0-100Hz档显示0,100-200Hz显示1,以此类推)或LED位置简化(位置0-1显示0,2-3显示1,4-5显示2,6-7显示3;剩余显示4-5备用)。 ### 分步实现 我将用C语言(Keil uVision兼容)编写关键代码。代码包括初始化、频率检测、按键中断、LED控制、数码管显示。 #### 1. 初始化设置 包括定时器、中断、TM1637模块和全局变量定义。 ```c #include <STC12C5A60S2.H> #include <intrins.h> // 定义TM1637引脚(假设连接P2.0-P2.2) sbit TM1637_CLK = P2^0; sbit TM1637_STB = P2^1; sbit TM1637_DIO = P2^2; // 全局变量 unsigned int frequency = 0; // 检测到的频率(Hz) unsigned char led_position = 0; // LED当前位置(0-7) unsigned char display_value = 0; // 数码管显示(0-5) // TM1637初始化函数[^1] void TM1637_Init() { TM1637_STB = 1; TM1637_CLK = 1; } // 向TM1637发送数据 void TM1637_Write(unsigned char data) { unsigned char i; TM1637_STB = 0; for (i = 0; i < 8; i++) { TM1637_CLK = 0; TM1637_DIO = (data & 0x01) ? 1 : 0; _nop_(); TM1637_CLK = 1; data >>= 1; } TM1637_CLK = 0; TM1637_DIO = 1; // 释放DIO TM1637_CLK = 1; TM1637_STB = 1; } // 数码管显示函数(显示0-5) void Display_Number(unsigned char num) { // TM1637显示数字(简化:只显示一位,地址0x00) TM1637_Write(0x40); // 写数据命令 TM1637_Write(0xC0); // 地址0x00 TM1637_Write(num); // 数字0-5的段码(0x3F,0x06,0x5B,0x4F,0x66,0x6D) TM1637_Write(0x8F); // 显示开,辉度8级 } // 定时器0初始化(计数器模式) void Timer0_Init() { TMOD &= 0xF0; // 设置Timer0为模式116位计数器) TMOD |= 0x05; // 计数器模式,门控由TR0控制 TH0 = 0; // 初始计数0 TL0 = 0; TR0 = 1; // 启动Timer0 } // 外部中断0初始化(用于K1按键) void INT0_Init() { IT0 = 1; // 边沿触发 EX0 = 1; // 使能INT0中断 EA = 1; // 全局中断使能 } ``` #### 2. 频率检测 使用Timer0计数P3.0脉冲,结合定时器1计时1秒计算频率。公式:$f = \frac{N}{T}$,其中$T = 1$秒。 ```c // 定时器1初始化(计时1秒) void Timer1_Init() { TMOD &= 0x0F; TMOD |= 0x10; // Timer1模式1 TH1 = 0x3C; // 50ms定时(晶振11.0592MHz) TL1 = 0xB0; ET1 = 1; // 使能Timer1中断 TR1 = 1; // 启动Timer1 } unsigned int pulse_count = 0; unsigned int time_count = 0; // Timer1中断服务程序(每50ms中断一次) void Timer1_ISR() interrupt 3 { TH1 = 0x3C; // 重装初 TL1 = 0xB0; time_count++; if (time_count >= 20) { // 20*50ms=1秒 frequency = TH0 * 256 + TL0; // 读取Timer0计数 TH0 = 0; // 重置计数器 TL0 = 0; time_count = 0; pulse_count = frequency; // 存储频率 // 数码管显示0-5:基于频率分档(示例:0-100Hz=0, 100-200Hz=1, ..., 500-600Hz=5) if (pulse_count <= 100) display_value = 0; else if (pulse_count <= 200) display_value = 1; else if (pulse_count <= 300) display_value = 2; else if (pulse_count <= 400) display_value = 3; else if (pulse_count <= 500) display_value = 4; else display_value = 5; Display_Number(display_value); // 更新数码管 } } ``` #### 3. 按键控制LED右移 K1键触发外部中断0,实现LED右移(位置0-7循环)。每次按键,LED位置增加1(到7后回0)。 ```c // 外部中断0服务程序(K1按键) void INT0_ISR() interrupt 0 { led_position++; // 位置右移 if (led_position > 7) led_position = 0; P1 = (1 << led_position); // 更新LED(例如,位置0: P1=0x01) // 根据频率闪烁当前LED(在main中实现) } ``` #### 4. LED闪烁控制 基于检测频率,使当前LED闪烁。闪烁次数频率成正比(例如,频率每100Hz增加1次闪烁)。在main循环中实现。 ```c void LED_Blink() { unsigned char i, blink_count; // 计算闪烁次数(示例:频率/100,最小1次) blink_count = frequency / 100; if (blink_count < 1) blink_count = 1; if (blink_count > 10) blink_count = 10; // 限制次数 for (i = 0; i < blink_count; i++) { P1 |= (1 << led_position); // LED亮 Delay_ms(200); // 延时200ms P1 &= ~(1 << led_position);// LED灭 Delay_ms(200); } P1 = (1 << led_position); // 恢复常亮 } // 简单延时函数 void Delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) for (j = 0; j < 120; j++); } ``` #### 5. 主函数 整合所有功能,初始化并循环检测。 ```c void main() { TM1637_Init(); // 初始化TM1637 Timer0_Init(); // 初始化Timer0(计数器) Timer1_Init(); // 初始化Timer1(定时器) INT0_Init(); // 初始化外部中断 P1 = 0x01; // 初始LED:P1.0亮 while (1) { // 主循环:持续闪烁当前LED(基于频率) LED_Blink(); // 其他任务(如按键轮询备用,但中断已处理) } } ``` ### 关键说明 - **频率检测精度**:使用Timer0计数和Timer1定时,精度取决于晶振(建议11.0592MHz)。公式$f = \frac{N}{T}$确保可靠测量($T=1$秒时,误差±1Hz)。 - **LED闪烁**:闪烁次数频率线性相关(您可调整映射规则)。闪烁时LED灭亮交替,不影响移位。 - **数码管显示0-5**:我定义为频率分档显示(如0-100Hz→0),但您可改为显示LED位置(0-7映射到0-5:位置0-1→0, 2-3→1, 4-52, 6-7→3, 其他显示4-5)。 - **TM1637使用**:模块简化数码管按键设计,通过串行接口通信。键扫描可读取K1(例如,定义K1对应某个键)[^1]。 - **性能优化**:STC12C5A60S21T单片机,速度快,中断响应及时。 ### 注意事项 - **硬件连接**:确保P3.0输入方波(0-5V),TM1637模块正确接线(VCC、GND、CLK、STB、DIO)。LED加限流电阻。 - **调试建议**:先用示波器验证P3.0方波;测试按键中断;逐步调试闪烁逻辑。 - **扩展性**:如需显示实际频率(非0-5),可修改TM1637显示多位数(但需处理数据转换)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值