OpenEdv-开源电子网

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

学习STM32 玩TFT屏 第九季 之 触摸屏

[复制链接]

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
发表于 2012-6-24 20:29:49 | 显示全部楼层 |阅读模式
首先,我们先到百度去百度一下ADS7843,先做一下先期的了解,看得满头烟没什么,对新事物谁都会满头烟,
只我看下去,按照自己的了解自己动手自己做下去,很快就会了解的.了解完了写个总结(好象我一样)),让大家
看一下,大家都看明白了,自己也就毕业了.

刚开始学,我们先不要中断,先用主程式查询的方式做.

首先,我们先来配置一下与触摸屏的IO如下:

//与触摸屏芯片连接引脚    
#define PEN      Cin(1)   //PC1  INT
#define DOUT   PCin(2)   //PC2  MISO

#define DIN     PCout(3)  //PC3  MOSI
#define DCLK   PCout(0)  //PC0  SCLK
#define CS      Cout(13) //PC13 CS   


然后: 设一下默认值,   ADS7843的命令系统很简单,重要的只有两个,其它的我们很少用,先不理,就当他只有两个.
如下:

#define CMD_RDX        0X90  //0B10010000   即用差分方式读X坐标
#define CMD_RDY    0XD0  //0B11010000  即用差分方式读Y坐标





好,我们先来写 启动SPI的 启动代码:

void start() 
{
    DCLK=0;

    CS=1;
    DIN=1;

    DCLK=1;

    CS=0;
}

然后是:

// 写一个命令到ADS7843   ********************************************************************************

void Write_Com_to_7843(u8 COM)
{
u8 i,temp;

DCLK=0;

for (i=0;i<8;i++)
{
temp=COM & 0x80;  //从最高位取Bit 

if (temp==0)
{
DIN=0;
}
else
    {
DIN=1;
}

COM<<=1;
    DCLK=0;    //底电平放数上总线
    DCLK=1;   //上升沿后 ADS7843 读总线数据
}
}


然后是:
// 读一个数据 到ADS7843   ********************************************************************************

u16  Read_data_form7843()

{
u8 i;
u16 data;

delay_us(6);                   //ADS7846的转换时间最长为6us  看TI资料的第九页 ADS7843 BUSY 很忙 要给他时间
DCLK=1;                         //给1个时钟,清除BUSY        
DCLK=0; 

for (i=0;i<16;i++)
{
data<<=1;

DCLK=1;
delay_us(1);
DCLK=0;                       //SPI 读数据刚好和写数据相反, 是在时钟下降沿后 主机才能读数据
if (DOUT)data++;
}

  data>>=4;  //两个时钟周期中,后4位全是0没有用,要去掉.因为ADS7843只给出12位精度的数据

return (data);
}


因为多了一些IO脚与触摸屏连着,我们要对上些季的IO初始化作些改动(绿色字的那些),如下:

//    IO 初始化    ****************************************************************************************
void LCD_IO_Init(void)
  RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟
  RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟

RCC->APB2ENR|=1<<0;    //开启辅助时钟
JTAG_Set(SWD_ENABLE);  //开启SWD
 
//PORTC6~10  推挽输出 
GPIOC->CRH&=0XFF0FF000;
GPIOC->CRH  |=0X00300333;
 
GPIOC->CRL&=0X00FF0000;
GPIOC->CRL   |=0X33003883;  
GPIOC->ODR  |=0X07C0;

GPIOC->ODR|=0X200F
 
//PORTB 推挽输出 
GPIOB->CRH=0X33333333;
GPIOB->CRL=0X33333333;   
GPIOB->ODR=0XFFFF;
}

其实,看了上边的,也就觉得没什么难的了,只要代码简单,看上去就很容易明白.
来来去去就几板斧,range;display:inline-block;color:#ffffff;">写一个丢命令进去的代码,然后再写一个读出来的代码,就这么简单!!

好,我们修改一下主程式,上一季已做了些准备.现在有用了.

// 主函数   ************************************************************************************************
int main(void)
{
  u16  x,y;
  Stm32_Clock_Init(9);
  delay_init(72);
  uart_init(72,9600);
  LCD_IO_Init();
  LCD_init();

  B_COLOR=color(7,14,7);
  clear_lcd();

  while (1) 
    {   
ADS7843SPI_start();

Write_Com_to_7843(CMD_RDX);  //CMD_RDX= 0X90 程式头上边有定义
x=Read_data_form7843();

Write_Com_to_7843(CMD_RDY);  // CMD_RDY = 0XD0 程式头上边已定义
y=Read_data_form7843();

F_COLOR = color(0,60,0);
linechar_1608t(3,6,"This is X data\0");
count_show(5, 12 , x);


F_COLOR = color(0,60,0);
linechar_1608t(7,6,"This is Y data\0");
count_show(9 , 12 ,y);

delay_ms(50);
B_COLOR=color(7,14,7);
Clear_line(5,12,5);
Clear_line(9,12,5);
}
}



编译好后,丢进板子,看~~~~~~~~~~X,Y 的数字出来了,跳得挺欢的.看到没,Y的数值很大部分时间在4095 ,而Y大部分时间都是0,期间跳出与他们之间的差有 几十到一两百的数也有.
为什么会这样呢,不要急,我们下季慢慢来分析.

我将全部的代码帖出来:

#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "FONT.h"


//快速IO
#define LCD_CS_SET  GPIOC->BSRR=1<<9    //片选端口          PC9
#define LCD_RS_SET GPIOC->BSRR=1<<8    //数据/命令            C8    
#define LCD_WR_SET GPIOC->BSRR=1<<7    //写数据    PC7
#define LCD_RD_SET GPIOC->BSRR=1<<6    //读数据    PC6
    
#define LCD_CS_CLR  GPIOC->BRR=1<<9     //片选端口          PC9
#define LCD_RS_CLR GPIOC->BRR=1<<8     //数据/命令            C8    
#define LCD_WR_CLR GPIOC->BRR=1<<7     //写数据    PC7
#define LCD_RD_CLR GPIOC->BRR=1<<6     //读数据    PC6
    
//慢速IO
#define LCD_CS PCout(9)  //片选端口        PC9
#define LCD_RS PCout(8)  //数据/命令        C8    
#define LCD_WR PCout(7)  //写数据  PC7
#define LCD_RD PCout(6)  //读数据  PC6

#define LCD_LED PCout(10)  //背光

//PB0~15,作为数据线
#define DATAOUT(x)   GPIOB->ODR=x;         //数据输出
#define DATAIN       GPIOB->IDR;           //数据输入

#define LCD_WR_DATA(data){\
LCD_RS_SET;\
LCD_CS_CLR;\
DATAOUT(data);\
LCD_WR_CLR;\
LCD_WR_SET;\
LCD_CS_SET;\
}

//与触摸屏芯片连接引脚    
#define PEN  Cin(1)   //PC1  INT
#define DOUT PCin(2)   //PC2  MISO

#define DIN  Cout(3)   //PC3  MOSI
#define DCLK PCout(0)   //PC0  SCLK
#define CS   PCout(13)  //PC13 CS 

#define CMD_RDX     0X90  //0B10010000   即用差分方式读X坐标
#define CMD_RDY    0XD0  //0B11010000  即用差分方式读Y坐标 

u16  F_COLOR,B_COLOR;


//    IO 初始化    ****************************************************************************************
void LCD_IO_Init(void)
  RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟
  RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟

RCC->APB2ENR|=1<<0;    //开启辅助时钟
JTAG_Set(SWD_ENABLE);  //开启SWD
 
//PORTC6~10  推挽输出 
GPIOC->CRH&=0XFF0FF000;
GPIOC->CRH|=0X00300333;
 
GPIOC->CRL&=0X00FF0000;
GPIOC->CRL|=0X33003883;  
GPIOC->ODR|=0X07C0;
GPIOC->ODR|=0X200F; 
 
//PORTB 推挽输出 
GPIOB->CRH=0X33333333;
GPIOB->CRL=0X33333333;   
GPIOB->ODR=0XFFFF;
}

////正常IO写 寄存器 函数
//void LCD_WR_REG(u8 data)
//{ 
// LCD_RS=0;//写地址  
//  LCD_CS=0; 
// DATAOUT(data); 
// LCD_WR=0; 
// LCD_WR=1; 
//  LCD_CS=1;   
//} 
//
////正常IO写 8位数据 函数
//void LCD_WR_DATA(u16 data)
//
//{
//LCD_RS=1;
//LCD_CS=0;
//DATAOUT(data);
//LCD_WR=0;
//LCD_WR=1;
//LCD_CS=1;
//} 
//写寄存器函数=>快
void LCD_WR_REG(u8 data)
LCD_RS_CLR;//写地址  
  LCD_CS_CLR; 
DATAOUT(data); 
LCD_WR_CLR; 
LCD_WR_SET; 
  LCD_CS_SET;   
}


//写寄存器
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{
LCD_WR_REG(LCD_Reg);  
LCD_WR_DATA(LCD_RegValue);       
}


//读寄存器
u16 LCD_ReadReg(u8 LCD_Reg)
{    
u16 t;
LCD_WR_REG(LCD_Reg);    //写入要读的寄存器号  
GPIOB->CRL=0X88888888;  //PB0-7  上拉输入
GPIOB->CRH=0X88888888;  //PB8-15 上拉输入
GPIOB->ODR=0XFFFF;      //全部输出高

LCD_RS=1;
LCD_CS=0;
//读取数据(读寄存器时,并不需要读2次)
LCD_RD=0;    
LCD_RD=1;
t=DATAIN;  
LCD_CS=1; 
 
GPIOB->CRL=0X33333333; //PB0-7  上拉输出
GPIOB->CRH=0X33333333; //PB8-15 上拉输出
GPIOB->ODR=0XFFFF;    //全部输出高
return t;  
}      



//返回值:此点的颜色
u16 LCD_ReadPoint(u16 x,u16 y)
{
u16 t;
LCD_WriteReg(0x0020,x);  //X
LCD_WriteReg(0x0021,y);  //Y

LCD_WR_REG(0x22);       //选择GRAM地址
 
GPIOB->CRL=0X88888888; //PB0-7  上拉输入
GPIOB->CRH=0X88888888; //PB8-15 上拉输入
GPIOB->ODR=0XFFFF;     //全部输出高

LCD_RS_SET;
LCD_CS_CLR;
//读取数据(读GRAM时,需要读2次)
LCD_RD_CLR;    
LCD_RD_SET;
delay_us(2);//FOR 9320,延时2us    
//dummy READ
LCD_RD_CLR;    
delay_us(2);//FOR 8989,延时2us    
LCD_RD_SET;
t=DATAIN;  
LCD_CS_SET;

 
GPIOB->CRL=0X33333333; //PB0-7  上拉输出
GPIOB->CRH=0X33333333; //PB8-15 上拉输出
GPIOB->ODR=0XFFFF;    //全部输出高  

return t;
 
}



void LCD_init()                       //  LCD ID: 0xB505
{
LCD_WriteReg(0x0000,0x0000);
LCD_WriteReg(0x0000,0x0000);
LCD_WriteReg(0x0000,0x0000);
LCD_WriteReg(0x0000,0x0000);
LCD_WriteReg(0x00a4,0x0001);
delay_ms(20);   
LCD_WriteReg(0x0060,0x2700);
LCD_WriteReg(0x0008,0x0202);
LCD_WriteReg(0x0030,0x0214);
LCD_WriteReg(0x0031,0x3715);
LCD_WriteReg(0x0032,0x0604);
LCD_WriteReg(0x0033,0x0e16);
LCD_WriteReg(0x0034,0x2211);
LCD_WriteReg(0x0035,0x1500);
LCD_WriteReg(0x0036,0x8507);
LCD_WriteReg(0x0037,0x1407);
LCD_WriteReg(0x0038,0x1403);
LCD_WriteReg(0x0039,0x0020);
LCD_WriteReg(0x0090,0x001a);
LCD_WriteReg(0x0010,0x0000);
LCD_WriteReg(0x0011,0x0007);
LCD_WriteReg(0x0012,0x0000);
LCD_WriteReg(0x0013,0x0000);
delay_ms(20);
LCD_WriteReg(0x0010,0x0730);
LCD_WriteReg(0x0011,0x0137);
delay_ms(20);
LCD_WriteReg(0x0012,0x01b8);
delay_ms(20);
LCD_WriteReg(0x0013,0x0f00);
LCD_WriteReg(0x002a,0x0080);
LCD_WriteReg(0x0029,0x0048);
delay_ms(20);
LCD_WriteReg(0x0001,0x0100);
LCD_WriteReg(0x0002,0x0700);
LCD_WriteReg(0x0003,0x1230);//LCD_WriteReg(0x0003,0x1230);
LCD_WriteReg(0x0008,0x0202);
LCD_WriteReg(0x000a,0x0000);
LCD_WriteReg(0x000c,0x0000);
LCD_WriteReg(0x000d,0x0000);
LCD_WriteReg(0x000e,0x0030);
LCD_WriteReg(0x0050,0x0000);
LCD_WriteReg(0x0051,0x00ef);
LCD_WriteReg(0x0052,0x0000);
LCD_WriteReg(0x0053,0x013f);
LCD_WriteReg(0x0060,0x2700);
LCD_WriteReg(0x0061,0x0001);
LCD_WriteReg(0x006a,0x0000);
//LCD_WriteReg(0x0080,0x0000);
//LCD_WriteReg(0x0081,0x0000);
LCD_WriteReg(0x0090,0X0011);
LCD_WriteReg(0x0092,0x0600);
LCD_WriteReg(0x0093,0x0402);
LCD_WriteReg(0x0094,0x0002);
delay_ms(20);
LCD_WriteReg(0x0007,0x0001);
delay_ms(20);
LCD_WriteReg(0x0007,0x0061);
LCD_WriteReg(0x0007,0x0173);
LCD_WriteReg(0x0020,0x0000);
LCD_WriteReg(0x0021,0x0000);   
LCD_WriteReg(0x00,0x22); 

LCD_LED=1;
}

//设置一种颜色************************************************************************************************
u16 color(u8 R,u8 G,u8 B)
{
u16  CRGB,RGB0,RGB1,RGB2,RGB3,RGB4;

RGB0=B;

RGB1=G;
RGB2=RGB1<<5;

RGB3=R;
RGB4=RGB3<<11;

CRGB =RGB0|RGB2|RGB4;

return CRGB;
}


//画一个点   ************************************************************************************************
void DrawPoint(u16 x,u16 y)
{
LCD_WriteReg(0x0020,x);  //X
LCD_WriteReg(0x0021,y);  //Y

LCD_WR_REG(0x22);
LCD_WR_DATA(F_COLOR);
}



//以背景色清屏 ************************************************************************************************
void clear_lcd()
{
u16  i,j;

LCD_WriteReg(0x0020,0x00);  //X
LCD_WriteReg(0x0021,0x00);  //Y
LCD_WR_REG(0x22);

for (i=0;i<320;i++) 
{
for (j=0;j<240;j++)
{
LCD_WR_DATA(B_COLOR);
}
}
}

 //透明背景色的显示字符函数  ***********************************************************************************

void SHOW_char_NBC(u8 Page,u8 List,u8 onechar)
{
 u8 i,j;
 u16 temp1,temp2,temp3,temp4;

 temp1=onechar-' ';

 temp3=F_COLOR;

 for (i=0;i<16;i++)
{
temp4=asc2_1608[temp1];

for (j=0;j<8;j++)
{
temp2 = temp4;
temp2 &= 0x01;
temp4 >>=1;

if(temp2==0)
{
F_COLOR=LCD_ReadPoint(List*8+j,Page*16+i);
}
else
    {
    F_COLOR=temp3;
}


LCD_WriteReg(0x0020,List*8+j);  //X
LCD_WriteReg(0x0021,Page*16+i);  //Y
LCD_WR_REG(0x22);

LCD_WR_DATA(F_COLOR);
}
}

F_COLOR=temp3;  //返回颜色值
}

//固定前影色和背景色的显示字符函数  ************************************************************************************************
void SHOW_char(u8 Page,u8 List,u8 onechar)    

{
u8 i,j;
u16 temp1,temp2,temp3,temp4;

temp1=onechar-' ';

temp3=F_COLOR;

LCD_WriteReg(0x0050,List*8);
LCD_WriteReg(0x0051,(List*8)+7);

LCD_WriteReg(0x0052,Page*16);
LCD_WriteReg(0x0053,(Page*16)+15);

LCD_WriteReg(0x0020,List*8);  //X
LCD_WriteReg(0x0021,Page*16);  //Y

LCD_WR_REG(0x22);

for (i=0;i<16;i++)
{
temp4=asc2_1608[temp1];
for (j=0;j<8;j++)
{
temp2 = temp4;
temp2 &= 0x01;
temp4 >>=1;


if(temp2==0)
{
F_COLOR=B_COLOR;
}
else
    {
    F_COLOR=temp3;
}

LCD_WR_DATA(F_COLOR);
}
}
    F_COLOR=temp3;


LCD_WriteReg(0x0050,0);    //开放回窗口
LCD_WriteReg(0x0051,239);
LCD_WriteReg(0x0052,0);
LCD_WriteReg(0x0053,319);

}


//用背景色刷出N个字符位  *****************************************************************************************
void Clear_line(u8 page,u8 list,u8 N)

{
u8 i;

for (i=0;i<N;i++)
{
SHOW_char(page,list,' ');
list=list+1;
}

}

//显示一串字符函数  ************************************************************************************************
void linechar_1608t(u8 Page,u8 List,u8 *pd)
{
     u8 temp;

 while((*pd)!='\0')
  {
  temp=*pd;

  SHOW_char_NBC(Page,List,temp);

  pd++;
  List=List+1;
 }

}
// 显示数字串   *******************************************************************************************
void count_show(u8 Page,u8 List,u16 input)
{

u16 temp0,temp1,temp2,temp3,temp4,A,B;

  temp0=input/10000;  //将脉冲个数转换成字符由1602输出 
  
   
  A=input%10000;
  temp1=A/1000;

  B=A%1000;
  temp2=B/100;

  A=B%100;
  temp3=A/10;

  B=A%10;
  temp4=B;
  

  if (temp0!=0)
   {
SHOW_char_NBC(Page,List,'0'+temp0);
List=List+1;
}

  if ((temp1!=0)|(temp0!=0))
   {
SHOW_char_NBC(Page,List,'0'+temp1);
List=List+1;
}

  if ((temp2!=0)|(temp1!=0)|(temp0!=0))
   {
SHOW_char_NBC(Page,List,'0'+temp2);
List=List+1;
}
  if ((temp3!=0)|(temp2!=0)|(temp1!=0)|(temp0!=0))
   {
SHOW_char_NBC(Page,List,'0'+temp3);
List=List+1;
}

  SHOW_char_NBC(Page,List,'0'+temp4);

}

// SPI 启动   *******************************************************************************************
void ADS7843SPI_start() 
{
    DCLK=0;

    CS=1;
    DIN=1;

    DCLK=1;

    CS=0;
}


// 写一个命令到ADS7843   ********************************************************************************

void Write_Com_to_7843(u8 COM)
{
u8 i,temp;

DCLK=0;
// CS=0;

for (i=0;i<8;i++)
{
temp=COM & 0x80;  //从最高位取Bit 

if (temp==0)
{
DIN=0;
}
else
    {
DIN=1;
}

COM<<=1;
    DCLK=0;    //底电平放数上总线
    DCLK=1;   //上升沿后 ADS7843 读总线数据
}

//  CS=1;
}
// 读一个数据 到ADS7843   ********************************************************************************

u16  Read_data_form7843()

{
u8 i;
u16 data;

delay_us(6);   //ADS7846的转换时间最长为6us  看TI资料的第九页 ADS7843 BUSY 很忙 要给他时间
DCLK=1;        //给1个时钟,清除BUSY        
DCLK=0; 

for (i=0;i<16;i++)
{
data<<=1;

DCLK=1;
delay_us(1);
DCLK=0;  //SPI 读数据刚好和写数据相反, 是在时钟下降沿后 主机才能读数据
if (DOUT)data++;
}

  data>>=4;  //两个时钟周期中,后4位全是0没有用,要去掉.因为ADS7843只给出12位精度的数据

return (data);
}


// 主函数   ************************************************************************************************
int main(void)
{
  u16  x,y;
  Stm32_Clock_Init(9);
  delay_init(72);
  uart_init(72,9600);
  LCD_IO_Init();
  LCD_init();

  B_COLOR=color(7,14,7);
  clear_lcd();

  while (1) 
    {   
ADS7843SPI_start();

Write_Com_to_7843(CMD_RDX);
x=Read_data_form7843();

Write_Com_to_7843(CMD_RDY);
y=Read_data_form7843();

F_COLOR = color(0,60,0);
linechar_1608t(3,6,"This is X data\0");
count_show(5,12,x);


F_COLOR = color(0,60,0);
linechar_1608t(7,6,"This is Y data\0");
count_show(9,12,y);

delay_ms(50);
B_COLOR=color(7,14,7);
Clear_line(5,12,5);
Clear_line(9,12,5);
}
}


 

我的工作就是天天在玩
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-6-24 20:46:40 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-5-7
在线时间
8 小时
发表于 2012-6-24 21:31:15 | 显示全部楼层
楼主更新好快啊!呵呵……
耐心做事,好好做人。O(∩_∩)O!
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-24 21:51:07 | 显示全部楼层
学得快嘛.以下没什么难度的话明天玩无线通信
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

27

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
300
金钱
300
注册时间
2012-9-11
在线时间
31 小时
发表于 2012-10-11 15:02:32 | 显示全部楼层
回复【楼主位】chinafox:
---------------------------------
linechar_1608t(7,6,"This is Y data\0");
为什么我的这个函数只能显示一个字符“T”,其他的都显示不出来啊???
回复 支持 反对

使用道具 举报

7

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2012-9-25
在线时间
3 小时
发表于 2012-10-11 17:31:55 | 显示全部楼层
楼主学习很认真!
回复 支持 反对

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
发表于 2012-11-9 14:38:27 | 显示全部楼层
楼主学习很认真!
回复 支持 反对

使用道具 举报

5

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
411
金钱
411
注册时间
2012-8-11
在线时间
32 小时
发表于 2012-11-13 23:06:53 | 显示全部楼层
楼主学习挺好的
做人要出于情,做事要出于心!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-9-28
在线时间
0 小时
发表于 2013-9-28 16:34:57 | 显示全部楼层
学习了。。。
There's always hope.....
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-12 07:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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