STM32-矩阵键盘(中断)

原理

矩阵键盘

在其中3列加上低电平,第x列加上高电平,当检测到第y行出现低电平,说明x行y列有按键按下

执行上述步骤四次,就可以准确知道那个键位按下

中断原理

行的GPIO设置输入,上拉(不输入时默认高电平)

列的GPIO设置推挽输出,初始化低电平

行GPIO对应LINE5~8,使用中断服务函数 EXTI9_5_IRQHandler

当中断产生,先进入中断服务函数,再去判断是哪一根中断线,再开始逐列扫描

注意:不要把多个GPIO映射到同一个中断线上,但多条中断线可以对应一个中断服务函数

实现

GPIO管脚定义

行:F5~F8

列:F1~F4

// Row:F5~F8
#define R1_PIN             GPIO_Pin_5
#define R1_GPIO_PORT       GPIOF
#define R1_GPIO_CLK        RCC_AHB1Periph_GPIOF

#define R2_PIN             GPIO_Pin_6
#define R2_GPIO_PORT       GPIOF
#define R2_GPIO_CLK        RCC_AHB1Periph_GPIOF

#define R3_PIN             GPIO_Pin_7
#define R3_GPIO_PORT       GPIOF
#define R3_GPIO_CLK        RCC_AHB1Periph_GPIOF

#define R4_PIN             GPIO_Pin_8
#define R4_GPIO_PORT       GPIOF
#define R4_GPIO_CLK        RCC_AHB1Periph_GPIOF

// Column:F1~F4
#define C1_PIN             GPIO_Pin_1    
#define C1_GPIO_PORT       GPIOF
#define C1_GPIO_CLK        RCC_AHB1Periph_GPIOF

#define C2_PIN             GPIO_Pin_2
#define C2_GPIO_PORT       GPIOF
#define C2_GPIO_CLK        RCC_AHB1Periph_GPIOF

#define C3_PIN             GPIO_Pin_3
#define C3_GPIO_PORT       GPIOF
#define C3_GPIO_CLK        RCC_AHB1Periph_GPIOF

#define C4_PIN             GPIO_Pin_4
#define C4_GPIO_PORT       GPIOF
#define C4_GPIO_CLK        RCC_AHB1Periph_GPIOF

代码实现

#include "delay.h"
#include "led.h"
#include "key.h"
#include "beep.h"

u8 flag_key = 0;
int key_code = 0;

void GPIO_GIVE() {  //全部置为低电平,中断检测
    GPIO_ResetBits(C1_GPIO_PORT, C1_PIN);
    GPIO_ResetBits(C2_GPIO_PORT, C2_PIN);
    GPIO_ResetBits(C3_GPIO_PORT, C3_PIN);
    GPIO_ResetBits(C4_GPIO_PORT, C4_PIN);
}

void EXTI9_5_IRQHandler(void) {  //中断服务函数
    delay_ms(10);
    if (EXTI_GetFlagStatus(EXTI_Line5) != RESET) {
        delay_ms(10);
        GPIO_ResetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_SetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_SetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_SetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R1_GPIO_PORT, R1_PIN) == 0) {
            delay_ms(10);
            while ((GPIO_ReadInputDataBit(R1_GPIO_PORT, R1_PIN) == 0));
            flag_key = 1;
            key_code = 1;
            EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
        GPIO_SetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_ResetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_SetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_SetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R1_GPIO_PORT, R1_PIN) == 0) {
            delay_ms(10);
            while ((GPIO_ReadInputDataBit(R1_GPIO_PORT, R1_PIN) == 0));
            flag_key = 1;
            key_code = 2;
            EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
        GPIO_SetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_SetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_ResetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_SetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R1_GPIO_PORT, R1_PIN) == 0) {
            delay_ms(10);
            while ((GPIO_ReadInputDataBit(R1_GPIO_PORT, R1_PIN) == 0));
            flag_key = 1;
            key_code = 3;
            EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
        GPIO_SetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_SetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_SetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_ResetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R1_GPIO_PORT, R1_PIN) == 0) {
            delay_ms(10);
            while ((GPIO_ReadInputDataBit(R1_GPIO_PORT, R1_PIN) == 0));
            flag_key = 1;
            key_code = 4;
            EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
    }
    else if (EXTI_GetFlagStatus(EXTI_Line6) != RESET) {
        delay_ms(10);
        GPIO_ResetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_SetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_SetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_SetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R2_GPIO_PORT, R2_PIN) == 0) {
            delay_ms(10);
            while (GPIO_ReadInputDataBit(R2_GPIO_PORT, R2_PIN) == 0);
            flag_key = 1;
            key_code = 5;
            EXTI_ClearITPendingBit(EXTI_Line6); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
        GPIO_SetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_ResetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_SetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_SetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R2_GPIO_PORT, R2_PIN) == 0) {
            delay_ms(10);
            while (GPIO_ReadInputDataBit(R2_GPIO_PORT, R2_PIN) == 0);
            flag_key = 1;
            key_code = 6;
            EXTI_ClearITPendingBit(EXTI_Line6); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
        GPIO_SetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_SetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_ResetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_SetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R2_GPIO_PORT, R2_PIN) == 0) {
            delay_ms(10);
            while ((GPIO_ReadInputDataBit(R2_GPIO_PORT, R2_PIN) == 0));
            flag_key = 1;
            key_code = 7;
            EXTI_ClearITPendingBit(EXTI_Line6); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
        GPIO_SetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_SetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_SetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_ResetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R2_GPIO_PORT, R2_PIN) == 0) {
            delay_ms(10);
            while ((GPIO_ReadInputDataBit(R2_GPIO_PORT, R2_PIN) == 0));
            flag_key = 1;
            key_code = 8;
            EXTI_ClearITPendingBit(EXTI_Line6); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
    }
    else if (EXTI_GetFlagStatus(EXTI_Line7) != RESET) {
        delay_ms(10);
        GPIO_ResetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_SetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_SetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_SetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R3_GPIO_PORT, R3_PIN) == 0) {
            delay_ms(10);
            while (GPIO_ReadInputDataBit(R3_GPIO_PORT, R3_PIN) == 0);
            flag_key = 1;
            key_code = 9;
            EXTI_ClearITPendingBit(EXTI_Line7); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
        GPIO_SetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_ResetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_SetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_SetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R3_GPIO_PORT, R3_PIN) == 0) {
            delay_ms(10);
            while (GPIO_ReadInputDataBit(R3_GPIO_PORT, R3_PIN) == 0);
            flag_key = 1;
            key_code = 10;
            EXTI_ClearITPendingBit(EXTI_Line7); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
        GPIO_SetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_SetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_ResetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_SetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R3_GPIO_PORT, R3_PIN) == 0) {
            delay_ms(10);
            while ((GPIO_ReadInputDataBit(R3_GPIO_PORT, R3_PIN) == 0));
            flag_key = 1;
            key_code = 11;
            EXTI_ClearITPendingBit(EXTI_Line7); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
        GPIO_SetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_SetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_SetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_ResetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R3_GPIO_PORT, R3_PIN) == 0) {
            delay_ms(10);
            while ((GPIO_ReadInputDataBit(R3_GPIO_PORT, R3_PIN) == 0));
            flag_key = 1;
            key_code = 12;
            EXTI_ClearITPendingBit(EXTI_Line7); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
    }
    else if (EXTI_GetFlagStatus(EXTI_Line8) != RESET) {
        delay_ms(10);

        GPIO_ResetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_SetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_SetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_SetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R4_GPIO_PORT, R4_PIN) == 0) {
            delay_ms(10);
            while ((GPIO_ReadInputDataBit(R4_GPIO_PORT, R4_PIN) == 0));
            flag_key = 1;
            key_code = 13;
            EXTI_ClearITPendingBit(EXTI_Line8); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
        GPIO_SetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_ResetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_SetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_SetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R4_GPIO_PORT, R4_PIN) == 0) {

            delay_ms(10);
            while ((GPIO_ReadInputDataBit(R4_GPIO_PORT, R4_PIN) == 0));
            flag_key = 1;
            key_code = 14;
            EXTI_ClearITPendingBit(EXTI_Line8); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }

        GPIO_SetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_SetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_ResetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_SetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R4_GPIO_PORT, R4_PIN) == 0) {
            delay_ms(10);
            while ((GPIO_ReadInputDataBit(R4_GPIO_PORT, R4_PIN) == 0));
            flag_key = 1;
            key_code = 15;
            EXTI_ClearITPendingBit(EXTI_Line8); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }

        GPIO_SetBits(C1_GPIO_PORT, C1_PIN);
        GPIO_SetBits(C2_GPIO_PORT, C2_PIN);
        GPIO_SetBits(C3_GPIO_PORT, C3_PIN);
        GPIO_ResetBits(C4_GPIO_PORT, C4_PIN);
        if (GPIO_ReadInputDataBit(R4_GPIO_PORT, R4_PIN) == 0) {
            delay_ms(10);
            while ((GPIO_ReadInputDataBit(R4_GPIO_PORT, R4_PIN) == 0));
            flag_key = 1;
            key_code = 16;
            EXTI_ClearITPendingBit(EXTI_Line8); //清除LINE0上的中断标志位
            GPIO_GIVE();
            return;
        }
    }
    EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE5上的中断标志位
    EXTI_ClearITPendingBit(EXTI_Line6); //清除LINE6上的中断标志位
    EXTI_ClearITPendingBit(EXTI_Line7); //清除LINE7上的中断标志位
    EXTI_ClearITPendingBit(EXTI_Line8); //清除LINE8上的中断标志位
    GPIO_GIVE();
}



//GPIO初始化程序
void GPIO_SET(void) {             
    RCC_AHB1PeriphClockCmd(C1_GPIO_CLK | C2_GPIO_CLK | C3_GPIO_CLK | C4_GPIO_CLK, ENABLE);
    RCC_AHB1PeriphClockCmd(R1_GPIO_CLK | R2_GPIO_CLK | R3_GPIO_CLK | R4_GPIO_CLK, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = C1_PIN;//列输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
    GPIO_Init(C1_GPIO_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = C2_PIN;//C2列输出
    GPIO_Init(C2_GPIO_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = C3_PIN;//C3列输出
    GPIO_Init(C3_GPIO_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = C4_PIN;//C4列输出
    GPIO_Init(C4_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = R1_PIN;//R1_PIN 行输入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(R1_GPIO_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = R2_PIN;//R2_PIN 行输入
    GPIO_Init(R2_GPIO_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = R3_PIN;//R3_PIN 行输入
    GPIO_Init(R3_GPIO_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = R4_PIN;//R4_PIN 行输入
    GPIO_Init(R4_GPIO_PORT, &GPIO_InitStructure);

    GPIO_GIVE();
}

void EXTIX_Init(void) {          
    NVIC_InitTypeDef NVIC_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
    GPIO_SET(); //按键对应的IO口初始化

    /* 配置EXTI_Line5~8 */
    EXTI_InitTypeDef EXTI_InitStructure;
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource5);//PF5 连接到中断线5
    EXTI_InitStructure.EXTI_Line = EXTI_Line5;//LINE5
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能
    EXTI_Init(&EXTI_InitStructure);//配置

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource6);//PF6 连接到中断线6
    EXTI_InitStructure.EXTI_Line = EXTI_Line6;//LINE6
    EXTI_Init(&EXTI_InitStructure);//配置
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource7);//PF7 连接到中断线7
    EXTI_InitStructure.EXTI_Line = EXTI_Line7;//LINE7
    EXTI_Init(&EXTI_InitStructure);//配置
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource8);//PF8 连接到中断线8
    EXTI_InitStructure.EXTI_Line = EXTI_Line8;//LINE8
    EXTI_Init(&EXTI_InitStructure);//配置

    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;//外部中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;//子优先级2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);//配置

}








 

 

 

 

### 回答1: STM32中断矩阵键盘是一种常见的输入设备,它可以通过矩阵排列的按键来检测用户的输入。在STM32微控制器上使用中断的方式处理矩阵键盘可以提供更高效和快速的输入响应。 首先,要使用STM32中断矩阵键盘,首先需要配置GPIO引脚作为输入模式,并将其连接到键盘矩阵的行和列。然后,我们需要设置外部中断,让微控制器能够捕获键盘按下和释放的事件。 中断矩阵键盘的原理是通过轮询的方式检测按键是否被按下,以及确定哪个按键被按下。当按键被按下时,引发中断,微控制器跳转到中断服务程序。 中断服务程序通常包括以下几个步骤:首先,检测中断是由键盘按下还是释放引起的。然后,确定是哪个按键被按下,通过行和列的组合确定按键的唯一标识。接下来,可以执行相应的操作,例如发送按键编码到串口或控制其他设备的功能。 使用中断的好处是能够实时捕获按键事件,响应速度更快。相对于轮询方式,减少了对系统资源的消耗。 总之,STM32中断矩阵键盘是一种常见的输入设备,它能够通过中断的方式实时捕获用户按键事件。通过合理配置和编程,可以提高系统的输入响应速度和效率。 ### 回答2: 在STM32微控制器中,矩阵键盘的使用可以通过中断来实现。矩阵键盘是一种常用的输入设备,由多个行和列的按键组成,通过行列的交叉点进行按键扫描。 首先,需要配置GPIO引脚作为键盘的行和列,并将其设置为输入模式。然后,需要使用外部中断对行引脚进行触发,并定义中断处理函数。 中断矩阵键盘的基本原理是,当某一行的按键被按下时,相应的中断触发,并进入中断处理函数。在处理函数中,需要判断是哪一列的按键被按下,并根据行列的对应关系来确定具体按键的值。 为了实现中断矩阵键盘的操作,可以通过以下步骤进行: 1. 配置行和列的GPIO引脚,并设置为输入模式。 2. 配置行的中断触发方式,可以选择上升沿触发、下降沿触发或双边沿触发等,具体根据实际情况而定。 3. 定义中断处理函数,在此函数中进行按键的判断和对应操作。可以使用读取列的GPIO状态来确定具体按键的值。 4. 开启中断,并将中断优先级设定为适当的值。可以使用NVIC_SetPriority()函数设置中断优先级。 5. 在主循环中保持运行,等待中断触发。 需要注意的是,中断矩阵键盘的使用需要详细了解键盘的连接配置和按键扫描原理。另外,中断的优先级设置也是需要考虑的重要因素,根据实际需求进行调整。 通过以上步骤的配置和实现,便可在STM32微控制器中使用中断矩阵键盘,并根据按键的情况做出相应的响应或控制操作。 ### 回答3: 在STM32微控制器中,可以使用中断来处理矩阵键盘输入。矩阵键盘是一种常用的输入设备,可以通过将键盘上的按键连接成矩阵的方式,减少使用的IO口。通过使用中断,可以及时地捕获按键的状态改变,并做出相应的处理。 首先,需要配置GPIO口的输入和输出模式,以及使用中断触发条件。对于矩阵键盘,一般使用GPIO口的输入模式,因为需要检测按键的状态。 然后,编写中断服务函数,用于处理按键状态的改变。在中断服务函数中,可以使用GPIO口的中断标志位来判断触发中断的原因,即是否是按键状态的改变。当检测到按键状态的改变后,可以根据按键的位置信息,执行相应的操作,例如发送数据到其他设备或者控制某些功能的开关。 另外,还需要配置NVIC(Nested Vectored Interrupt Controller)控制器,以使其能够对外部中断进行优先级管理。这样可以确保矩阵键盘中断能够被及时处理,并且可以设置不同的中断优先级来满足系统需求。 最后,在主函数中进行初始化和启用中断,以及其他需要的操作。通过配置GPIO口和中断服务函数,可以实现对矩阵键盘输入的监听和响应。 总之,利用STM32微控制器的中断功能,可以实现对矩阵键盘输入的处理。通过配置GPIO口的输入模式和中断触发条件,编写中断服务函数,配置NVIC控制器,以及初始化和启用中断,在主函数中完成对矩阵键盘输入的监听和响应。这样可以实现对矩阵键盘输入的及时处理,从而提高系统的交互性和响应速度。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LoseHu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值