【STM32L476RG】第八节——矩阵键盘+usbhid的配置
<div class='showpostmsg'> 本帖最后由 Zhao_kar 于 2023-10-31 23:14 编辑<p style="text-align: center;"><span style="font-size:24px;"><strong>【STM32L476RG】第八节——矩阵键盘+usbhid的配置</strong></span></p>
<p><span style="color:#3498db;">闲聊:虽然申请的内容已经做完了,但是这个开发板还有很多功能没有测试,最近在做键盘,买了一个4*4的先测试代码了,硬件还在调试中,之前也确实没用到矩阵键盘,毕竟很多控制的东西我都是拿串口屏或者蓝牙+UI做的,我看好像也没人发矩阵键盘的帖子,这边就简单发一篇一个基础的应用。然后矩阵键盘这个东西其实理论相对比较简单,我就大概解释一下,顺带当成笔记用了。</span></p>
<p><strong><span style="color:#f1c40f;"><span style="font-size:22px;">一、基础理论</span></span></strong></p>
<p>矩阵键盘的引入</p>
<p>1、在学单片机的最开始的时候,肯定会学习gpio+开关的控制学习,但是很明显,这种方法,一个开关就要用一个GPIO,相当浪费资源,单片机也不可能有很多的IO口,而光是平时的机械键盘的配列就有75,108什么的,所以有了矩阵键盘这个东西</p>
<p>2、矩阵键盘大概就是这么一个图,随便画的,以2*2为例,为什么叫矩阵,看看图就知道了,如果使用如图的方式去连接,那么以行为H0、H1;列为L0、L1;(H0,L0)为A,为了方便我使用abcd表示四个位置,如图,也就是按下第一个按键时,行列检测到,其实简单来说就是一个按键有两个信息,而主控根据这两个信息判断是哪个按键按下。于是引申第三点(图丑体谅下)</p>
<div style="text-align: center;"></div>
<p>3、一个开关,一般是一边是gnd,一边是单片机的IO,但是矩阵键盘这边连接两个IO,单片机要如何操作呢,其实就是一个轮询过程,比如以H为高电平,L为低电平,若A按下,此时H0监测低电平,其实B按下的话H0也是低电平,则行信息确认,反之,L为高电平,H低电平,A按下,则L0检测低电平,L0为列信息确认,所以判断成功,这是一种,但是实际上方法很多种,各有优劣,这边就不细说了。</p>
<p><span style="color:#e74c3c;">其他可能性补充+经典鬼键问题:</span></p>
<p><strong>1、有一个设计,一个IO,多个开关的操作,这是我在别的板子上面见到的,我觉得很有用,适合于不使用ADC或者低需求的场合,具体为,一个ADC连接多个开关,每个开关的电阻不一样,然后你按下按键的时候,因为不同的电阻,经过后,不同的开关电压是不一样的,然后通过这个去实现adc检测,从而知道哪个开关按下,肯定是要写个代码的,后续我看看在创意大赛里面自己画pcb的时候我自己试试看,或者后续测评我再尝试一下,这只是个思路,我还没有成功过,至于是什么板子我就不打广告了,毕竟一个IO就可以控制多个开关,还是不错的选择。</strong></p>
<p><strong>2、鬼键,这个就是,当按下多个按键时,可能会触发到其他的行列信息,也就是说,其他的按键没有按下却会被判定按下,所以这个时候一般要加二极管,防止信号反向的现象,其实正常的键盘一般都是这样设计的,但是那么多个二极管还是有一点点的麻烦,所以有了以下设计。</strong></p>
<p><strong>3、不做详解,见稚晖君的键盘,他用了74的寄存器电路去做的设计,思路完全不一样,而且避免了鬼键问题,但是这个设计我不建议初学者学习,先乖乖把基础的二极管+矩阵键盘的电路弄好再说,这里面涉及的74芯片的方法是完全不一样的,而且虽然100个二极管麻烦,但是便宜啊,多个74虽然也不算贵,但是性价比懂的都懂,市面厂商怎么选就不用说了。</strong></p>
<p><strong><span style="color:#f1c40f;"><span style="font-size:22px;"><span style="background-color:#ffffff;">二、usbhid协议</span></span></span></strong></p>
<p>这个我就不说理论了,这个涉及的东西挺多的,我就讲这一篇报告会用的</p>
<p>1、首先是描述符,这个自己可以百度查,我就防在代码部分了</p>
<p>2、要知道发送的数据格式,8个比他,其中buffer0是几个关键控制,如ctrl和shift等等,然后1是固定0x00,然后2-7,也就是六个按键是可以做到六键无冲的。</p>
<p>3、也就是实际上只需要改描述符改成键盘的,然后使用函数+配置hid协议就行了</p>
<p>4、比如你让buffer2,发送0x04,也就是A,同理,只需要判断不同的值,控制发送端口,让buffer的值不一样,发送的值不同就行。</p>
<p><strong><span style="color:#f1c40f;"><span style="font-size:22px;">三、cubemx的实际配置</span></span></strong></p>
<p>1、8个gpio,四个输入四个输出</p>
<p>2、输入设置为上拉</p>
<p>3、RCC、SYS略</p>
<p>4、connectivity打开USBdevice</p>
<p>5、middleware里面选择HID,然后其他参数不用改</p>
<div style="text-align: center;"></div>
<div style="text-align: center;"></div>
<div style="text-align: center;"></div>
<div style="text-align: center;"></div>
<p><span style="color:#f1c40f;"><strong><span style="font-size:22px;">四、keil的代码</span></strong></span></p>
<p>1、usbd_hid.c</p>
<pre>
<code class="language-cpp">
//这个是描述符的
_ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc__ALIGN_END =
{
0x05,0x01, //USAGE_PAGE (Generic Desktop)
0x09,0x06, //USAGE (Keyboard)
0xA1,0x01, //COLLECTION (Application)
//以下为输入报告描述符,用于中断输入端点
//输入报告描述符2字节,第一个字节各位代表的是控制键,第二个字为0,后面跟6个数组,用于普通按键键码
0x05,0x07,//USAGE_PAGE (Keyboard)
0x19,0xE0, //USAGE_MINIMUM (Keyboard LeftControl)
0x29,0xE7, //USAGE_MAXIMUM (Keyboard Right GUI)
0x15,0x00, //LOGICAL_MINIMUM (0)
0x25,0x01, //LOGICAL_MAXIMUM (1)
0x75,0x01, //REPORT_SIZE (1)
0x95,0x08, // REPORT_COUNT (8)
0x81,0x02, // INPUT (Data,Var,Abs)
0x95,0x01, // REPORT_COUNT (1)
0x75,0x08, // REPORT_SIZE (8)
0x81,0x03, // INPUT (Cnst,Var,Abs)
0x95,0x06, // REPORT_COUNT (6)
0x75,0x08, // REPORT_SIZE (8)
0x15,0x00, // LOGICAL_MINIMUM (0)
0x25,0x65, // LOGICAL_MAXIMUM (101)
0x05,0x07, //USAGE_PAGE (Keyboard)
0x19,0x00, //USAGE_MINIMUM (Reserved (no event indicated))
0x29,0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81,0x00, // INPUT (Data,Ary,Abs)
//输出报告描述符,用于控制键盘灯
//以下为中断输出报告描述符,用于中断输出端点
//第一节字的低5位表示相应的指示灯,高3位为0
0x95,0x05, //REPORT_COUNT (5)
0x75,0x01, //REPORT_SIZE (1)
0x05,0x08, //USAGE_PAGE (LEDs)
0x19,0x01, //USAGE_MINIMUM (Num Lock)
0x29,0x05, //USAGE_MAXIMUM (Kana)
0x91,0x02, //OUTPUT (Data,Var,Abs)
0x95,0x01, //REPORT_COUNT (1)
0x75,0x03, //REPORT_SIZE (3)
0x91,0x03, //OUTPUT (Cnst,Var,Abs)
0xC0 //END_COLLECTION
};
</code></pre>
<p>2、把初始的鼠标改成键盘(大概160多行位置,如下,初始配置是鼠标,注释里面说明了键盘是什么样的,更改一下)</p>
<pre>
<code class="language-cpp">USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/
0x00, /*bInterfaceNumber: Number of Interface*/
0x00, /*bAlternateSetting: Alternate setting*/
0x01, /*bNumEndpoints*/
0x03, /*bInterfaceClass: HID*/
0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
0x01, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/</code></pre>
<p>3、然后h文件里面要改一下,原先是四字节,改成8,如下,还有74改成63</p>
<pre>
<code class="language-cpp">#define HID_EPIN_SIZE 0x08U
#define HID_MOUSE_REPORT_DESC_SIZE 63U</code></pre>
<p>4、编写矩阵键盘的扫描函数</p>
<pre>
<code class="language-cpp">uint8_t Key_Scan(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/*前4个端口输出低电平*/
//输入是PA2,3,8,10
//输出是PB3,4,5,10
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_8|GPIO_PIN_10, GPIO_PIN_RESET);
//PA是L列,也就是竖着的
//前4个端口推挽输出,列配置为推挽输出
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_8|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
//PB的3,4,5,10是H行,也就是横着的
//后4个端口上拉输入,行配置为上拉输入
GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_Delay(10);
//后四个端口作为行,也就是第一行,此时PB3,后续以此类推
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==GPIO_PIN_RESET)//读取第1行
{
/*后4个端口输出低电平*/
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10, GPIO_PIN_RESET);
//后4个端口推挽输出
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
//前4个端口上拉输入
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_8|GPIO_PIN_10;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2)==GPIO_PIN_RESET)return 1;//此时列引脚,对应一行的1、2、3、4列
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3)==GPIO_PIN_RESET)return 2;//所以返回四个值
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)==GPIO_PIN_RESET)return 3;
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_10)==GPIO_PIN_RESET)return 4;
}
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4)==GPIO_PIN_RESET)//读取第2行
{
/*后4个端口输出低电平*/
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10, GPIO_PIN_RESET);
//后4个端口推挽输出
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
//前4个端口上拉输入
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_8|GPIO_PIN_10;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2)==GPIO_PIN_RESET)return 5;
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3)==GPIO_PIN_RESET)return 6;
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)==GPIO_PIN_RESET)return 7;
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_10)==GPIO_PIN_RESET)return 8;
}
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5)==GPIO_PIN_RESET)//读取第3行
{
/*后4个端口输出低电平*/
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10, GPIO_PIN_RESET);
//后4个端口推挽输出
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
//前4个端口上拉输入
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_8|GPIO_PIN_10;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2)==GPIO_PIN_RESET)return 9;
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3)==GPIO_PIN_RESET)return 10;
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)==GPIO_PIN_RESET)return 11;
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_10)==GPIO_PIN_RESET)return 12;
}
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_10)==GPIO_PIN_RESET)//读取第4行
{
/*后4个端口输出低电平*/
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10, GPIO_PIN_RESET);
//后4个端口推挽输出
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
//前4个端口上拉输入
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_8|GPIO_PIN_10;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2)==GPIO_PIN_RESET)return 13;
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3)==GPIO_PIN_RESET)return 14;
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)==GPIO_PIN_RESET)return 15;
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_10)==GPIO_PIN_RESET)return 16;
}
return 0;
}</code></pre>
<p>5、串口调试函数+键盘发送函数</p>
<p>备注:我本来做着做着,代码写完后,<strong><span style="color:#e74c3c;">突然想到了一个很尴尬的东西,这个板子好像没办法连接USB,怎么说呢,就是usb是连接stlink的那个mcu的,但是我们控制的主控是l476的,然后我看了看说明手册,JP1是控制电压电流的,然后CN2两个是stlink的下载选择,CN3就是直接的串口,然后没有可以拉出来的引脚,可能我看漏了,如果有问题,希望大家可以纠错。</span></strong></p>
<p>所以这里代码放在这,我在别的板子上面测试过了,是可行的,然后这个的展示没办法,只能通过串口接收矩阵键盘的值调试了,代码如下</p>
<pre>
<code class="language-cpp">key_val = Key_Scan();
if(key_val == 1)
{
printf("01");
buffer = 0x04;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 2)
{
printf("02");
buffer = 0x05;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 3)
{
printf("03");
buffer = 0x06;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 4)
{
printf("04");
buffer = 0x07;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 5)
{
printf("05");
buffer = 0x08;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 6)
{
printf("06");
buffer = 0x09;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 7)
{
printf("07");
buffer = 0x0A;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 8)
{
printf("08");
buffer = 0x0B;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 9)
{
printf("09");
buffer = 0x0C;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 10)
{
printf("10");
buffer = 0x0D;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 11)
{
printf("11");
buffer = 0x0E;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 12)
{
printf("12");
buffer = 0x0F;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 13)
{
printf("13");
buffer = 0x10;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 14)
{
printf("14");
buffer = 0x11;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 15)
{
printf("15");
buffer = 0x12;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
}
if(key_val == 16)
{
printf("16");
buffer = 0x13;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay(15);
buffer = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,buffer,8);
HAL_Delay (500);
} </code></pre>
<p>6、初始的声明和定义别忘了</p>
<pre>
<code class="language-cpp">/* USER CODE BEGIN PV */
extern USBD_HandleTypeDef hUsbDeviceFS;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
uint8_t Key_Scan(void);
/* USER CODE END PFP */
/* USER CODE BEGIN Init */
uint8_t key_val;
/* USER CODE END Init */
/* USER CODE BEGIN 2 */
printf("begin test");
uint8_t buffer = {0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00};
/* USER CODE END 2 */
//别忘记stdio,串口函数+勾选micro</code></pre>
<p><strong><span style="color:#f1c40f;"><span style="font-size:22px;">五、实际测试</span></span></strong></p>
<p>1、前面说了,usb搞不了,但是矩阵键盘的串口返回值还是可以的,我换一个板子,上面的usb拉出来了,可以测试,看第二个视频</p>
<ul>
<li>视频1</li>
</ul>
<p>89c46d4914366fbb7acac702784895e2<br />
</p>
<ul>
<li>视频2</li>
</ul>
<p>7897d012802ac113e2a92112370624c3<br />
</p>
<p>2、补充</p>
<p>没什么总结的,adc、dac我看很多人做了,我就不写了,这个做一个矩阵键盘顺带加一个hid,难绷的是发现这个板子有点不太行,硬件有一点点的问题,然后换成别的板子了,其实理论是一样的,硬件上完全可以画一个转接板,然后上面有一个usb口,再把PA11、12这两个口接到上面,然后画一个usb口的电路,这个usb电路也有可以讲的东西,这里篇幅有限不展开,建议抄抄别人的usb电路就懂了,放一张图就知道了</p>
<div style="text-align: center;"></div>
<p> </p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> 楼主很有想法呀,看来很用心的对这开发板进行了折腾。
页:
[1]