STC8G1K08A驱动WS2812八个灯珠实现开机启动扫描效果

整个工程所有文件代码如下
main.c

#include "ws2812.h"
#include"timer.h"



/*功能说明
单片机8G1K08
WS2812引脚接P5.5
烧录时晶振选22.1184M
*/


void main(  )
{
	unsigned char i=0;
	Ws2812Init();
	cmdWorkCnt=forNumber;
	for(i=0;i<taskNumber;i++) 
	{
		if(taskLed[i]>max) 
		{
			max=taskLed[i];
		}
	}
	refreshNumber=max;
	AUXR=0x00;
	WriteRgbNumber(refreshNumber,BLACK);
	Ws2812Refresh(refreshNumber);
	ConfigTimer0(1);
	WDT_CONTR = 0x25;//使能看门狗,溢出时间约为1.1s	
	EA=1;

	while( 1 )	
	{
		WDT_CONTR = 0x35; 	//清看门狗,溢出时间约为1.1s

		
		if( (cmdWorkCnt>0)&&(cmdNumber==0)&&(Number_Down[Wait_delay]==0) )
		{
			if(cmdWorkCnt!=0xFF)cmdWorkCnt--;
			cmdNumber=taskNumber;
			taskStep=0;
			refreshNumber=0;
		}


		if(cmdNumber>0)//1
		{						
			if(Number_Down[Wait_delay]==0)2
			{				
				if(taskLed[taskStep]<=LED_MAX)//3
				{													
					if(taskLed[taskStep]==0)//4
					{
						refreshNumber=max;//接下来刷新最大数量
						WriteRgbNumber(refreshNumber,taskColorR[taskStep],taskColorG[taskStep],taskColorB[taskStep]);																	
					}else  
					{
						if(taskLed[taskStep]>refreshNumber)refreshNumber=taskLed[taskStep];
						WriteRgbOne(taskLed[taskStep],taskColorR[taskStep],taskColorG[taskStep],taskColorB[taskStep]);																	
					}///4								
				}/3
				Number_Down[Wait_delay]=taskWaitTime[taskStep];
				taskStep++;//4
				cmdNumber--;
				styleFig=1;
			}//2

		}/1
	
	
		if(Number_Down[WsOut_delay]==0)
		{
			if(styleFig==1) 
			{
				styleFig=0;
				if(refreshNumber>0)Ws2812Refresh(refreshNumber);
				refreshNumber=0;//清0刷新数
				对需要点亮的灯珠进行输出  降低开销				
			}
		}


		
	}
	
}


config.h

#ifndef __CONFIG_H
#define __CONFIG_H
#include <reg52.h>
#include <intrins.h>
#include "string.h"


#define FOSC 22118400L

#define TASK_MAX 92

typedef unsigned char u8;//给8位数据类型unsigned char取个名字
typedef unsigned int u16;//给16位数据类型unsigned int取个名字

enum //延时任务枚举  最后参数不要加,
{
	 Wait_delay,
    WsOut_delay,
    Time_Delay

};
#define Down_Task  (Time_Delay+1)//向下减数组长度
extern unsigned int Number_Down[Down_Task];     //延时-- 数组




sfr P1M0 = 0x92;
sfr P1M1 = 0x91;
sfr P3M0 = 0xb2;
sfr P3M1 = 0xb1;
sfr P5M0 = 0xca;
sfr P5M1 = 0xc9;
sfr P5=0xC8;
sfr WDT_CONTR = 0xc1;
//sfr AUXR=0x8E;

#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80


//GPIO封装
#define GPIOP0 0x00
#define GPIOP1 0x01
#define GPIOP2 0x02
#define GPIOP3 0x03
#define GPIOP4 0x04
#define GPIOP5 0x05

#define GPIO_Mode_Out_IN 0x00//M1:M0=00为准双向口 01为推挽 10为高阻 11为开漏
#define GPIO_Mode_Out_PP 0x01
#define GPIO_Mode_AIN 0x02 
#define GPIO_Mode_Out_OD 0x03

#define PIN_0 0x01
#define PIN_1 0x02
#define PIN_2 0x04
#define PIN_3 0x08
#define PIN_4 0x10
#define PIN_5 0x20
#define PIN_6 0x40
#define PIN_7 0x80
#define PIN_L4 0x0F
#define PIN_H4 0xF0
#define PIN_ALL 0xFF
//GPIO封装


sfr IPH = 0xB7;
sfr     INTCLKO =   0x8f;
sfr AUXINTIF=0xEF;

sfr     T2L     =   0xd7;
sfr     T2H     =   0xd6;
sfr     IE2     =   0xaf;
#define ET2         0x04
#define T2IF        0x01





void SetGpioMode(unsigned char gpio,unsigned char pin,unsigned char mode);//设置GPIO模式
void IoModeInit();//IO口模式初始化
void TaskDelay();//延时 
#endif

config.c

#include "config.h"

//引脚配置数据缓存
/*
unsigned char P0M1Buf=0;
unsigned char P0M0Buf=0;
*/
unsigned char P1M1Buf=0;
unsigned char P1M0Buf=0;
/*
unsigned char P2M1Buf=0;
unsigned char P2M0Buf=0;
*/
unsigned char P3M1Buf=0;
unsigned char P3M0Buf=0;
/*
unsigned char P4M1Buf=0;
unsigned char P4M0Buf=0;
*/
unsigned char P5M1Buf=0;
unsigned char P5M0Buf=0;
//引脚配置数据缓存

unsigned int Number_Down[Down_Task];     //延时-- 数组
/*******************************************************************************
* 函数功能 : 任务延时
* 函数说明 : 中断1ms调用一次
*******************************************************************************/

void TaskDelay()
{
    unsigned char i;

    for(i = 0; i < Down_Task; i++)
    {
        if(Number_Down[i])//不为0就--
        {
            Number_Down[i]--; //不为0就--
        }
    }
}


void SetGpioMode(unsigned char gpio,unsigned char pin,unsigned char mode)//设置GPIO模式  自己写的函数  为了方便配置引脚
{
/*
	if(gpio==0)
	{
		if(mode==0)//准双向
		{
			P0M1Buf&=~pin;// M1:M0=00为准双向口
			P0M0Buf&=~pin;//
		}else if(mode==1)//推挽
		{
			P0M1Buf&=~pin;// M1:M0=01为推挽
			P0M0Buf|=pin;//
		}else if(mode==2)//模拟输入
		{
			P0M1Buf|=pin;// M1:M0=10为高阻
			P0M0Buf&=~pin;//
		}else if(mode==3)//开漏
		{
			P0M1Buf|=pin;// M1:M0=11为开漏
			P0M0Buf|=pin;//
		}
	}else */if(gpio==1)
	{
		if(mode==0)//准双向
		{
			P1M1Buf&=~pin;// M1:M0=00为准双向口
			P1M0Buf&=~pin;//
		}else if(mode==1)//推挽
		{
			P1M1Buf&=~pin;// M1:M0=01为推挽
			P1M0Buf|=pin;//
		}else if(mode==2)//模拟输入
		{
			P1M1Buf|=pin;// M1:M0=10为高阻
			P1M0Buf&=~pin;//
		}else if(mode==3)//开漏
		{
			P1M1Buf|=pin;// M1:M0=11为开漏
			P1M0Buf|=pin;//
		}
	}/*else if(gpio==2)
	{
		if(mode==0)//准双向
		{
			P2M1Buf&=~pin;// M1:M0=00为准双向口
			P2M0Buf&=~pin;//
		}else if(mode==1)//推挽
		{
			P2M1Buf&=~pin;// M1:M0=01为推挽
			P2M0Buf|=pin;//
		}else if(mode==2)//模拟输入
		{
			P2M1Buf|=pin;// M1:M0=10为高阻
			P2M0Buf&=~pin;//
		}else if(mode==3)//开漏
		{
			P2M1Buf|=pin;// M1:M0=11为开漏
			P2M0Buf|=pin;//
		}
	}*/else if(gpio==3)
	{
		if(mode==0)//准双向
		{
			P3M1Buf&=~pin;// M1:M0=00为准双向口
			P3M0Buf&=~pin;//
		}else if(mode==1)//推挽
		{
			P3M1Buf&=~pin;// M1:M0=01为推挽
			P3M0Buf|=pin;//
		}else if(mode==2)//模拟输入
		{
			P3M1Buf|=pin;// M1:M0=10为高阻
			P3M0Buf&=~pin;//
		}else if(mode==3)//开漏
		{
			P3M1Buf|=pin;// M1:M0=11为开漏
			P3M0Buf|=pin;//
		}
	}/*else if(gpio==4)
	{
		if(mode==0)//准双向
		{
			P4M1Buf&=~pin;// M1:M0=00为准双向口
			P4M0Buf&=~pin;//
		}else if(mode==1)//推挽
		{
			P4M1Buf&=~pin;// M1:M0=01为推挽
			P4M0Buf|=pin;//
		}else if(mode==2)//模拟输入
		{
			P4M1Buf|=pin;// M1:M0=10为高阻
			P4M0Buf&=~pin;//
		}else if(mode==3)//开漏
		{
			P4M1Buf|=pin;// M1:M0=11为开漏
			P4M0Buf|=pin;//
		}
	}*/else if(gpio==5)
	{
		if(mode==0)//准双向
		{
			P5M1Buf&=~pin;// M1:M0=00为准双向口
			P5M0Buf&=~pin;//
		}else if(mode==1)//推挽
		{
			P5M1Buf&=~pin;// M1:M0=01为推挽
			P5M0Buf|=pin;//
		}else if(mode==2)//模拟输入
		{
			P5M1Buf|=pin;// M1:M0=10为高阻
			P5M0Buf&=~pin;//
		}else if(mode==3)//开漏
		{
			P5M1Buf|=pin;// M1:M0=11为开漏
			P5M0Buf|=pin;//
		}
	}

}

void IoModeInit()//IO口模式初始化
{
	P1M1=P1M1Buf;// M1:M0=00为准双向口 01为推挽 10为高阻 11为开漏
	P1M0=P1M0Buf;//
	P3M1=P3M1Buf;// M1:M0=00为准双向口 01为推挽 10为高阻 11为开漏
	P3M0=P3M0Buf;//
	P5M1=P5M1Buf;// M1:M0=00为准双向口 01为推挽 10为高阻 11为开漏
	P5M0=P5M0Buf;//
}

timer.h

#ifndef __TIMER_H
#define __TIMER_H
#include"config.h"

extern unsigned char T0RH;  //T0重载值的高字节
extern unsigned char T0RL;  //T0重载值的低字节

void ConfigTimer0(unsigned int ms);





#endif

timer.c

#include"timer.h"
unsigned char T0RH = 0;  //T0重载值的高字节
unsigned char T0RL = 0;  //T0重载值的低字节

/*******************************************************************************
* 函数功能 : T0配置函数
* 函数说明 : 
*******************************************************************************/
void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;  //临时变量
    
    tmp = FOSC / 12;      //定时器计数频率
    tmp = (tmp * ms) / 1000;  //计算所需的计数值
    tmp = 65536 - tmp;        //计算定时器重载值
    tmp = tmp;           //补偿中断响应延时造成的误差
    T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
    T0RL = (unsigned char)tmp;
    TMOD &= 0xF0;   //清零T0的控制位
    TMOD |= 0x01;   //配置T0为模式1模式:01为16位定时器,02为8位自动重装定时器
    TH0 = T0RH;     //加载T0重载值(自动重装模式只需计算TH0)
    TL0 = T0RL;
    ET0 = 1;        //使能T0中断
    TR0 = 1;        //启动T0
}

stc_it.c

#include"timer.h"




/* T0中断服务函数,用于数码管显示扫描与按键扫描 */
void InterruptTimer0() interrupt 1
{
   
    TH0 = T0RH;  //重新加载初值
    TL0 = T0RL;
	TaskDelay();//延时  1MS执行1次


}

ws2812.h

#ifndef __WS2812_H
#define __WS2812_H
#include"config.h"

#define LED_MAX 8


sbit DIO=P5^5;


#define    Wait400ns        {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}  //388
#define    Wait850ns        {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}        //860


#define BLACK 	0,0,0
#define RED 		255,0,0
#define GREEN 	0,255,0
#define BLUE 	0,0,255
#define YELLOW 	255,255,0
//#define YELLOW 	255,128,0
//#define YELLOW 	221, 156, 0
#define PURPLE   255,0,255//紫
#define CYAN 	0,255,255//青
#define WHITE 	255,255,255

extern unsigned char xdata ledDataR[LED_MAX];
extern unsigned char xdata ledDataG[LED_MAX];
extern unsigned char xdata ledDataB[LED_MAX];
extern unsigned int taskNumber;
extern unsigned char forNumber;
extern unsigned int xdata taskLed[TASK_MAX];
extern unsigned char xdata taskColorR[TASK_MAX];
extern unsigned char xdata taskColorG[TASK_MAX];
extern unsigned char xdata taskColorB[TASK_MAX];
extern unsigned int xdata taskWaitTime[TASK_MAX];
extern bit styleFig;
extern unsigned int refreshNumber;
extern unsigned char cmdWorkCnt;
extern unsigned int cmdNumber;
extern unsigned int taskStep;
extern unsigned char max;//灯最大编号

void Ws2812Init();
void WriteRgbOne(unsigned int num,unsigned char Red,unsigned char Green,unsigned char Blue);	
void WriteRgbNumber(unsigned int num,unsigned char Red,unsigned char Green,unsigned char Blue);	
void Ws2812Refresh(unsigned int count);

#endif 

ws2812.c

#include "ws2812.h"

unsigned char xdata ledDataR[LED_MAX];//
unsigned char xdata ledDataG[LED_MAX];
unsigned char xdata ledDataB[LED_MAX];
unsigned int taskNumber=92;
unsigned char forNumber=1;
unsigned int xdata taskLed[TASK_MAX]={1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,7,7,6,6,5,5,4,4,3,3,2,2,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,1,1,2,2,3,3,4,4,5,5,6,6,7,1,1,2,2,3,3,4,4,5,5,6,1,1,2,2,3,3,4,4,5,1,1,2,2,3,3,4,1,1,2,2,3,1,1,2,1};
unsigned char xdata taskColorR[TASK_MAX]={255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,0xFF,255,0,255,0,255,0,255,0,255,0,255,0,0xFF,255,0,255,0,255,0,255,0,255,0,0xFF,255,0,255,0,255,0,255,0,0xFF,255,0,255,0,255,0,0xFF,255,0,255,0,0xFF,255,0,0xFF,0xFF};
unsigned char xdata taskColorG[TASK_MAX]={255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,0xFF,255,0,255,0,255,0,255,0,255,0,255,0,0xFF,255,0,255,0,255,0,255,0,255,0,0xFF,255,0,255,0,255,0,255,0,0xFF,255,0,255,0,255,0,0xFF,255,0,255,0,0xFF,255,0,0xFF,0xFF};
unsigned char xdata taskColorB[TASK_MAX]={255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,0xFF,255,0,255,0,255,0,255,0,255,0,255,0,0xFF,255,0,255,0,255,0,255,0,255,0,0xFF,255,0,255,0,255,0,255,0,0xFF,255,0,255,0,255,0,0xFF,255,0,255,0,0xFF,255,0,0xFF,0xFF};
unsigned int xdata taskWaitTime[TASK_MAX]={30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,0x1E,30,0,30,0,30,0,30,0,30,0,30,0,0x1E,30,0,30,0,30,0,30,0,30,0,0x1E,30,0,30,0,30,0,30,0,0x1E,30,0,30,0,30,0,0x1E,30,0,30,0,0x1E,30,0,0x1E,0x1E};
bit styleFig=0;
unsigned int refreshNumber=0;
unsigned char cmdWorkCnt=0;
unsigned int cmdNumber=0;
unsigned int taskStep=0;
unsigned char max=0;//灯最大编号

void Ws2812Init()
{
	SetGpioMode(GPIOP5,PIN_5,GPIO_Mode_Out_PP);//设置GPIO模式   GPIO_Mode_Out_IN准双向 GPIO_Mode_Out_PP推挽 GPIO_Mode_AIN高阻GPIO_Mode_Out_OD开漏
	IoModeInit();
	DIO=0;
}

void Send0(void)
{
	
	DIO=1;
	Wait400ns;
	DIO=0;
	Wait850ns;
	
}

void Send1(void)
{
	
	DIO=1;
	Wait850ns;
	DIO=0;
	Wait400ns;
	
}

void Ws2812Rest(void)
{
	
  DIO=0;
  Number_Down[WsOut_delay]=2;		
	
}

void WriteRgbOne(unsigned int num,unsigned char Red,unsigned char Green,unsigned char Blue)	
{
	ledDataR[(num-1)]=Red;
	ledDataG[(num-1)]=Green;
	ledDataB[(num-1)]=Blue;
}


void WriteRgbNumber(unsigned int num,unsigned char Red,unsigned char Green,unsigned char Blue)	
{
	unsigned int i=0;
	for(;i<num;i++)
	{
		ledDataR[i]=Red;
		ledDataG[i]=Green;
		ledDataB[i]=Blue;
	}
}

void Ws2812Refresh(unsigned int count)
{
	unsigned int i=0;
    EA = 0;        //关中断
	for(;i<count;i++)
	{
		if((ledDataG[i]&0x80)==0)	Send0();	else Send1();//G
		if((ledDataG[i]&0x40)==0)	Send0();	else Send1();
		if((ledDataG[i]&0x20)==0)	Send0();	else Send1();
		if((ledDataG[i]&0x10)==0)	Send0();	else Send1();
		if((ledDataG[i]&0x08)==0)	Send0();	else Send1();
		if((ledDataG[i]&0x04)==0)	Send0();	else Send1();
		if((ledDataG[i]&0x02)==0)	Send0();	else Send1();
		if((ledDataG[i]&0x01)==0)	Send0();	else Send1();
		
		if((ledDataR[i]&0x80)==0)	Send0();	else Send1();//R
		if((ledDataR[i]&0x40)==0)	Send0();	else Send1();
		if((ledDataR[i]&0x20)==0)	Send0();	else Send1();
		if((ledDataR[i]&0x10)==0)	Send0();	else Send1();
		if((ledDataR[i]&0x08)==0)	Send0();	else Send1();
		if((ledDataR[i]&0x04)==0)	Send0();	else Send1();
		if((ledDataR[i]&0x02)==0)	Send0();	else Send1();
		if((ledDataR[i]&0x01)==0)	Send0();	else Send1();

		if((ledDataB[i]&0x80)==0)	Send0();	else Send1();//B
		if((ledDataB[i]&0x40)==0)	Send0();	else Send1();
		if((ledDataB[i]&0x20)==0)	Send0();	else Send1();
		if((ledDataB[i]&0x10)==0)	Send0();	else Send1();
		if((ledDataB[i]&0x08)==0)	Send0();	else Send1();
		if((ledDataB[i]&0x04)==0)	Send0();	else Send1();
		if((ledDataB[i]&0x02)==0)	Send0();	else Send1();
		if((ledDataB[i]&0x01)==0)	Send0();	else Send1();		
	}
    EA = 1;        //开中断
    
	Ws2812Rest();

}


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: STC8G1K08A是一款单片机,而WS2812是一种常用的RGB LED驱动芯片。 STC8G1K08A是中国STC公司推出的高性能8位单片机。它具有32KB的Flash存储器和1KB的RAM,可以通过16位的地址总线来访问外部存储器。该单片机支持多种数字和模拟接口,包括串行通信接口、定时器和计数器、ADC等。它适用于各种应用场合,如工业自动化、家用电器、通信设备等。 而WS2812是一种集成了RGB LED和控制电路的LED驱动芯片。它可以通过单一的数据线进行级联,并且具有内置的时序控制电路,可以通过简单的串行通信协议来实现LED的颜色和亮度控制。这种芯片非常方便使用,适合用于各种需要彩色灯光效果的场合,如彩灯、灯带、背光等。 将STC8G1K08AWS2812结合使用,可以实现通过单片机控制WS2812的亮度和颜色,从而实现各种灯光效果STC8G1K08A可以通过串行通信接口(如SPI或者USART)发送数据给WS2812,控制每个LED的颜色和亮度,实现闪烁、渐变、呼吸等多种有趣的灯光效果。此外,STC8G1K08A还可以通过定时器和计数器功能实现LED的定时控制。 综上所述,STC8G1K08AWS2812的结合可以实现高性能的LED灯光控制应用,广泛应用于家庭、商业和舞台灯光领域。 ### 回答2: STC8G1K08A 是一款由STC公司生产的单片机,它是基于8位汇编语言的高性能微控制器。该芯片具有低功耗、高集成度和易于编程等特点,在各种嵌入式应用中广泛应用。 WS2812 是一种数字可编程LED灯带,具有内置控制电路和可编程芯片,可以通过串行通信协议控制。它具有灵活的控制方式、丰富多彩的颜色效果和简单的接口等特点。 STC8G1K08AWS2812可以结合使用来实现各种有关LED灯带的应用。STC8G1K08A作为控制芯片,可以使用串行通信协议与WS2812进行通信,通过控制WS2812的亮度和颜色来实现灯带的控制。 在具体应用中,可以通过STC8G1K08A的GPIO口与WS2812的数据引脚相连接,以控制灯带的亮灭和颜色变化。STC8G1K08A可以编写程序,实现各种灯带效果,如单色、多彩、渐变、闪烁等。 除了控制LED灯带,STC8G1K08A还可以与其他传感器、外设等进行连接,实现更多功能的应用。利用STC8G1K08A的强大功能和WS2812的灵活性,我们可以在各种场景中实现有趣的灯光效果,如室内装饰、舞台表演、汽车照明等。 总之,STC8G1K08AWS2812的组合使得我们能够实现对LED灯带的精确控制和多样化效果,为我们的项目提供了更多的创造空间和应用可能性。 ### 回答3: STC8G1K08A是一种单片机芯片,具有非常强大的功能与性能。它属于STC公司推出的8位单片机家族,以其低功耗和高性能而备受推崇。 WS2812则是一种集成了RGB LED灯珠和控制电路的智能LED灯带。它能够根据控制信号改变LED灯的颜色、亮度和效果,具有动态灯效、节能环保、寿命长等特点。 而stc8g1k08a ws2812则是指在STC8G1K08A单片机上使用WS2812智能LED灯带的实现方案。在这个方案中,STC8G1K08A单片机被用作控制WS2812灯带的主控芯片,通过发送特定的控制信号来实现对灯带的控制。 通过使用stc8g1k08a ws2812方案,我们可以实现丰富多样的灯效,如呼吸灯、跑马灯、流水灯等。此外,STC8G1K08A单片机还具有丰富的GPIO口和强大的计算能力,可以轻松实现WS2812灯带的各种互动效果。 总的来说,stc8g1k08a ws2812方案是一种强大而灵活的嵌入式系统设计方案,使我们能够方便地控制WS2812智能LED灯带,创造出各种令人惊艳的灯光效果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小白q_5793545

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

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

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

打赏作者

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

抵扣说明:

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

余额充值