OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15034|回复: 8

STM32模拟8080接口驱动液晶的问题

[复制链接]

11

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2013-12-1
在线时间
3 小时
发表于 2014-2-8 16:38:24 | 显示全部楼层 |阅读模式

板子是原子旗舰版的STM32开发板,液晶是2.8寸的320*240彩色液晶。由于现在是刚学stm32不久,所以就先从模拟8080口驱动液晶开始,以后再学fsmc驱动,这样就对液晶的驱动更加了解,还有就是降低初学者的门槛。 现在我把液晶的中文还有英文手册都看了很多遍,还有原子哥stm32mini板的液晶驱动也看了很多遍,但自己写了个模拟8080口的液晶驱动去驱动液晶就是一点反应都没有,究竟程序出问题了呢?求救,这问题纠结了我很久呢!!!!!

#include "stm32f10x_conf.h"                         
#include "Board_def.h"                                //针对板子专门定义的一个头文件

/**
 *显示函数
 *开显示:IO口配置成默认的推挽输出,打开背光
 *关显示:IO口配置成上拉输入,关背光
 */
void Display(FunctionalState NewState)
{
 GPIO_InitTypeDef GPIO_InitStructure;            
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);    
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);    
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);    
 if(NewState!=DISABLE)
 {
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;       
  GPIO_Init(GPIOD,&GPIO_InitStructure);
 
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;       
  GPIO_Init(GPIOG,&GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;       
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  
  LCD_BL=1;                                                            //打开背光
 }
 else
 {
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;         
  GPIO_Init(GPIOD,&GPIO_InitStructure);
 
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;         
  GPIO_Init(GPIOG,&GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;       
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  
  LCD_BL=0;                                                        //关闭背光
 }
}

/**
 *写配置
 *ENABLE则是推挽输出,DISABLE则是上拉输入
 *
 */
void Write_config(FunctionalState NewState)
{
 GPIO_InitTypeDef GPIO_InitStructure;            
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);    
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);   
 if(NewState!=DISABLE)
 {
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8|
                GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;      
  GPIO_Init(GPIOD,&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|
                GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|
                GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;      
  GPIO_Init(GPIOE,&GPIO_InitStructure);
 }
 else
 {
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8|
                GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;       
  GPIO_Init(GPIOD,&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|
                GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|
                GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;        
  GPIO_Init(GPIOE,&GPIO_InitStructure);
 }
}

/**
 *写数据
 *把离散的IO口封装起来用一个函数来操作
 *
 */
void Write_data(short unsigned int Data)
{
 short unsigned int temp=0x0000;
 temp=Data;
 Data0_OUT=(temp>>0)&0x0001;
 Data1_OUT=(temp>>1)&0x0001;
 Data2_OUT=(temp>>2)&0x0001;
 Data3_OUT=(temp>>3)&0x0001;
 Data4_OUT=(temp>>4)&0x0001;
 Data5_OUT=(temp>>5)&0x0001;
 Data6_OUT=(temp>>6)&0x0001;
 Data7_OUT=(temp>>7)&0x0001;
 Data8_OUT=(temp>>8)&0x0001;
 Data9_OUT=(temp>>9)&0x0001;
 Data10_OUT=(temp>>10)&0x0001;
 Data11_OUT=(temp>>11)&0x0001;
 Data12_OUT=(temp>>12)&0x0001;
 Data13_OUT=(temp>>13)&0x0001;
 Data14_OUT=(temp>>14)&0x0001;
 Data15_OUT=(temp>>15)&0x0001;
}

/**
 *读数据
 *把离散的IO口封装起来一个函数操作
 *
 */
short unsigned int Capture_data(void)
{
 short unsigned int temp=0x0000;
 temp=(Data15_IN&0x0001)<<15|(Data14_IN&0x0001)<<14|(Data13_IN&0x0001)<<13|
    (Data12_IN&0x0001)<<12|(Data11_IN&0x0001)<<11|(Data10_IN&0x0001)<<10|
     (Data9_IN&0x0001)<<9|(Data8_IN&0x0001)<<8|(Data7_IN&0x0001)<<7|
      (Data6_IN&0x0001)<<6|(Data5_IN&0x0001)<<5|(Data4_IN&0x0001)<<4|
       (Data3_IN&0x0001)<<3|(Data2_IN&0x0001)<<2|(Data1_IN&0x0001)<<1|(Data0_IN&0x0001)<<0;
 return(temp);
}

/**
 *LCD写数据
 *
 *
 */
void LCD_write_data(short unsigned int Data)
{
 Write_config(ENABLE);
 CS=0;
 RS=1;
 RD=1;
 Write_data(Data);
 WR=0;
 WR=1;
 CS=1;
}

/**
 *LCD写命令
 *
 *·
 */
void LCD_write_cmd(short unsigned int Cmd)
{
 Write_config(ENABLE);
 CS=0;
 RS=0;
 RD=1;
 Write_data(Cmd);
 WR=0;
 WR=1;
 CS=1;
}

/**
 *LCD读数据
 *
 *
 */
short unsigned int LCD_read_data(void)
{
 short unsigned int temp=0;
 Write_config(DISABLE);
 CS=0;
 RS=1;
 WR=1;
 RD=0;
 RD=1;
 temp=Capture_data();
 CS=1;
 return(temp);
}

/**
 *LCD初始化
 *
 *
 */
void Init_lcd(void)
{
 Display(ENABLE);
 Write_config(ENABLE);
 LCD_write_cmd(0xcf);
 LCD_write_data(0x00);
 LCD_write_data(0xc1);
 LCD_write_data(0x30);
 
 LCD_write_cmd(0xed);
 LCD_write_data(0x64);
 LCD_write_data(0x03);
 LCD_write_data(0x12);
 LCD_write_data(0x81);
 
 LCD_write_cmd(0xe8);
 LCD_write_data(0x85);
 LCD_write_data(0x00);
 LCD_write_data(0x7a);
 
 LCD_write_cmd(0xcb);
 LCD_write_data(0x39);
 LCD_write_data(0x2c);
 LCD_write_data(0x00);
 LCD_write_data(0x34);
 LCD_write_data(0x02);
 
 LCD_write_cmd(0xf7);
 LCD_write_data(0x20);
 
 LCD_write_cmd(0xea);
 LCD_write_data(0x00);
 LCD_write_data(0x00);
 
 LCD_write_cmd(0xc0);         //power control
 LCD_write_data(0x21);         //vrh[5:0]
 
 LCD_write_cmd(0xc1);         //power control
 LCD_write_data(0x11);         //sap[2:0];bt[3:0]
 
 LCD_write_cmd(0xc5);         //vcm control
 LCD_write_data(0x31);
 LCD_write_data(0x3c);
 
 LCD_write_cmd(0xc7);         //vcm control2
 LCD_write_data(0x9f);
 
 LCD_write_cmd(0x36);         //memory access control
 LCD_write_data(0x08);
 
 LCD_write_cmd(0xb1);         
 LCD_write_data(0x00);
 LCD_write_data(0x1b);
 
 LCD_write_cmd(0xb6);         //display function control
 LCD_write_data(0x0a);
 LCD_write_data(0xa2);
 
 LCD_write_cmd(0xf2);         //3gamma function disable
 LCD_write_data(0x00);
 
 LCD_write_cmd(0x26);         //gamma curve selected
 LCD_write_data(0x01);
 
 LCD_write_cmd(0xe0);         //set gamma
 LCD_write_data(0x0f);
 LCD_write_data(0x20);
 LCD_write_data(0x1d);
 LCD_write_data(0x0b);
 LCD_write_data(0x10);
 LCD_write_data(0x0a);
 LCD_write_data(0x49);
 LCD_write_data(0xa9);
 LCD_write_data(0x3b);
 LCD_write_data(0x0a);
 LCD_write_data(0x15);
 LCD_write_data(0x06);
 LCD_write_data(0x0c);
 LCD_write_data(0x06);
 LCD_write_data(0x00);
 
 LCD_write_cmd(0xe1);         //set gamma
 LCD_write_data(0x00);
 LCD_write_data(0x1f);
 LCD_write_data(0x22);
 LCD_write_data(0x04);
 LCD_write_data(0x0f);
 LCD_write_data(0x05);
 LCD_write_data(0x36);
 LCD_write_data(0x46);
 LCD_write_data(0x46);
 LCD_write_data(0x05);
 LCD_write_data(0x0b);
 LCD_write_data(0x09);
 LCD_write_data(0x33);
 LCD_write_data(0x39);
 LCD_write_data(0x0f); 
}


/**
 *LCD进入睡眠模式
 *
 *
 */
void LCD_enter_sleep(void)
{
 LCD_write_cmd(0x28);        //display off
// delay_20ms();
 LCD_write_cmd(0x10);        //enter sleep mode
}

/**
 *LCD退出睡眠模式
 *
 *
 */
void LCD_exit_sleep(void)
{
 LCD_write_cmd(0x11);        //sleep out
// delay_120ms();
 LCD_write_cmd(0x29);        //display on

下面就是随便的在屏幕中显示几个点出来具体函数:
int main(void)

 Init_lcd();
 while(1)
 {
  LCD_write_cmd(0x4e);
  LCD_write_data(10);
  LCD_write_cmd(0x4f);
  LCD_write_data(20);
  LCD_write_cmd(R34);
  LCD_write_data(0xf0f0);
  
  LCD_write_cmd(0x4e);
  LCD_write_data(11);
  LCD_write_cmd(0x4f);
  LCD_write_data(21);
  LCD_write_cmd(R34);
  LCD_write_data(0xf0f0);
  
  LCD_write_cmd(0x4e);
  LCD_write_data(12);
  LCD_write_cmd(0x4f);
  LCD_write_data(22);
  LCD_write_cmd(R34);
  LCD_write_data(0xf0f0);
  
  LCD_write_cmd(0x4e);
  LCD_write_data(13);
  LCD_write_cmd(0x4f);
  LCD_write_data(23);
  LCD_write_cmd(R34);
  LCD_write_data(0xf0f0);
 }
}

具体的端口位操作为(实际在Board_def.h头文件中):
/****************以下是LCD端口的定义********************/
#define CS *((volatile unsigned int *)(0x1200C*32+12*4+0x42000000))                          //PG12->ODR
#define RS *((volatile unsigned int *)(0x1200C*32+0*4+0x42000000))                           //PG0->ODR
#define WR *((volatile unsigned int *)(0x1400C*32+5*4+0x42000000))                          //PD5->ODR
#define RD *((volatile unsigned int *)(0x1400C*32+4*4+0x42000000))                           //PD4->ODR
#define LCD_BL *((volatile unsigned int *)(0x10C0C*32+0*4+0x42000000))                     //PB0->ODR
#define Data0_OUT *((volatile unsigned int *)(0x1400C*32+14*4+0x42000000))              //PD14->ODR
#define Data1_OUT *((volatile unsigned int *)(0x1400C*32+15*4+0x42000000))                //PD15->ODR
#define Data2_OUT *((volatile unsigned int *)(0x1400C*32+0*4+0x42000000))                 //PD0->ODR
#define Data3_OUT *((volatile unsigned int *)(0x1400C*32+1*4+0x42000000))                 //PD1->ODR
#define Data4_OUT *((volatile unsigned int *)(0x1180C*32+7*4+0x42000000))                 //PE7->ODR
#define Data5_OUT *((volatile unsigned int *)(0x1180C*32+8*4+0x42000000))                 //PE8->ODR
#define Data6_OUT *((volatile unsigned int *)(0x1180C*32+9*4+0x42000000))                 //PE9->ODR
#define Data7_OUT *((volatile unsigned int *)(0x1180C*32+10*4+0x42000000))                //PE10->ODR
#define Data8_OUT *((volatile unsigned int *)(0x1180C*32+11*4+0x42000000))                //PE11-ODR
#define Data9_OUT *((volatile unsigned int *)(0x1180C*32+12*4+0x42000000))                //PE12->ODR
#define Data10_OUT *((volatile unsigned int *)(0x1180C*32+13*4+0x42000000))                //PE13->ODR
#define Data11_OUT *((volatile unsigned int *)(0x1180C*32+14*4+0x42000000))                //PE14->ODR
#define Data12_OUT *((volatile unsigned int *)(0x1180C*32+15*4+0x42000000))                //PE15->ODR
#define Data13_OUT *((volatile unsigned int *)(0x1400C*32+8*4+0x42000000))                    //PD8->ODR
#define Data14_OUT *((volatile unsigned int *)(0x1400C*32+9*4+0x42000000))                    //PD9->ODR
#define Data15_OUT *((volatile unsigned int *)(0x1400C*32+10*4+0x42000000))                //PD10->ODR

#define Data0_IN *((volatile unsigned int *)(0x14008*32+14*4+0x42000000))                    //PD14->IDR
#define Data1_IN *((volatile unsigned int *)(0x14008*32+15*4+0x42000000))                    //PD15->IDR
#define Data2_IN *((volatile unsigned int *)(0x14008*32+0*4+0x42000000))                     //PD0->IDR
#define Data3_IN *((volatile unsigned int *)(0x14008*32+1*4+0x42000000))                     //PD1->IDR
#define Data4_IN *((volatile unsigned int *)(0x11808*32+7*4+0x42000000))                     //PE7->IDR
#define Data5_IN *((volatile unsigned int *)(0x11808*32+8*4+0x42000000))                     //PE8->IDR
#define Data6_IN *((volatile unsigned int *)(0x11808*32+9*4+0x42000000))                     //PE9->IDR
#define Data7_IN *((volatile unsigned int *)(0x11808*32+10*4+0x42000000))                    //PE10->IDR
#define Data8_IN *((volatile unsigned int *)(0x11808*32+11*4+0x42000000))                    //PE11-IDR
#define Data9_IN *((volatile unsigned int *)(0x11808*32+12*4+0x42000000))                    //PE12->IDR
#define Data10_IN *((volatile unsigned int *)(0x11808*32+13*4+0x42000000))                    //PE13->IDR
#define Data11_IN *((volatile unsigned int *)(0x11808*32+14*4+0x42000000))                    //PE14->IDR
#define Data12_IN *((volatile unsigned int *)(0x11808*32+15*4+0x42000000))                    //PE15->IDR
#define Data13_IN *((volatile unsigned int *)(0x14008*32+8*4+0x42000000))                    //PD8->IDR
#define Data14_IN *((volatile unsigned int *)(0x14008*32+9*4+0x42000000))                    //PD9->IDR
#define Data15_IN *((volatile unsigned int *)(0x14008*32+10*4+0x42000000))                    //PD10->IDR


求大神看看到底是哪里出问题了??????????

 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-2-8 16:46:53 | 显示全部楼层
回复【楼主位】cjw1990:
---------------------------------
读ID正常了么?
如果不正常,输出数据的时候,单独测试下IO口,看看每个位的状态对不对?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-8 16:47:31 | 显示全部楼层
回复【楼主位】cjw1990:
---------------------------------
你还不如直接操作库函数来的快一点,库里面已经有现成的应用函数你调用了

1、首先你要了解你所控制的TFT接口时序方面的要求
2、写入数据和读取数据的时序分别是什么样的,需要改变哪些控制管脚的电平
3、建议你先不用显示什么,直接写好代码,读取TFT的控制芯片型号,读取正确了,再进行初始化操作
4、初始化成功了,再做显示方面的底层代码
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

11

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2013-12-1
在线时间
3 小时
 楼主| 发表于 2014-2-9 11:41:19 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
现在问题终于找到了,原来是自己定义端口D的时候定义错了,端口D的基地址应该是1400才对啊,我上面的看错了弄成14000。现在改回了,终于解决了问题了。不过现在问题又出来了,在屏幕中显示几个点来不感觉到速度慢的问题,但如果全屏都刷新一次,速度慢的要命啊,起码要2s,这样肯定不行的了。是不是用这种模拟8080口而且用位地址绑定IO口的方法做LCD显示本来就是这么慢的呢?还是我的程序哪里没有优化?你们也用这种方法做的时候是不是也是这么慢的呢?
回复 支持 反对

使用道具 举报

11

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2013-12-1
在线时间
3 小时
 楼主| 发表于 2014-2-9 11:41:45 | 显示全部楼层
回复【3楼】Badu_Space:
---------------------------------
现在问题终于找到了,原来是自己定义端口D的时候定义错了,端口D的基地址应该是1400才对啊,我上面的看错了弄成14000。现在改回了,终于解决了问题了。不过现在问题又出来了,在屏幕中显示几个点来不感觉到速度慢的问题,但如果全屏都刷新一次,速度慢的要命啊,起码要2s,这样肯定不行的了。是不是用这种模拟8080口而且用位地址绑定IO口的方法做LCD显示本来就是这么慢的呢?还是我的程序哪里没有优化?你们也用这种方法做的时候是不是也是这么慢的呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-2-9 15:24:04 | 显示全部楼层
回复【5楼】cjw1990:
---------------------------------
因为你这种方式,速度大打折扣啊
用fsmc直接驱动,就快很多了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-15
在线时间
25 小时
发表于 2015-7-1 15:37:33 | 显示全部楼层
你的 这个 函数 
short unsigned int LCD_read_data(void)

里面 搞错了, 你写的是 
 short unsigned int temp=0;
 Write_config(DISABLE);
 CS=0;
 RS=1;
 WR=1;
 RD=0;
 RD=1;
 temp=Capture_data();
 CS=1;
 return(temp);

应该为
 short unsigned int temp=0;
 Write_config(DISABLE);
 CS=0;
 RS=1;
 WR=1;
 RD=0;
 temp=Capture_data();
 RD=1;
  CS=1;
 return(temp);
回复 支持 反对

使用道具 举报

6

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2018-4-4
在线时间
40 小时
发表于 2019-11-6 16:35:48 | 显示全部楼层
八度空间 发表于 2014-2-8 16:47
回复【楼主位】cjw1990:
---------------------------------
你还不如直接操作库函数来的快一点,库里面已 ...

如果数据口连在了芯片不同组的IO上,也可以正常驱动吗
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2019-11-24 13:48:52 | 显示全部楼层
楼下是老王 发表于 2019-11-6 16:35
如果数据口连在了芯片不同组的IO上,也可以正常驱动吗

通讯的时候不冲突就可以
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 08:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表