数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1527|回复: 0

[other] Arduino也能驱动LED显示屏,LED业界标准Arduino驱动方案解析

[复制链接]
发表于 2022-2-11 14:04:41 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
本帖最后由 zzz 于 2013-6-29 17:08 编辑


现在市面上有很多很多的LED显示屏,但大多都基于同一种,或者同一类型的驱动方式,简称08驱动方式,它内部有LED点阵,74HC595,以及138行扫芯片组成,但毫无例外的,是主控板都采用了STC方案,或者串口方案,而Arduino驱动却鲜有人用,LED业界标准Arduino驱动方案的介绍与解析
重点便是行驱的模式,今天我推荐两种驱动模式,分别是16*16驱动模式,和16*64直接驱动模式,这两种模式各有特点,16*16即是汉字是一个一个取模,一个一个显示,而16*64是取模软件直接取出一幅完整的图像。如果是显示汉字的同学,推荐采用第一种,而显示图形的同学,推荐采用第二种。

下面,先把主体的演示代码发一下。

  1. #define RowA 2   
  2. #define RowB 3
  3. #define RowC 4
  4. #define RowD 5
  5. //业界所采用的ABCD 08驱动模式
  6. int hc138en=6; //EN口

  7. //使用了硬件SPI,以下脚不能更改
  8. #define R1 11          //数据出    MOSI
  9. #define CLK 13         //时钟    SCK
  10. #define STB 10         //595 刷新显示  SS
  11. #define DATAIN  12     //数据入,读FLASH时有用  MISO

  12. byte row=0;
  13. byte zzz[] =

  14. {
  15. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF1,0xFF,0xE3,0xFF,0xC0,0x00,0x00,
  16. 0xFF,0xF1,0xFF,0xE3,0xFF,0xC0,0x00,0x00,0x00,0x70,0x00,0xE0,0x01,0xC0,0x00,0x00,
  17. 0x00,0xE0,0x01,0xC0,0x03,0x80,0x00,0x00,0x01,0xC0,0x03,0x80,0x07,0x00,0x00,0x00,
  18. 0x03,0x80,0x07,0x00,0x0E,0x00,0x00,0x00,0x07,0x00,0x0E,0x00,0x1C,0x00,0x00,0x00,
  19. 0x0E,0x00,0x1C,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0x00,0x00,
  20. 0x38,0x00,0x70,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0xE0,0x01,0xC0,0x00,0x00,0x00,
  21. 0xE0,0x01,0xC0,0x03,0x80,0x00,0x00,0x00,0xFF,0xF1,0xFF,0xE3,0xFF,0xC0,0x00,0x00,
  22. 0xFF,0xF1,0xFF,0xE3,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  23. };



  24. void spi_transfer(volatile char data)
  25. {
  26.   SPDR = data;                    // Start the transmission
  27.   while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  28.   {
  29.   };
  30.   //return SPDR;                    // return the received byte
  31. }


  32. void hc138sacn(byte r){  //输出行线状态ABCD (A低,D高)
  33.     digitalWrite(RowA,(r & 0x01));
  34.     digitalWrite(RowB,(r & 0x02));
  35.     digitalWrite(RowC,(r & 0x04));
  36.     digitalWrite(RowD,(r & 0x08));
  37. }
  38.   
  39. void hc595senddata(byte data){// 高位在前  反相(1亮0灭)
  40. for (byte i=0; i<8;i++) {
  41.      digitalWrite(CLK,0);
  42.      if (data & 0x80) {
  43.          digitalWrite(R1, 0);     
  44.      } else {
  45.          digitalWrite(R1, 1);
  46.      }
  47.      data=data<<1;
  48.      digitalWrite(CLK,1);
  49. }

  50. }
  51.   
  52.   
  53. void setup () {

  54.     pinMode(RowA, OUTPUT);
  55.     pinMode(RowB, OUTPUT);
  56.     pinMode(RowC, OUTPUT);
  57.     pinMode(RowD, OUTPUT); //138片选
  58.     pinMode(hc138en, OUTPUT); //138 使能
  59.   
  60.     pinMode(R1, OUTPUT);//595 数据
  61.     pinMode(CLK, OUTPUT); //595 时钟
  62.     pinMode(STB, OUTPUT); //595 使能
  63.     pinMode(DATAIN, INPUT); //595 使能

  64.   
  65.      //digitalWrite(hc138d, HIGH);
  66.     Serial.begin(19200);

  67.     //SPI硬件设置
  68.     // SPCR = 01010000
  69.     //interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
  70.     //sample on leading edge of clk,system clock/4 rate (fastest)
  71.     SPCR = (1<<SPE)|(1<<MSTR);
  72.     delay(10);
  73. }
  74.   
  75. void loop () {
  76. if (Serial.available() > 0) {
  77. // read the incoming byte:
  78. row = Serial.read();

  79. // say what you got:
  80. Serial.print("I received: ");
  81. Serial.println(row, DEC);
  82. }

  83.   for(row=0;row<16;row++){

  84.       for (int i=0;i<8;i++){   
  85.          spi_transfer(~(zzz[i+row*8]));
  86.       }
  87.          

  88.       digitalWrite(hc138en, 1);  //关闭显示
  89.       hc138sacn(row);            //换行
  90.       digitalWrite(STB, 0);      //595刷新      
  91.       digitalWrite(STB, 1);
  92.       delayMicroseconds(500) ;   //节电用,
  93.       digitalWrite(hc138en, 0);  //开启显示

  94.       delayMicroseconds(500) ;  //刷新频率调,差不多60HZ,1/16间隔
  95.    
  96.   }  

  97. }
复制代码
从上面代码可以轻松的看出驱动原理并不复杂,其实就是把取模软件生成的字模,储存到一个数组里,然后调用arduino的硬件SPI通讯接口,把每8个LED看成是一个十六进制编码,然后一行一行的发送出去,发完一行后,再发出换行指令,就是这么简单。
置于16*16单个汉字取模显示,只要把主loop里的代码改为即可,其实就是简单的数学原理,把数组里的十六进制数按照一组一组提取显示而已~

  1.   for(row=0;row<16;row++){

  2.       for (int i=0;i<4;i++){//8片595
  3.          //硬件SPI  发送8字节耗时:22US         
  4.          spi_transfer(~(zzz[i*32+row*2]));  //硬件SPI      
  5.          spi_transfer(~(zzz[i*32+row*2+1]));  //硬件SPI        
  6.       }
复制代码


取模软件请选择横向顺序扫描~下载在附件哦~





楼上所有的楼主和访客表示感谢,提供了很多有用的资料。
我在此基础上实现了64*32LED阵列的显示,但是问题是用软件SPI刷新速度跟不上,屏幕呈闪烁状态。顾想通过软硬SPI一起执行,提高速率。但是失败了。用了硬件SPI就没法用软件SPI,用了软件SPI就没法用硬件SPI。(我对SPI通信不是很懂)望各位能不能提供好的方法提高刷新速度。

PS:刷 64 * 16 还算可以,可是64 * 32 就 不行了。

附上代码:
  1. int R1=11;
  2. int R2=9;
  3. int STR=10;
  4. int CLK=13;
  5. int EN=6;


  6. int dig0=2;
  7. int dig2=3;
  8. int dig4=4;
  9. int dig8=5;
  10. //int i,m;

  11. unsigned char jj,j;

  12. int down = 0;
  13. int row_ = 0;
  14. void setup()
  15. {
  16.   pinMode(R1,OUTPUT);
  17.    pinMode(R2,OUTPUT);
  18.   pinMode(STR,OUTPUT);
  19.   pinMode(CLK,OUTPUT);
  20.   pinMode(EN,OUTPUT);
  21.   pinMode(dig0,OUTPUT);
  22.   pinMode(dig2,OUTPUT);
  23.   pinMode(dig4,OUTPUT);
  24.   pinMode(dig8,OUTPUT);

  25. //Serial.begin(19200);

  26. //SPCR = (1<<SPE)|(1<<MSTR);
  27. //delay(10);

  28. }

  29. unsigned char zi[]={
  30. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  31. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  32. 0xFD,0xFE,0x1E,0x01,0xBF,0x7F,0x7F,0x7F,0xFD,0xFD,0xEF,0xFD,0xBE,0xFF,0x7F,0x7F,
  33. 0xF9,0xFB,0xF7,0xFB,0xBD,0xFF,0x7F,0x7F,0xFA,0xFB,0xFF,0xF7,0xBB,0xFF,0x6F,0x7B,
  34. 0x87,0x0D,0xFF,0xEF,0xB7,0xFF,0x70,0x07,0xEF,0xBE,0x1F,0xDF,0xAB,0xFF,0x7C,0x1F,
  35. 0xF7,0x7F,0xEF,0xDF,0x9D,0xFF,0x7E,0x3F,0xF7,0x7F,0xF7,0xBF,0xBD,0xFF,0x7C,0x1F,
  36. 0xF0,0x7B,0xF7,0x7F,0xBE,0xEF,0x7D,0xDF,0xF7,0x7D,0xEE,0xFF,0xBF,0x6F,0x7B,0xEF,
  37. 0xEF,0xBE,0x1E,0x01,0xBF,0xB0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  38. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  39. 0xED,0xB7,0xFE,0xFF,0xFD,0xFF,0x90,0x07,0xE5,0x37,0xFF,0x7F,0xFE,0xFF,0xDF,0xF7,
  40. 0xF5,0xE0,0x40,0x01,0x80,0x03,0xFF,0xF7,0xC8,0x2F,0xDF,0xFD,0xBF,0xFB,0x60,0x37,
  41. 0xF1,0xCE,0xF8,0x07,0xF3,0x3F,0x6F,0xB7,0xCC,0x4E,0xFF,0xCF,0xE7,0xCF,0x6F,0xB7,
  42. 0xFB,0xF5,0xFF,0xBF,0x9F,0xE3,0x60,0x37,0xC0,0x75,0xFF,0x7F,0x3F,0xF9,0x6F,0xB7,
  43. 0xEE,0xF9,0x80,0x00,0xC0,0x07,0x6F,0xB7,0xEE,0xFB,0xFF,0x7F,0xFE,0xFF,0x60,0x37,
  44. 0xF1,0xF5,0xFF,0x7F,0xFE,0xFF,0x6F,0xF7,0xF0,0x4C,0xFF,0x7F,0xFE,0xFF,0x7F,0xF7,
  45. 0xCE,0x9F,0x78,0x7F,0x80,0x03,0x7F,0x87,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
  46. };

  47. void row1(int i)
  48. {
  49.         digitalWrite(dig0,(i&0x01));
  50.         digitalWrite(dig2,(i&0x02));
  51.         digitalWrite(dig4,(i&0x04));
  52.         digitalWrite(dig8,(i&0x08));
  53. }


  54. void spi_transfer(volatile char data)
  55. {
  56.   SPDR = data;                    // Start the transmission
  57.   while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  58.   {
  59.   };
  60.   //return SPDR;                    // return the received byte
  61. }

  62. void sendbyte(byte bbyte1){// 高位在前 反相(1亮0灭)
  63. for (byte i=0; i<8;i++) {
  64. digitalWrite(CLK,0);
  65. if ( bbyte1 & 0x80) {
  66. digitalWrite(R1, 1);
  67. } else {
  68. digitalWrite(R1, 0);
  69. }
  70. bbyte1= bbyte1<<1;
  71. digitalWrite(CLK,1);
  72. }

  73. }

  74. void sendbyte2(byte bbyte1){// 高位在前 反相(1亮0灭)
  75. for (byte i=0; i<8;i++) {
  76. digitalWrite(CLK,0);
  77. if ( bbyte1 & 0x80) {
  78. digitalWrite(R2, 1);
  79. } else {
  80. digitalWrite(R2, 0);
  81. }
  82. bbyte1= bbyte1<<1;
  83. digitalWrite(CLK,1);
  84. }

  85. }




  86. void loop()
  87. {
  88.         unsigned char row,m,k;
  89.        for(row=0;row<16;row++){
  90.          
  91.             for (int i=0;i<8;i++){
  92.                sendbyte(zi[i+down*8]);
  93.            }

  94. //          for(row=0;row<16;row++){
  95. //           
  96. //                for (int i=0;i<8;i++){   
  97. //                   //spi_transfer((zi[i+down*8]));
  98. //                }
  99.                
  100.               down++;
  101.                 digitalWrite(EN,1);
  102.                 row1(row);
  103.                 digitalWrite(STR,0);
  104.                 digitalWrite(STR,1);
  105.                 delayMicroseconds(0);
  106.                 digitalWrite(EN,0);
  107.                 delayMicroseconds(0);
  108.         }
  109.         
  110.          for(row=0;row<16;row++){
  111.          
  112.             for (int i=0;i<8;i++){
  113.                 sendbyte2(zi[i+down*8]);
  114.            }
  115.               down++;
  116.                 digitalWrite(EN,1);
  117.                 row1(row);
  118.                 digitalWrite(STR,0);
  119.                 digitalWrite(STR,1);
  120.                 delayMicroseconds(0);
  121.                 digitalWrite(EN,0);
  122.                 delayMicroseconds(0);
  123.         }
  124.         down = 0;
  125. }
复制代码
还有一段在uno上能正常跑起来的滚屏
  1. #define RowA 2   
  2. #define RowB 3
  3. #define RowC 4
  4. #define RowD 5
  5. //业界所采用的ABCD 08驱动模式
  6. /*  2 ABCD G1 G2 STB CLK 16 1 N N N EN R1 R2 N N 15*/
  7. int hc138en=6; //EN口

  8. //使用了硬件SPI,以下脚不能更改
  9. #define R1 11          //数据出    MOSI
  10. #define CLK 13         //时钟    SCK
  11. #define STB 10         //595 刷新显示  SS  锁存         STB(LT)为锁存信号,CLK(CK)为时钟信号
  12. #define DATAIN  12     //数据入,读FLASH时有用  MISO

  13. char yid,h;                     //YID为移动计数器,H为行段计数器
  14. int zimuo;                   //字模计数器

  15. byte Zdate[10];  //缓存
  16. byte zzz[] =
  17. {/*------------------------------------------------------------------------------
  18. ;  源文件 / 文字 : 吉祥如意
  19. ;  宽×高(像素): 64×16
  20. ------------------------------------------------------------------------------*/
  21. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  22. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  23. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  24. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  25. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  26. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  27. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  28. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  29. 0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x08,0x7F,0xFC,0x00,0x00,
  30. 0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x00,0x00,/*"吉",0*/
  31. 0x21,0x04,0x10,0x88,0x10,0x50,0xFD,0xFE,0x04,0x20,0x08,0x20,0x11,0xFC,0x38,0x20,
  32. 0x54,0x20,0x94,0x20,0x13,0xFE,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,/*"祥",1*/
  33. 0x10,0x00,0x10,0x00,0x18,0x00,0x10,0x7E,0xFE,0x42,0x22,0x42,0x22,0x42,0x22,0x42,
  34. 0x22,0x42,0x24,0x42,0x14,0x42,0x08,0x42,0x14,0x7E,0x23,0x42,0x42,0x42,0x80,0x00,/*"如",2*/
  35. 0x01,0x00,0x3F,0xFC,0x08,0x20,0x04,0x40,0xFF,0xFE,0x00,0x00,0x1F,0xF0,0x12,0x10,
  36. 0x11,0x10,0x1F,0xF0,0x00,0x00,0x29,0x08,0x28,0x84,0x68,0x14,0x07,0xF0,0x00,0x00,/*"意",3*/

  37. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  38. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  39. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  40. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  41. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  42. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  43. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  44. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  45. };

  46. void spi_transfer(volatile char data)
  47. {
  48.   SPDR = data;                    // Start the transmission
  49.   while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  50.   {
  51.   };
  52.   //return SPDR;                    // return the received byte
  53. }


  54. void hc138sacn(byte r){  //输出行线状态ABCD (A低,D高)
  55.     digitalWrite(RowA,(r & 0x01));
  56.     digitalWrite(RowB,(r & 0x02));
  57.     digitalWrite(RowC,(r & 0x04));
  58.     digitalWrite(RowD,(r & 0x08));
  59. }
  60. /**************************************************************************************
  61. 左移显示数据生成模块:(功能相当于有返回值的函数 )
  62. ***************************************************************************************/
  63. char two_onebyteL(char h1,char h2)
  64. {
  65. char temp,tempcol;          //输出变量;列移动位数变量。
  66. if(yid<8)
  67. tempcol=yid;
  68. else
  69. tempcol=yid-8;
  70. temp=(h1<<tempcol)|(h2>>(8-tempcol));    //左移显示
  71. temp=255-temp;           
  72. return temp;            //将显示数据返回显示输出函数。
  73. }
  74. /*************************************************************************************
  75. 左移待显示数据调取函数
  76. *************************************************************************************/
  77. void loadoneline_L(void)
  78. {
  79. char s;               //此处不要用uchar定义s
  80. for(s=4;s>=0;s--)           //s值为屏数加1(16*16为一屏)
  81. {
  82. Zdate[2*s]=zzz[zimuo+32*s+2*h];
  83. Zdate[2*s+1]=zzz[zimuo+1+32*s+2*h];   //左移显示
  84. }
  85. }

  86. /**********************************************************************************
  87. 左移显示数据输出函数 : 为显示数据生成模块的h1、h2赋值并且输出合成后的新的h1、h2数据
  88. ***********************************************************************************/
  89. void sendoneline_L(void)
  90. {
  91. char s;char inc;
  92. if(yid<8)inc=0;else inc=1;
  93. for(s=0+inc;s<8+inc;s++)
  94. {   //左移显示:单屏s=1+,4屏s=7+,8屏s=15+;
  95. spi_transfer(two_onebyteL(Zdate[s],Zdate[s+1]));
  96. }
  97. }
  98. int uiAllData = sizeof(zzz)-128;  //定义显示字幕数据的长度 2048/32=64
  99. void setup ()
  100. {
  101.     pinMode(RowA, OUTPUT);
  102.     pinMode(RowB, OUTPUT);
  103.     pinMode(RowC, OUTPUT);
  104.     pinMode(RowD, OUTPUT); //138片选
  105.     pinMode(hc138en, OUTPUT); //138 使能
  106.     pinMode(R1, OUTPUT);//595 数据
  107.     pinMode(CLK, OUTPUT); //595 时钟
  108.     pinMode(STB, OUTPUT); //595 使能
  109.     pinMode(DATAIN, INPUT); //595 使能
  110.       //digitalWrite(hc138d, HIGH);
  111.   Serial.begin(19200);
  112. SPCR = (1<<SPE)|(1<<MSTR);
  113. delay(10);
  114. }
  115.   
  116. void loop ()
  117. {
  118. char i,d=10;
  119. yid=0;
  120. h=0;
  121. zimuo=0;                                                   
  122. while(1)
  123.   {
  124.        while(yid<16)                             //数据移位。
  125.        {
  126.             for(i=0;i<d;i++)                      //移动速度
  127.               {
  128.                for(h=0;h<16;h++)
  129.                 {   
  130.                 loadoneline_L();
  131.                 sendoneline_L();
  132.                
  133.                 digitalWrite(hc138en, 1);  //关闭显示
  134.                 digitalWrite(STB, 0);      //595刷新      
  135.                 digitalWrite(STB, 1);
  136.                 hc138sacn(h);            //换行   
  137.                 delayMicroseconds(50) ;   //节电用,
  138.                 digitalWrite(hc138en, 0);  //开启显示
  139.                 delayMicroseconds(500) ;  //刷新频率调,差不多60HZ,1/16间隔                        
  140.                 }                           
  141.                }
  142.              yid++;                        //移动一步  
  143.           }
  144.       yid=0;
  145.       zimuo=zimuo+32;                    //后移一个字,  
  146.       if(zimuo>= uiAllData )         //定义显示字幕数据的长度 2048/32=64 即显示完64个16*16大小的字符后 重新循环
  147.    zimuo=0;
  148.   }
  149. }
复制代码



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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2026-4-4 08:50 , Processed in 0.202800 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz!

© MyDigit.Net Since 2006

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