简介:天微电子TA6932单片机驱动源程序是一份面向嵌入式开发者和电子爱好者的LED数码管控制代码,适用于LED显示屏、仪表盘、家电面板、工业指示器等多种数字动态显示场景。压缩包为rar格式,共14个文件,整体仅22KB,内部包含C语言主程序、头文件、Keil项目文件(uv2)、编译生成的HEX烧录文件,以及备份、选项配置、列表文件和内存映射文件等,覆盖了从源码编辑到编译调试的完整工具链,适合直接打开工程研读或烧录试用。目前已有1536人学习。驱动源码完整实现了TA6932的初始化寄存器设置、段码数据传输、动态扫描刷新、PWM亮度调节以及异常检测等核心模块,并对外提供了调用接口,能够方便地更新数字、字符或自定义图形。通过分析这些代码,可以系统掌握LED数码管显示驱动的时序流程与寄存器操作技巧,同时将其中高效的扫描与调光策略延伸到其他LED驱动芯片,是硬件驱动入门和进阶不可多得的参考资料。
1. TA6932单片机驱动源程序:小家电数码管面板的核心方案
做小家电面板是很容易让人抓狂的事,尤其是电磁炉、电饭煲、空调控制器这类既要数码管显示又要按键输入的产品。我早期用普通IO口直接扫描数码管和按键,结果主循环稍微被其他任务挤占,显示就闪烁,按键更是天天误触发。后来换成带IIC接口的LED驱动芯片,数码管段驱动和按键扫描都交给外围芯片完成,MCU只需要维护两线读写逻辑。TA6932就是这类方案里很常见的一颗,很多国产小家电主控板上都能看到它的身影。这篇文章把TA6932单片机驱动源程序的完整写法拆开讲,从引脚设计、IIC时序、段码表,到显示刷新和读键逻辑,再到移植和排查。适合正在写驱动、准备抄方案或者已经在调试的工程师,照着做能把这块彻底跑通。
2. 看懂TA6932的硬件本质:引脚分配、接口方式与选型理由
2.1 TA6932的引脚与典型接法:数码管、按键、IIC三组信号
先看硬件。TA6932这类芯片对外一般分三组信号:供电与地、IIC总线的SDA/SCL、以及接到数码管和按键的扫描端口。其中扫描端口是一组SEG(段)和GRID(位)引脚,段引脚负责数码管的一个个笔画,位引脚负责选中第几位数码管。按键则是复用扫描矩阵来识别,用户按下某个键时,对应的键值会经过芯片内部扫描后通过IIC总线读出来。
我习惯先画一张最简接线图再写代码:VDD接3.3V或5V,GND接地,SDA和SCL各接一颗4.7k上拉电阻到电源,数码管段脚通过限流电阻接到芯片的SEG引脚,位脚直接接到数码管公共端。按键则分布在GRID和SEG的交叉矩阵上,每个交点一个按键。这里有个常被忽略的细节:限流电阻是用来限制段电流的,不是用来保护引脚的,它的阻值直接决定数码管亮度,后面会专门展开。
从驱动源程序的角度看,硬件决定了软件的工作模式。因为TA6932是IIC接口,MCU侧只要有两个可用的GPIO就能完成通讯,不占用定时器资源,也不需要额外的串转并芯片。这种“两线搞定显示和按键”的接法,在小家电主控板上非常实用——主控MCU可能很便宜,引脚也不多,但通过IIC就能把面板部分全部托出去。
2.2 为什么用IIC接口:和串行口驱动芯片的差异对比
很多工程师一看到“数码管驱动”就想到TM1638那类三线串行接口芯片,甚至有人直接把TM1638的驱动代码拿来改。两者的本质区别在接口时序上:TM1638用的是STB/CLK/DIO三线协议,起停控制由一个片选脚负责,时序更像SPI的变体;TA6932走的是标准IIC协议,有明确的起始条件、停止条件、从机地址和ACK应答。这个差异直接决定了驱动源程序的结构。
从选型角度讲,IIC方案的最大优势是总线可扩展。如果面板上有两片TA6932,或者板上还有其他IIC器件,比如温度传感器、EEPROM,可以全部挂到同一条IIC总线上,只要地址错开就行。而三线串口芯片一般要独享控制脚,多了就要额外占用GPIO。另外IIC的读写是分方向的,读按键这一操作天然就是IIC的“读”流程,所以读键逻辑会比三线芯片更顺手。
当然IIC也有它的脾气。SDA和SCL必须要有上拉电阻,总线才真正可靠,否则波形斜率太差会导致读写时好时坏。其次IIC的时序窗口比较严格,起始、停止、ACK这几种状态都依赖SCL高电平期间的SDA跳变,代码里如果忽略了SDA方向切换,读操作会直接翻车。这些在后面的避坑章节会重点记录。
2.3 电源、上拉与限流电阻的选型细节
电源方面,TA6932这类芯片的VDD范围通常能覆盖3V到5V,但要注意的是数码管驱动电流是从芯片VDD取的。如果你的VDD和MCU共用一组稳压,数码管点亮瞬间的大电流会把电压拉出毛刺,MCU可能因此复位。我一般会在VDD引脚附近加一颗100nF去耦电容,如果面板尺寸大、数码管位数多,还会再加一颗10uF电解电容做储能。
上拉电阻的选择和IIC速率、总线电容都相关。常用的做法是SDA和SCL各接4.7k到VDD;如果总线上挂了多个设备,总线电容变大,可以适当降到2.2k。10k也不是不能用,但波形上升沿会更缓,通讯速率压不上去。用逻辑分析仪看波形时,如果发现SCL高电平像在爬坡,大概率就是上拉过大。
限流电阻则是纯数学问题。数码管每段的压降一般在2V上下,用段电流除以供电电压就能算出阻值。举例:5V供电、每段目标电流5mA,那限流电阻约600欧,取标准值620欧或680欧。阻值太小段电流偏大,芯片发热,数码管还会红得刺眼;阻值太大则显示发暗,白天看不清。这个参数在硬件定型前一定要调好,软件帮不了忙。
3. 驱动源程序的总体结构:从段码表到显示刷新的分层设计
3.1 硬件抽象层:把SDA和SCL引脚抽出来
写TA6932驱动源程序,我习惯先做一层硬件抽象。这样做的直接好处是:代码跟具体MCU平台解耦,从某厂商的8051内核MCU换到另一厂商的ARM内核MCU,只需要改几个宏,驱动逻辑完全不动。很多项目翻车就翻在驱动代码里到处是寄存器操作,换个平台就得重写一遍。
常见的做法是定义一组宏来控制SDA和SCL的输出和输入方向:
// ===== 硬件抽象:请按你所用MCU的GPIO操作方式替换 ===== #define TA6932_SCL_PORT GPIOA #define TA6932_SCL_PIN GPIO_PIN_4 #define TA6932_SDA_PORT GPIOA #define TA6932_SDA_PIN GPIO_PIN_5 // 方向控制:1为输出,0为输入 #define TA6932_SDA_OUT() GPIO_InitTypeDef io = {0}; \ io.Pin = TA6932_SDA_PIN; \ io.Mode = GPIO_MODE_OUTPUT_PP; \ io.Pull = GPIO_PULLUP; \ HAL_GPIO_Init(TA6932_SDA_PORT, &io) #define TA6932_SDA_IN() GPIO_InitTypeDef io = {0}; \ io.Pin = TA6932_SDA_PIN; \ io.Mode = GPIO_MODE_INPUT; \ io.Pull = GPIO_PULLUP; \ HAL_GPIO_Init(TA6932_SDA_PORT, &io) #define TA6932_SCL_H() HAL_GPIO_WritePin(TA6932_SCL_PORT, TA6932_SCL_PIN, GPIO_PIN_SET) #define TA6932_SCL_L() HAL_GPIO_WritePin(TA6932_SCL_PORT, TA6932_SCL_PIN, GPIO_PIN_RESET) #define TA6932_SDA_H() HAL_GPIO_WritePin(TA6932_SDA_PORT, TA6932_SDA_PIN, GPIO_PIN_SET) #define TA6932_SDA_L() HAL_GPIO_WritePin(TA6932_SDA_PORT, TA6932_SDA_PIN, GPIO_PIN_RESET) #define TA6932_SDA_READ() HAL_GPIO_ReadPin(TA6932_SDA_PORT, TA6932_SDA_PIN)这里最关键的宏是TA6932_SDA_IN()和TA6932_SDA_OUT(),它是读按键和写数据之间切换方向用的。如果你用的MCU的GPIO方向配置方式和这个不同,比如寄存器版本,直接在这两个宏里替换成对应操作即可。注意:SDA方向切换是后续读键流程能够成功的必要条件,漏了这一步,读回来的数据会全是高电平。
3.2 软件IIC的时序实现:起始、停止、读写字节
TA6932的通讯协议是IIC,但驱动源程序用软件模拟还是硬件外设,取决于你的工程环境。如果你是在某款8位MCU上做小家电项目,硬件IIC外设未必有,或者IIC引脚被其他功能占用了,那软件模拟是通用做法。软件IIC的代码也不复杂,核心就四个函数:起始、停止、写一个字节、读一个字节。
// ===== 软件IIC底层时序 ===== static void ta6932_iic_delay(void) { // 延时长度决定SCL频率,主频越高循环次数越多。 // 100kHz模式建议延时10us左右,400kHz模式可缩短到1~2us。 volatile uint8_t i = 12; while (i--) ; } static void ta6932_iic_start(void) { SDA_H(); // SDA拉高 SCL_H(); // SCL在高电平期间 ta6932_iic_delay(); SDA_L(); // SDA拉低:生成起始条件 ta6932_iic_delay(); SCL_L(); // 释放时钟,准备传数据 } static void ta6932_iic_stop(void) { SDA_L(); SCL_H(); // SCL先拉高 ta6932_iic_delay(); SDA_H(); // 在SCL高电平期间SDA拉高:生成停止条件 ta6932_iic_delay(); } static void ta6932_iic_write_byte(uint8_t dat) { uint8_t i; for (i = 0; i < 8; i++) { if (dat & 0x80) SDA_H(); // 先写数据位 else SDA_L(); dat <<= 1; SCL_H(); // SCL拉高,让对方采样 ta6932_iic_delay(); SCL_L(); ta6932_iic_delay(); } // 第9个时钟:释放SDA,由从机拉低作为ACK应答 SDA_IN(); // 切换SDA为输入 SCL_H(); ta6932_iic_delay(); // 这里可以读取ACK状态,需要的话存下来 SCL_L(); SDA_OUT(); // 切回输出,继续后续操作 } static uint8_t ta6932_iic_read_byte(void) { uint8_t i, dat = 0; SDA_IN(); // 读模式下SDA必须切换为输入 for (i = 0; i < 8; i++) { SCL_H(); ta6932_iic_delay(); dat <<= 1; if (SDA_READ()) dat |= 0x01; SCL_L(); ta6932_iic_delay(); } // 读完后主机需要回一个非应答(或者应答,看后续操作需求) SDA_OUT(); SDA_H(); SCL_H(); ta6932_iic_delay(); SCL_L(); return dat; }注意看ta6932_iic_write_byte里的第9个时钟,这是ACK的处理窗口。从设备在收到一个字节后会把SDA拉低表示应答,如果SDA保持高电平,说明从设备没响应。排查通讯问题时,第一步就是验证这个ACK是否出现,而不是先怀疑段码表。我一般会用逻辑分析仪抓这里,这一点放到最后一章说。
ta6932_iic_read_byte里的关键词是SDA_IN()。很多移植失败案例的共同点是:写数据阶段结束后,SDA还在输出模式,读的时候总线一直被主机占着,从机根本无法回数据。这就是为什么前面把SDA_IN()单独抽成一个宏。如果你发现按键值读出来总是0xFF,先检查这里。
3.3 段码表与显示驱动:把数字映射到数码管的段
段码表是显示驱动里最容易出错的文件,也最让人头疼。共阴极数码管的标准段码是:位0对应a段,位1对应b段,以此类推,最高位对应小数点。一个数字“0”显示为abcdef断开g段,段码就是0x3F。这个表我每次都会对着原理图核对一遍,因为芯片的段引脚顺序不一定跟你的PCB布线一致。
// ===== 共阴极数码管段码表,按你的PCB丝印调整 ===== static const uint8_t TA6932_NumTable[] = { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F, // 9 0x77, // A 0x7C, // b 0x39, // C 0x5E, // d 0x79, // E 0x71, // F 0x00, // 全灭 0x40, // 负号 - };如果你的面板用的是共阳极数码管,段码需要按位取反,也就是0x3F变成0xC0。这个转换可以在代码里做,也可以在硬件设计时就统一用共阴极。小家电方案里共阴极更常见,因为驱动芯片内部对共阴的支持通常更直接。
这里有一个值得记住的规律:段码表感受到的错误往往是“数字显示成镜像”或者“8字缺一笔”。出现这种情况先别怀疑芯片,仔细看PCB上SEG引脚和数码管段的对应关系。以前某开发者遇到过显示“6”变成“9”的怪问题,查了半天,原来是数据手册上的SEG顺序是从高位开始编号的,他拿别人的表直接抄,没按自己板的走线重新映射。这类问题用代码是调不出来的,改表重编,十分钟搞定。
4. 写显示与读键的核心函数:初始化、刷新、按键扫描全流程
4.1 初始化流程:上电清零、亮度设置、显示使能
初始化函数是整套源程序里最容易被忽略的部分。很多人上电后直接往显示寄存器里写数据,结果数码管开机瞬间全亮乱码,或者亮度默认最亮,刺眼得不忍直视。正确的顺序应该是:先给芯片一个稳定的电源,然后做一次显示清零,再设置亮度和显示开关状态。
// ===== TA6932驱动源程序:初始化 ===== void TA6932_Init(void) { // 1. 上电延时,等VDD稳定 // 具体延时长度取决于你的电源电路,通常5~10ms足够 delay_ms(10); // 2. 写显示控制寄存器,先关闭显示 // 这里的命令字节请以TA6932数据手册为准,下面仅作流程示意 TA6932_WriteReg(TA6932_REG_DISPLAY_CTRL, 0x00); // 3. 清除显示缓冲区,把每一位显示数据都写成全灭段码 for (uint8_t i = 0; i < TA6932_DISPLAY_DIGITS; i++) { TA6932_WriteReg(TA6932_REG_BASE_ADDR + i, 0x00); } // 4. 设置亮度等级 // 亮度等级通常是一个数值范围,等级越高段电流越大 TA6932_WriteReg(TA6932_REG_BRIGHTNESS, TA6932_BRIGHTNESS_MID); // 5. 开启显示 TA6932_WriteReg(TA6932_REG_DISPLAY_CTRL, 0x01); }注意这里的逻辑顺序:先关显示,再清数据,再调亮度,最后开显示。如果顺序颠倒,清屏过程中用户会看到乱码闪烁。这个现象在有强电干扰的小家电产品里尤其明显,上电瞬间电源本来就不干净,初始化顺序错了就是一阵乱跳。
初始化里的“显示控制寄存器”和“亮度寄存器”这两类寄存器,每个芯片厂商的定义都不一样。有的芯片把显示开关和亮度合并到一个寄存器里,有的则分成两个独立配置。这里我只写流程框架,具体的寄存器地址和命令字,必须以你手上那本TA6932数据手册为准。不要在网上找一份代码就硬套,套错了你连问题在哪都不知道。
4.2 显示刷新函数:地址自增写入与消隐处理
显示刷新的常见做法是连续写入模式:先发送起始地址,然后按地址自增顺序一次性写完所有显示位。这种写法比逐位写入省掉了大量重复的起始和停止条件,代码也更简洁。但这个特性要确认一下芯片是否支持,如果支持,函数大概长这样:
// ===== TA6932驱动源程序:显示刷新 ===== void TA6932_Display(uint8_t *seg_data, uint8_t len) { uint8_t i; // 起始信号 TA6932_IIC_Start(); // 发送写命令 + 起始显示地址 // 地址值请查手册,一般是显示缓冲区的首地址 TA6932_IIC_WriteByte(TA6932_CMD_WRITE_DISPLAY); TA6932_IIC_WriteByte(TA6932_DISPLAY_START_ADDR); // 连续写入段码,芯片内部地址自动加1 for (i = 0; i < len; i++) { TA6932_IIC_WriteByte(seg_data[i]); } // 停止信号 TA6932_IIC_Stop(); }如果芯片不支持地址自增,那就改成“发送起始地址 + 写入一个字节 + 重新发送起始地址 + 下一个地址 + 下一个字节”的循环流程。这两者在波形上有明显区别,前者是一个连续的IIC事务,后者是多次独立事务。从代码结构上看,后者只是在循环体里多了start和stop两行,移植成本很低,但每次事务都要重新传地址,通讯时间会变长,对显示刷新率有轻微影响。
还有一个细节叫空位消隐。如果你要显示的数字只有3位,而硬件装了4位数码管,最高位就会把上次残留的数据显示出来。处理方式是在调用刷新函数之前,把不需要的位写成全灭段码0x00。这个处理逻辑不复杂,但很容易被遗漏。我一般会在显示刷新函数内部做一个长度检查,超过范围的位置直接填充0x00,把“业务层忘了清位”这种低级错误挡在驱动层之外。
4.3 按键扫描读取:方向切换与消抖处理
读键是TA6932源程序里最体现细节的部分。IIC总线写数据时SDA是输出模式,而读数据时SDA必须切换成输入模式。这个切换在代码里就一句SDA_IN(),但漏掉它的后果很直接——读回来的字节永远是0xFF或者0x00。这是因为总线一直被主机占用,从机要么没法把数据放到SDA上,要么读到的是上拉电平。
// ===== TA6932驱动源程序:按键读取 ===== uint8_t TA6932_ReadKey(void) { uint8_t key_val = 0x00; // 1. 起始信号 TA6932_IIC_Start(); // 2. 发送读命令(命令字以数据手册为准) TA6932_IIC_WriteByte(TA6932_CMD_READ_KEY); // 3. 关键步骤:把SDA切换为输入方向 // 这一步不执行,后续读到的全是高电平 SDA_IN(); // 4. 读取按键数据字节 key_val = TA6932_IIC_ReadByte(); // 5. 停止信号 TA6932_IIC_Stop(); // 6. 按键消抖:连续两次读取一致才算有效 if (key_val == TA6932_ReadKeyRaw()) { return key_val; } return 0x00; }消抖的处理有快有慢。快速扫描模式下,如果每次都做两次完整读操作,时间成本和中断占用会翻倍。常见折中是只对“非0”的键值做二次确认,0值直接返回。因为用户正常按一个键,按下状态至少持续几十毫秒,而读一次键的时间远小于这个量级,所以二次确认的开销完全可以接受。
读键的扫描结果代表的是整个按键矩阵的状态。有的芯片返回的是位图,每一位对应一个按键;有的返回的是编码值,需要查表得到键号。这两种格式的处理逻辑完全不同:位图用按位与就能判断,编码则要做一次查表。编写源程序时,先把返回值的含义确认清楚再写解析逻辑,宁可多写几行注释把这个搞清楚,也不要靠猜。
如果你的产品里按键和显示共用同样的GPIO扫描机制,那就还要考虑“按键扫描时机”和“显示刷新时机”的配合。有些芯片在扫描按键期间,数码管可能会出现短暂的亮度下掉,这是因为扫描电路被分时复用了。遇到这种情况,通常的解决手段是提高刷新频率,让人的视觉感知不到这个下掉过程。
5. 避坑:TA6932驱动里最常见的5个翻车现场
5.1 上电瞬间数码管全亮乱码
现象:每次上电,数码管都闪一阵乱码,然后才显示正常内容。这个闪动时间从几十毫秒到几百毫秒不等,焊在开发板上不明显,装进产品外壳后很掉档次。
原因:芯片上电后,显示缓冲区的初始状态是不确定的。如果初始化代码里直接设置亮度和开启显示,数码管就会把缓冲区里的随机数据显示出来。再加上电源上电瞬间本身就有毛刺,这个乱码窗口会被拉长。
解决:把初始化顺序严格定为“关显示 → 清所有显示位 → 设亮度 → 开显示”。另外在硬件上,VDD处的去耦电容要给够,至少100nF加10uF的组合,让芯片的数字逻辑在上电期间不反复复位。
5.2 段码错乱,数字显示成镜像或缺笔画
现象:写数字“2”显示成“S”,写“6”显示成“9”,或者某些笔画始终不亮。用万用表量SEG引脚又有输出,芯片看起来没坏,代码检查也找不到明显错误。
原因:段码表的位序跟PCB实际走线不一致。数据手册里的SEG引脚顺序是从某个方向排的,而你的PCB布板时可能绕了一圈,导致SEG1接到的其实是数码管的f段而不是a段。从数据手册抄段码表不校验PCB丝印,必然出这个问题。
解决:写一个测试函数,把所有段逐一亮一遍,记录每个SEG引脚实际控制的是哪个笔画,然后重新生成段码表。这个操作看起来浪费时间,但在新板首件调试时能省出好几个小时。经验是用排除法:让a段单独亮,如果发现亮的是别的笔画,就调整表格对应位。
5.3 亮度等级调了没反应,或者一档过亮一档过暗
现象:初始化里写了亮度寄存器,但数码管亮度完全不变,或者等级之间跨度太大,最小档还是太亮。
原因:亮度寄存器可能和显示控制寄存器是同一个,先写亮度再关显示,等于把亮度配置也关掉了;也可能是写亮度之后没有重新开启显示,新等级没有生效。另一个常见原因是段限流电阻值选得过小,芯片内部亮度调节已经调到最低,但段电流还是远超目标值。
解决:显式检查初始化顺序,把亮度写入放在显示使能之前。硬件上重新计算限流电阻,目标段电流往低里取,留出芯片内部调节的余量。如果产品对功耗敏感,宁可显示亮度稍暗,也不要让亮度调节区间失效。
5.4 读按键永远读到0xFF或0x00
现象:按键怎么按都读不到有效键值,但用逻辑分析仪看IIC波形,写数据部分是正常的,读数据部分全是高电平。
原因:每次按键读取都要求主机把SDA从输出切到输入。软件IIC的代码里,SDA_IN()这条语句被漏掉了,或者切换方向之后没有给总线足够的释放时间就立刻采样,导致读到的是上拉电阻决定的高电平。
解决:在写命令完成之后、读取字节之前,显式执行SDA_IN()并加上至少一个IIC延时的等待时间。另外排查时用逻辑分析仪看SDA在ACK之后是否变成三态或由从机驱动,如果SDA一直是主机驱动的电平,方向切换一定出了问题。
5.5 显示花屏、偶发乱码,像被干扰了一样
现象:产品正常工作时数码管内容偶尔跳变成乱码,过一会儿又自己恢复,没有固定的重现规律。这个现象在开发板上几乎不出现,装进整机后频繁发生。
原因:小家电里往往有继电器、电机、开关电源这类强干扰源。干扰脉冲串进IIC总线,导致某次显示数据写了一半被打断,芯片里的显示缓冲区就留下了半新半旧的数据。由于IIC是边沿采样,一个毛刺就可能让数据位错位。
解决:软件上做“定时重刷”,把显示缓冲区每隔一段时间完整刷新一次,例如主循环里每50ms刷新一次。这样即使某次写入被干扰打断,下一次重刷也会把显示内容校正回来。硬件上在SDA/SCL加RC滤波,或者在IIC走线上串一颗33欧到100欧的电阻,都能有效抑制毛刺。注意不要只做软件而忽略硬件,两者要同时处理。
6. 用逻辑分析仪验收时序,并让驱动支持多片级联
驱动代码写完只是第一步,验证它是否真的符合IIC协议才是关键。我调试任何IIC芯片的第一件事不是看数码管亮不亮,而是用逻辑分析仪抓SDA和SCL两根线的波形,然后对照数据手册检查起始条件、地址字节、ACK位和停止条件的排列。这一步能快速发现地址写错、ACK没收到、SDA方向切换异常这三类最常见问题。倒不是说代码里有什么黑匣子,而是人眼直接看逻辑分析仪的解码结果,比在仿真器里单步调试快得多。
多片级联是这类芯片很实际的需求。TA6932如果支持从机地址配置,两片芯片挂同一条IIC总线就能各管各的数码管和按键。软件上相当于给每片实例一套独立的显示缓冲区和读键逻辑。如果芯片不支持可配置地址,那就只能靠片选方案,一根GPIO控制一片的使能,虽然多占一个引脚,但逻辑更简单。移植时先查手册确认地址支持,再决定层怎么设计。
最后分享一个我自己的习惯:每次拿到一个新的TA6932驱动项目,我都会在头文件里把数据手册的章节号、寄存器定义、需要注意的时序参数按注释写清楚。这份注释跟随代码走,半年后回来改板子,翻一眼注释就能想起当初所有决策。希望这个做法帮到你。
本文还有配套的精品资源,点击获取