(SKU:DFR0626)MCP23017 IIC to 16 digital IO expansion module
目录 |
简介
这是一款基于MCP23017芯片的IO扩展模块,该模块可以为您的微控制器额外添加16个IO口。扩展板可设置8个IIC地址,这意味着一块主控上最多能级联8个模块,最多可扩展128个IO口。该扩展板解决了机器人、互动媒体等项目IO口不够的问题。
IO扩展板有2组IO引脚,分别为GPIOA和GPIOB,每组有8位独立IO口,且每个IO口可被独立设置为输入、输出、上拉输入(内部接100KΩ上拉电阻)、中断等模式。此外,该模块还有2个中断信号引脚IA和IB,其中IA用于检测GPIOA组的IO口是否发生中断,IB用于检测GPIOB组的IO口是否发生中断,当GPIOA或GPIOB中某个引脚发生中断,则相应的IA或IB引脚会产生一个高电平信号。
应用场景
- 机器人
- 互动媒体
- 光立方
技术规格
- 接口供电电压:3.3V-5.5V
- IIC地址:0x20~0x27
- Digital I/O 数字输入/输出端: PA0~PA7,PB0~PB7
- IO口驱动电流: 20mA
- 中断信号引脚:IA、IB
- 产品尺寸:44*32mm
引脚说明
标号 | 名称 | 功能描述 |
1 | +/VCC | 电源正极 |
2 | -/GND | 电源负极 |
3 | C | IIC时钟线 |
4 | D | IIC数据线 |
5 | RST | 复位引脚 |
6 | IA | GPIOA中断检测引脚 |
5 | IB | GPIOB中断检测引脚 |
6 | PWR | 电源指示灯 |
7 | A0/A1/A2 | IIC地址切换开关 |
数字IO口简介表 | ||||||||
---|---|---|---|---|---|---|---|---|
组别 | 引脚编号 | |||||||
GPIOA | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
PA0 | PA1 | PA2 | PA3 | PA4 | PA5 | PA6 | PA7 | |
GPIOB | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
PB0 | PB1 | PB2 | PB3 | PB4 | PB5 | PB6 | PB7 |
上表中的每个数字引脚,都可被设置为输入、输出、上拉输入、中断等引脚模式。
使用教程
准备 |
- 硬件
- 1 x Arduino UNO控制板
- 1 x MCP23017 IIC to 16 digital IO expansion module
- 若干 按钮
- 若干 LED灯
- 软件
- Arduino IDE, 点击下载Arduino IDE
- 点击下载库文件和示例程序
关于如何安装库文件,点击链接
- 主要API接口函数列表
/** * @功能 设置引脚模式,可设置为输入、输出或上拉输入100 kΩ(内部上拉电阻) * @参数 引脚号,可以是ePin_t中包含的所有枚举值(eGPA0-eGPB7/ 0-15)。 * @参数 模式, 可以是 INPUT, OUTPUT, INPUT_PULLUP * @返回 如果设置成功,则返回0,否则返回非0。 */ int pinMode(ePin_t pin, uint8_t mode); /** * @功能 写数字引脚。写之前需要将引脚设置为输出模式。 * @参数 引脚号,可以是ePin_t中包含的所有枚举值(eGPA0-eGPB7/ 0-15)。 * @参数 高低电平 1(HIGH)或0(LOW) * @返回 如果写入成功,则返回0,否则返回非0。 */ int digitalWrite(ePin_t pin, uint8_t level); /** * @功能 读引脚。读取之前需要将pin设置为输入模式。 * @参数 引脚号,可以是ePin_t中包含的所有枚举值(eGPA0-eGPB7/ 0-15)。 * @返回 返回高低电平 */ int digitalRead(ePin_t pin); /** * @功能 设置一个引脚为中断模式 * @参数 引脚号,可以是ePin_t中包含的所有枚举值(eGPA0-eGPB7/ 0-15)。 * @参数 中断模式:eInterruptMode_t中包含的所有枚举值。 * @参数 中断服务函数,需要用户定义和传递参数。函数原型: void func(int) */ void pinModeInterrupt(ePin_t pin, eInterruptMode_t mode, MCP23017_INT_CB cb); /** * @功能 轮询某组端口是否发生中断 * @参数 group 端口组,可填eGPIOGrout_t包含的所有枚举值GPIO A组(eGPIOA)、GPIO B组(eGPIOB)A+B组(eGPIOALL) * @n 填eGPIOA,则轮询A组端口是否发生中断 * @n 填eGPIOB,则轮询B组端口是否发生中断 * @n 填eGPIOALL,则轮询A组和B组端口是否发生中断 * @n 不填,默认轮询A组和B组所有端口是否发生中断 */ void pollInterrupts(eGPIOGrout_t group=eGPIOALL); /** * @功能 将引脚转为字符串描述 * @参数 引脚号,可以是ePin_t中包含的所有枚举值(eGPA0-eGPB7/ 0-15)。 * @返回 返回引脚描述字符串 * @n 如"GPIOA0" "GPIOA1" "GPIOA2" "GPIOA3" "GPIOA4" "GPIOA5" "GPIOA6" "GPIOA7" * @n "GPIOB0" "GPIOB1" "GPIOB2" "GPIOB3" "GPIOB4" "GPIOB5" "GPIOB6" "GPIOB7" * @n "eGPA" "eGPB" */ String pinDescription(ePin_t pin); /** * @功能 将引脚转为字符串描述 * @参数 引脚号,范围0-15 * @返回 返回引脚描述字符串 * @n 如"GPIOA0" "GPIOA1" "GPIOA2" "GPIOA3" "GPIOA4" "GPIOA5" "GPIOA6" "GPIOA7" * @n "GPIOB0" "GPIOB1" "GPIOB2" "GPIOB3" "GPIOB4" "GPIOB5" "GPIOB6" "GPIOB7" * @n "eGPA" "eGPB" */ String pinDescription(int pin); |
拨码开关与IIC地址关系 |
拨码开关配置与IIC地址的对应关系 | |||
---|---|---|---|
拨码开关 | IIC地址 | ||
A2 | A1 | A0 | addr |
0 | 0 | 0 | 0x20 |
0 | 0 | 1 | 0x21 |
0 | 1 | 0 | 0x22 |
0 | 1 | 1 | 0x23 |
1 | 0 | 0 | 0x24 |
1 | 0 | 1 | 0x25 |
1 | 1 | 0 | 0x26 |
1 | 1 | 1 | 0x27(默认) |
接线图 |
样例代码1 - 按钮输入 |
将IO扩展板的PA0引脚设置为输入模式,并接上按钮,当按钮被按下时,串口打印字符串"Button press!";
/*! * @file buttonInput.ino * @brief Connect a button to the IO expansion board, set a pin of the board(eg: eGPA0) to input mode to detect the button status. * @n Experiment phenomenon: connect a button on a pin of the IO board(eg:eGPA0), detect the level of the pin and print out * @n the button status on serial port. * * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) * @licence The MIT License (MIT) * @author [Arya](xue.peng@dfrobot.com) * @version V1.0 * @date 2019-07-18 * @get from https://www.dfrobot.com * @url https://github.com/DFRobot/DFRobot_MCP23017 */ #include <DFRobot_MCP23017.h> /*DFRobot_MCP23017 constructor *Parameter&wire Wire *Parameter addr I2C address can be select from 0x20~0x27; the relationship of DIP switch(A2, A1, A0) and I2C address(0x27) is *shown below: * 0 0 1 0 | 0 A2 A1 A0 0 0 1 0 | 0 1 1 1 0x27 0 0 1 0 | 0 1 1 0 0x26 0 0 1 0 | 0 1 0 1 0x25 0 0 1 0 | 0 1 0 0 0x24 0 0 1 0 | 0 0 1 1 0x23 0 0 1 0 | 0 0 1 0 0x22 0 0 1 0 | 0 0 0 1 0x21 0 0 1 0 | 0 0 0 0 0x20 */ DFRobot_MCP23017 mcp(Wire, /*addr =*/0x27);//constructor, change the Level of A2, A1, A0 via DIP switch to revise the I2C address within 0x20~0x27. //DFRobot_MCP23017 mcp;//use default parameter, Wire 0x27(default I2C address) //Prepare: connect a button to a digital pin of the IO expansion board(eg: eGPA0) void setup() { Serial.begin(115200); /*wait for the chip to be initialized completely, and then exit*/ while(mcp.begin() != 0){ Serial.println("Initialization of the chip failed, please confirm that the chip connection is correct!"); delay(1000); } /*pinMode function is used to set the pin mode of module Parameter pin, the available parameter is shown below: eGPA0 eGPA1 eGPA2 eGPA3 eGPA4 eGPA5 eGPA6 eGPA7 eGPA 0 1 2 3 4 5 6 7 eGPB0 eGPB1 eGPB2 eGPB3 eGPB4 eGPB5 eGPB6 eGPB7 eGPB 8 9 10 11 12 13 14 15 Parameter mode, can be set to: INPUT, OUTPUT, INPUT_PULLUP(internal 100KΩ pull-up resistor) */ mcp.pinMode(/*pin = */mcp.eGPA0, /*mode = */INPUT); /*Set all Group GPIOA pins to input*/ //mcp.pinMode(/*pin = */mcp.eGPA, /*mode = */INPUT); } void loop() { /*digitalRead function is used to read the Level of a digital pin. The pin needs to be set to input mode before using this function. Parameter pin, the available parameter is shown below: eGPA0 eGPA1 eGPA2 eGPA3 eGPA4 eGPA5 eGPA6 eGPA7 eGPA 0 1 2 3 4 5 6 7 eGPB0 eGPB1 eGPB2 eGPB3 eGPB4 eGPB5 eGPB6 eGPB7 eGPB 8 9 10 11 12 13 14 15 */ uint8_t value = mcp.digitalRead(/*pin = */mcp.eGPA0); /*Read level of Group GPIOA pins*/ //value = mcp.digitalRead(/*pin = */mcp.eGPA); if(value){ Serial.println("Button press!"); delay(200); }else{ //Serial.println("Button release!"); } } |
结果 |
当按下PA0引脚上接的按钮时,串口打印"Button press!",如下图所示:
样例代码2 - 引脚输出 |
将扩展板的PA7设置为输出模式,并接上LED灯,实现1s内LED灯状态切换.
/*! * @file ledOutput.ino * @brief Set a pin of IO expansion board(eg:eGPA7) to output mode, and output High/Low. * @n Experiment phenomenon: the LED connected to the pin of IO board(eg:eGPA7) repeatedly lights up for 1s and turns off 1s. * * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) * @licence The MIT License (MIT) * @author [Arya](xue.peng@dfrobot.com) * @version V1.0 * @eGPAte 2019-07-18 * @get from https://www.dfrobot.com * @url https://github.com/DFRobot/DFRobot_MCP23017 */ #include <DFRobot_MCP23017.h> /*DFRobot_MCP23017 Constructor *Parameter &wire Wire *Parameter addr I2C address can be selected from 0x20~0x27, the relationship of DIP switch (A2,A1,A0) and I2C address (0x27)is shown below: * 0 0 1 0 | 0 A2 A1 A0 0 0 1 0 | 0 1 1 1 0x27 0 0 1 0 | 0 1 1 0 0x26 0 0 1 0 | 0 1 0 1 0x25 0 0 1 0 | 0 1 0 0 0x24 0 0 1 0 | 0 0 1 1 0x23 0 0 1 0 | 0 0 1 0 0x22 0 0 1 0 | 0 0 0 1 0x21 0 0 1 0 | 0 0 0 0 0x20 */ DFRobot_MCP23017 mcp(Wire, /*addr =*/0x27);//constructor, change the Level of A2, A1, A0 via DIP switch to revise I2C address within 0x20~0x27 //DFRobot_MCP23017 mcp;//use default parameter, Wire 0x27(default I2C address) //Prepare: connect the LED to a digital pin of IO expansion board(eg:eGPA7) void setup(void) { Serial.begin(115200); /*wait for the chip to be initialized completely, and then exit*/ while(mcp.begin() != 0){ Serial.println("Initialization of the chip failed, please confirm that the chip connection is correct!"); delay(1000); } /*pinMode function is used to set the pin mode of the module Parameter pin, the available parameter is shown below: eGPA0 eGPA1 eGPA2 eGPA3 eGPA4 eGPA5 eGPA6 eGPA7 eGPA 0 1 2 3 4 5 6 7 eGPB0 eGPB1 eGPB2 eGPB3 eGPB4 eGPB5 eGPB6 eGPB7 eGPB 8 9 10 11 12 13 14 15 Parameter mode, can be set to: INPUT, OUTPUT, INPUT_PULLUP mode (internal 100KΩ pull-up resistor) */ mcp.pinMode(/*pin = */mcp.eGPA7, /*mode = */OUTPUT); /*Set all Group GPIOA pins to output*/ //mcp.pinMode(/*pin = */mcp.eGPA, /*mode = */OUTPUT); } void loop(void) { Serial.println("Pin output high level!"); /*digitalWrite function is used to make the pin output HIGH or LOW. The pin needs to be set to output mode before using this function. Designate a pin on the IO expansion board; parameter pin, the available parameter is shown below: eGPA0 eGPA1 eGPA2 eGPA3 eGPA4 eGPA5 eGPA6 eGPA7 eGPA 0 1 2 3 4 5 6 7 eGPB0 eGPB1 eGPB2 eGPB3 eGPB4 eGPB5 eGPB6 eGPB7 eGPB 8 9 10 11 12 13 14 15 */ mcp.digitalWrite(/*pin = */mcp.eGPA7, /*level = */HIGH); /*Set GPIOIA0-GPIOIA3 to low and GPIOIA4-GPIOIA7 to high*/ //mcp.digitalWrite(/*pin = */mcp.eGPA, /*Port Value = */0xF0); delay(1000); Serial.println("Pin output low level!"); mcp.digitalWrite(/*pin = */mcp.eGPA7, /*level = */LOW); /*Set GPIOIA0-GPIOIA3 to high and GPIOIA4-GPIOIA7 to low*/ //mcp.digitalWrite(/*pin = */mcp.eGPA, /*Port Value = */0x0F); delay(1000); } |
结果 |
连接到PA7上的LED灯,1s亮1s灭以此循环,并串口打印IO口PA7输出电平的状态,如下图所示:
样例代码3 - 查询中断 |
将数字IO口的引脚设置为中断模式,如双边沿跳变中断(eChangeLevel),下降沿中断( eFalling )、上升沿中断(eRising)、高电平中断(eHighLevel)、低电平中断(eLowLevel)等模式。
将PA0、PA1、PB6、PB7分别设置为双边沿跳变中断,下降沿中断,上升沿中断、高电平中断,并接上按钮,轮询并串口打印发生中断的引脚。
/*! * @file pollInterrupt.ino * @brief Set a pin of IO expansion board to interrupt mode, poll if there is an interrupt occurring on the pins of the port. * @n Experiment phenomenon: poll if there is an interrupt occurring on the port group(A, B, A+B), if there is, serial print the pin which is interrupted. * * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) * @licence The MIT License (MIT) * @author [Arya](xue.peng@dfrobot.com) * @version V1.0 * @date 2019-07-18 * @get from https://www.dfrobot.com * @url https://github.com/DFRobot/DFRobot_MCP23017 */ #include <DFRobot_MCP23017.h> DFRobot_MCP23017 mcp(Wire, 0x27);//constructor, change the Level of A2, A1, A0 via DIP switch to revise I2C address within 0x20~0x27. //DFRobot_MCP23017 mcp;//use default parameter, Wire 0x27(default I2C address) /*Interrupt service function, prototype void func(int index), index: the number of the pin that is interrupted*/ void func(int index){ String description = mcp.pinDescription(/*pin = */index); Serial.print(description); Serial.println(" Interruption occurs!"); } void setup() { Serial.begin(115200); /*wait for the chip to be initialized completely, and then exit*/ while(mcp.begin() != 0){ Serial.println("Initialization of the chip failed, please confirm that the chip connection is correct!"); delay(1000); } /*Parameter mode, the available is shown below: eLowLevel eHighLevel eRising eFalling eChangeLevel Low-level interrupt High-level interrupt Rising-edge interrupt Falling-edge interrupt Double-edge interrupts Parameter cb Interrupt service function(with parameter) Prototype void func(int) */ mcp.pinModeInterrupt(/*p = */mcp.eGPA0, /*mode = */mcp.eChangeLevel, /*cb = */func);//digital pin0(eGPA0), double edge interrupt, generate an interrupt when the status of pin0 changes, INTA output High level. mcp.pinModeInterrupt(/*p = */mcp.eGPA1, /*mode = */mcp.eFalling, /*cb = */func);//digital pin1(eGPA1), falling edge interrupt, generate an interrupt when the status of pin 1 changes from High to Low, INTA output High level. mcp.pinModeInterrupt(/*p = */mcp.eGPB7, /*mode = */mcp.eRising, /*cb = */func);//digital pin15(eGPB7), rising edge interrupt, generate an interrupt when the status of pin15 changes from Low to High, INTB output High level. mcp.pinModeInterrupt(/*p = */mcp.eGPB6, /*mode = */mcp.eHighLevel, /*cb = */func);//digital pin14(eGPB6), high level interrupt, generate an interrupt when the pin 14 is in high level, INTB output High level. } void loop() { /*pollInterrupts function is used to poll if an interrupt occurs on a port group Parameter group, the available parameter is shown below: (default: eGPIOALL) eGPIOA eGPIOB eGPIOALL Port Group A Port Group B Port Group A+B */ mcp.pollInterrupts(); // delay(1000); } |
结果 |
按下PA0、PA1、PB6、PB7引脚上的按钮,串触发相应的中断事件,并串口打印发生中断的引脚,如下图所示:
样例代码4 - IO中断 |
利用数字IO扩展板的INTA和INTB中断信号引脚结合UNO的外部中断,实现中断。再下例程序上传之前,先将扩展板的IA和IB分别连接到UNO的数字2(外部中断0)和3(外部中断1)引脚上,将引脚PA0设置为高电平中断,PB7设置为双边沿跳变中断,并接上按钮,UNO外部中断设置为上升沿中断,当中断发生时执行相应的中断服务程序。
如果你用的是其他主控,可在程序中查表,填写对应的中断引脚。
/*! * @file ioInterrupt.ino * @brief IO interrupt, set a pin of a port group(A or B) IO to interrupt mode. When an interrupt occurs on the related port group, pin INTA(group A) or INTB(group B) will output a High level. * INTA and INTB are used to detect if an interrupt occurs on the pin of port eGPA and eGPB respectively; connect pin INTA and INTB to main-controller's external interrupt 0 and 1 respectively. * @n Experiment phenomenon: when the signal change of pin INTA or INTB is detected by main-board, the related interrupt service function will be executed to print out which pin was interrupted on serial port. * * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) * @licence The MIT License (MIT) * @author [Arya](xue.peng@dfrobot.com) * @version V1.0 * @eGPAte 2019-07-18 * @get from https://www.dfrobot.com * @url https://github.com/DFRobot/DFRobot_MCP23017 */ #include <DFRobot_MCP23017.h> DFRobot_MCP23017 mcp(Wire, /*addr =*/0x27);//constructor, change the Level of A2, A1, A0 via DIP switch to revise I2C address within 0x20~0x27. //DFRobot_MCP23017 mcp;//use default parameter, Wire 0x27(default I2C address) //Connect 2 buttons to IO expansion board, one to a pin of port eGPA(eg: eGPA0), the other to a pin of port eGPB(eg: eGPB0) //Connect INTA to the external interrupt pin0 of UNO, INTB to external interrupt pin1 of UNO. bool intFlagA = false;//INTA interrupt sign bool intFlagB = false;//INTB interrupt sign /*Interrupt service function, prototype void func(int index), index represents the pin which is interrupted*/ void gpa0CB(int index){ String description = mcp.pinDescription(index); Serial.print(description);Serial.println(" Interruption occurs!"); } void gpb7CB(int index){ String description = mcp.pinDescription(index); Serial.print(description);Serial.println(" Interruption occurs!"); } void setup() { Serial.begin(115200); #ifdef ARDUINO_ARCH_MPYTHON pinMode(P0, INPUT);//use mPython external interrupt, connect INTA to pin 0 of mPython. pinMode(P1, INPUT);//use mPython external interrupt, connect INTB to pin 1 of mPython. #else pinMode(2, INPUT);//use UNO external interrupt 0 pinMode(3, INPUT);//use UNO external interrupt 1 #endif /*wait for the chip to be initialized completely, and then exit*/ while(mcp.begin() != 0){ Serial.println("Initialization of the chip failed, please confirm that the chip connection is correct!"); delay(1000); } /*Parameter mode, the available parameter is shown below: eLowLevel eHighLevel eRising eFalling eChangeLevel Low-level interrupt High-level interrupt Rising edge interrupt Falling edge interrupt Double edge interrupts Parameter cb interrupt service function(with parameter) Prototype void func(int) */ mcp.pinModeInterrupt(/*pin = */mcp.eGPA0, /*mode = */mcp.eHighLevel, /*cb = */gpa0CB);//digital pin 0(eGPA0), interrupt in High level. Generate an interrupt when pin 0 is in High level state.INTA output High level. mcp.pinModeInterrupt(/*pin = */mcp.eGPB7, /*mode = */mcp.eChangeLevel, /*cb = */gpb7CB);//digital pin 15(eGPB7), double edge interrupts. Generate an interrupt when the status of Pin 15 changes. INTB output High level. #ifdef ARDUINO_ARCH_MPYTHON // /* mPython Interrupt Pin vs Interrupt NO * ------------------------------------------------------------------------------------- * | | DigitalPin | P0~P20 can be used as external interrupt| * | mPython |--------------------------------------------------------------| * | | Interrupt No | use digitalPinToInterrupt(Pn) to query interrupt number | * |-----------------------------------------------------------------------------------| */ attachInterrupt(digitalPinToInterrupt(P0)/*query Interrupt NO of P0*/,notifyA,RISING);//Enable the external interrupt of mPython P0; rising edge trigger; connect INTA to P0 attachInterrupt(digitalPinToInterrupt(P1)/*query Interrupt NO of P1*/,notifyB,RISING);//Enable the external interrupt of mPython P1; rising edge trigger; connect INTB to P1 #else /* Main-board of AVR series Interrupt Pin vs Interrupt NO * --------------------------------------------------------------------------------------- * | | DigitalPin | 2 | 3 | | * | Uno, Nano, Mini, other 328-based |--------------------------------------------| * | | Interrupt No | 0 | 1 | | * |-------------------------------------------------------------------------------------| * | | Pin | 2 | 3 | 21 | 20 | 19 | 18 | * | Mega2560 |--------------------------------------------| * | | Interrupt No | 0 | 1 | 2 | 3 | 4 | 5 | * |-------------------------------------------------------------------------------------| * | | Pin | 3 | 2 | 0 | 1 | 7 | | * | Leonardo, other 32u4-based |--------------------------------------------| * | | Interrupt No | 0 | 1 | 2 | 3 | 4 | | * |-------------------------------------------------------------------------------------- */ /* microbit Interrupt Pin vs Interrupt NO * --------------------------------------------------------------------------------------------------------------- * | | DigitalPin | P0~P20 can be used as external interrupt | * | microbit |---------------------------------------------------------| * |(when used as external interrupt, do not need to set it to input mode via pinMode) | Interrupt No | Interrupt NO is pin value, for instance, the Interrupt NO of P0 is 0, P1 is 1. | * |-------------------------------------------------------------------------------------------------------------| */ attachInterrupt(/*Interrupt NO*/0,notifyA,RISING);//Enable external interrupt 0, connect INTA to the main-controller's digital pin: UNO(2),Mega2560(2),Leonardo(3),microbit(P0) attachInterrupt(/*Interrupt NO*/1,notifyB,RISING);//Enable external interrupt 1, connect INTB to the main-controller's digital pin: UNO(3),Mega2560(3),Leonardo(2),microbit(P1) #endif } /*Interrupt service function*/ void notifyA(){ intFlagA = true; } void notifyB(){ intFlagB = true; } void loop() { if(intFlagA){ intFlagA = false; /*pollInterrupts function is used to poll if an interrupt occurs on a port group parameter group, the available parameter is shown below: (default value: eGPIOALL): eGPIOA eGPIOB eGPIOALL Port groupA Port groupB Port groupA+B */ mcp.pollInterrupts(/*group = */mcp.eGPIOA); } if(intFlagB){ intFlagB = false; mcp.pollInterrupts(/*group = */mcp.eGPIOB); } }
结果 |
级联方式
常见问题
还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。