久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: TFT彩屏SPI驅(qū)動編程-基于STC32G12K128單片機(jī)的SPI_DMA功能的例程分享 [打印本頁]

作者: 麗江春水    時間: 2023-2-5 17:26
標(biāo)題: TFT彩屏SPI驅(qū)動編程-基于STC32G12K128單片機(jī)的SPI_DMA功能的例程分享
Spi接口的接線,分四線制和三線制,據(jù)說SPI協(xié)議沒有確定的文字規(guī)定,只有實事的實現(xiàn)方案,而行業(yè)內(nèi)的現(xiàn)狀則是眾說紛紜,我大概把它們分為兩類,一類是按實際用了幾條線實現(xiàn)傳輸,一類是按信號傳遞格式來劃分。具體到屏顯驅(qū)動來講,凡是接口有獨立的數(shù)據(jù)/命令(RS.DC.A0等叫法都有)接線的,屬于我們適用的范圍,具體用了幾條線,我數(shù)學(xué)不好,就不去數(shù)了。這不是說沒有數(shù)據(jù)/命令選擇線的不能用,反而是那種可能更有用這種驅(qū)動模式的需要,但我手里沒有這樣的屏,對不熟悉,沒驗證的東西,就不去評論了。
SPI接口的TFT彩屏在mcu工程里是常見的。其優(yōu)點是接線方便,占用IO        口少,色彩豐富。缺點是速度會慢些,一方面是因為彩屏顯示需要的數(shù)據(jù)量大,單色屏一個字節(jié)可以包涵8個點的顯示信息,而彩屏一個點就需要二個字節(jié)的信息。另一方面是它屬于串口傳輸,并口傳輸一次可以送出8到16位信息,而串口一次只能送出一位信息,信息量大加傳輸慢,就成了SPI接口彩屏的一個短板。特別是在屏的顯示點數(shù)多時,尤其明顯。
記得DMA技術(shù)剛問世時是用在PC機(jī)上,當(dāng)時經(jīng)銷商把它當(dāng)賣點,用戶則花錢買功能。只要花了錢,就能用上這個功能了。
但在mcu領(lǐng)域有些不同,DMA技術(shù)不僅需要芯片功能上支持,還需要技術(shù)人員愿意去用。一些學(xué)成的技術(shù)人員因為工作忙,面對的問題又能用傳統(tǒng)手段解決,使用DMA的動力就不足了。而新人由于感覺這東西有些難弄,也不愿用。
本文說的TFT彩屏SPI驅(qū)動的編程,是基于DMA功能的SPI彩屏驅(qū)動程序,因為SPI接口慢,所以使用DMA的意義更大。由于STC32G12K128芯片具有DAM功能,所以就以這個芯片為依托,寫了一組SPI接口的驅(qū)動程序,這個模式的程序,能加快刷屏速率,很大地提高芯片的工作效率。
下面先看一下SPI接口驅(qū)動中最基本的函數(shù),數(shù)據(jù)傳送函數(shù)。分別是軟件模擬SPI傳送,硬件SPI數(shù)據(jù)傳送和基于SPI_DMA的數(shù)據(jù)傳送函數(shù)
第一個:軟件模擬SPI數(shù)據(jù)傳送函數(shù)
void transfer_data(unsigned int data1)//需要傳送命令時加DC=0
{
char i;
CS=0;
for(i=0;i<8;i++)
{
SCL=0;//sclk=0;
//delay(4);
if((data1&0x80)==0) SDA=0;//sid=1;
else SDA=1;//sid=0;
SCL=1;//sclk=1;
data1=data1<<=1;
// delay(4);
}
// CS=1;
}
第二個:硬件SPI數(shù)據(jù)傳送函數(shù)
void transfer_data(unsigned int data1)//需要傳送命令時加DC=0
{
CS=0;
SPSTAT=0xc0;
SPDAT=data1;
while(!SPIF);//等待發(fā)送完成
}
第三個:基于SPI_DMA的數(shù)據(jù)傳送函數(shù)
void transfer_data(unsigned int dat1)
        {
CS=0;
DMASPI_initial();//這一句不是必須的,為了保險,我喜歡加上這一句
        *(unsigned char *)(0x10000)=dat1;//待傳送數(shù)據(jù)送專用緩存區(qū),就是buffer1
        DMA_SPI_CR=0xc1;//開始執(zhí)行,采用主機(jī)模式,并清空FIFO,
while(!(DMA_SPI_STA&0x01));
}
顯然,軟件模擬SPI傳送函數(shù)比較麻煩,速度也慢很多,但它的優(yōu)點是對mcu硬件依賴少,基本可以在任何IO口實現(xiàn),所以屏的賣家愿意用它寫的測試驅(qū)動。
硬件SPI的數(shù)據(jù)傳送函數(shù)就很給力了。與SPI_DMA的數(shù)據(jù)傳送比,寫入數(shù)據(jù)后自動開始傳送,而后者寫入數(shù)據(jù)與啟動傳送是兩個語句,并且硬件SPI也是外設(shè)接口,就是說它運行時有相對的獨立性,對mcu的依賴較少,所以很棒,而基于SPI_DMA的數(shù)據(jù)傳送函數(shù),語句多了,而且還要有專門緩沖區(qū)配合,在單個數(shù)據(jù)傳送上,不如硬件SPI的傳送函數(shù)便捷。
需要說明,基于DMA的SPI接口彩屏驅(qū)動,必須使用(開啟)硬件SPI功能。這是前提條件。
在具體的應(yīng)用中,傳送函數(shù)用硬件SPI的和用SPI_DAM的都可以,但既然硬件SPI的傳送函數(shù)很好用了,SPI_DMA的傳送函數(shù)寫出來更多是象征性的了。表示可行,但不表示必須用。SPI_DMA的長項在批量數(shù)據(jù)傳送上。
這里說了半天一是介紹一下情況,二是表明兩個函數(shù)的兼容性:
基于SPI_DMA數(shù)據(jù)傳送函數(shù)的程序,使用硬件SPI傳送函數(shù)都可以順暢運行
反過來
基于硬件SPI數(shù)據(jù)傳送函數(shù)的程序,在SPI_DMA傳送函數(shù)下不一定能運行
原因是緩沖區(qū)可能出問題。也可以說話程序?qū)懙牟粔蚝谩N冶M量采用SPI_DMA做依托寫函數(shù),運行時使用硬件SPI支持。
下面是圖像顯示函數(shù),這是SPI_DMA技術(shù)的強(qiáng)項。
void SPI_DMA_DISP(unsigned int x,unsigned int y,unsigned int x_width,unsigned int y_height,unsigned int total_num,unsigned int once_num,unsigned char *p,unsigned char *Q)
{
unsigned int ii,jj;
unsigned long kee;
unsigned char *kkee;
kkee=Q;//保存入口地址,方便指針復(fù)位時使用
lcd_address(x,y,x_width-1,y_height-1);//通知屏幕需要刷圖的位置,這個指令要盡量往前放,因為其中用到數(shù)據(jù)傳送,會影響傳送參數(shù)的設(shè)置。
kee=(unsigned long)(Q);//取緩沖區(qū)首地址的值,也就是打算發(fā)送給屏幕的數(shù)據(jù)源地址的值(緩沖區(qū)首地址是1:0000H。所以習(xí)慣用long類型變量)
DMA_SPI_TXAH=(kee)>>8;//把源地值高位賦給地址寄存器
DMA_SPI_TXAL=kee;//在xdata的起始地址01:0002H
DMA_SPI_AMTH=(once_num-1)>>8;
DMA_SPI_AMT=(once_num-1);
for(ii=0;ii<(total_num/once_num);ii++)//total_num/once_num必須是個整數(shù),否則要做處理
{
for(jj=0;jj<once_num;jj++)//把要送屏的數(shù)據(jù)寫入指定的緩沖數(shù)組
{
*Q=*p;//傳送圖像數(shù)據(jù),p指向code區(qū)的圖像數(shù)組,Q指向緩沖區(qū)buffer2
p++;
Q++;
}
        Q=kkee;//傳送一輪后,緩沖區(qū)指針復(fù)位。
        //把緩沖區(qū)的數(shù)據(jù)送到屏上顯示               
        DMA_SPI_STA=0;//清中斷標(biāo)志位及錯誤標(biāo)志位
        DMA_SPI_CR=0xc1;//開始執(zhí)行,采用主機(jī)模式,并清空FIFO,        while(!(DMA_SPI_STA&0x01));//等待吧。這時可以做其它事,比如去讀一個AD值,
}
DMASPI_initial();//這是多余的指令,原想加了它可以省去數(shù)據(jù)傳送函數(shù)中的初始化
}
程序的思路是設(shè)置了兩個指針,一個指向存放圖像信息數(shù)組的頭文件*p;一個指向緩沖區(qū)存放臨時數(shù)據(jù)*Q。后者也是向屏輸出圖像信息的源地址。緩沖區(qū)必須設(shè)在xdata區(qū)。由于空間限制,要分幾次才能傳輸完總數(shù)據(jù)。所以設(shè)置了總數(shù)據(jù)量和每次數(shù)據(jù)量這兩個參數(shù)。運行時先把數(shù)據(jù)送到緩沖區(qū),再啟動SPI_DMA功能,把數(shù)據(jù)送屏顯示。完成一組再進(jìn)行第二組。直到全部傳送完。
程序的優(yōu)點是啟動SPI_DMA后,mcu基本處于空閑狀態(tài),可以去做其它事了,傳送由外設(shè)自己管理,你只要不去干涉它用到的資源就好(相關(guān)總線,特別是緩沖區(qū))也就是說在它完成任務(wù)前,不要下達(dá)與屏顯有關(guān)的指令。下一個SPI_DMA指令,也要在前面的確定執(zhí)行完后才能下達(dá)。
這個程序特點是每傳送完一輪,緩沖區(qū)指針Q都要復(fù)位一次,而p不需要,因為緩沖區(qū)是重復(fù)使用的。
這個程序能給mcu節(jié)省多少時間?我沒測量過,只是用delay();函數(shù)看了一下,要用多大的參數(shù)值,能保證SPI_DMA完成任務(wù)。就是使用延時函數(shù)替代程序中的等待查詢指令。看看需要多少延時能替代那個等待。
void delay(unsigned int ms)
{
int j,k;
for(j=0;j<ms;j++)
for(k=0;k<60;k++);
}
結(jié)果在delay(11111)時,圖像完全不顯示(說明傳送過程被完全打亂了),在delay(33333)時顯示基本正常了。我認(rèn)為,這就是SPI_DMA節(jié)省出來的時間,而且是一輪傳送節(jié)省的時間。120x120的圖像用了五輪傳送。
接下來是字模顯示函數(shù)。
先貼一個使用普通字模數(shù)組的字模顯示函數(shù):
void word16x32_bydma_spi(unsigned int x,unsigned int y,unsigned char segin,int font_color,int back_color,char *Q)
{
unsigned char column=0;
unsigned char tm=0,temp;
unsigned long kee;
char *point;
char *kkee;
kkee=Q;//這是保留緩沖區(qū)指針初值      
point=digit_code[segin];//把要顯示的數(shù)字(segin)轉(zhuǎn)換成對應(yīng)的字模地址point
//先把字模數(shù)據(jù)轉(zhuǎn)換成屏顯所用數(shù)據(jù)存到緩沖區(qū),因為寫入緩沖區(qū)是并行處理,且沒有其它操作。所以比寫屏快很多
for(column=0;column<64;column++)//字節(jié)數(shù)循環(huán),逐個字節(jié)進(jìn)行轉(zhuǎn)換
{
temp=*point;//*point是原字模數(shù)據(jù)指針,取出原字模數(shù)值
//把字節(jié)信息換算成屏需要的數(shù)據(jù),送到緩沖區(qū)
for(tm=0;tm<8;tm++)
{
if(temp&0x01)//注意這是低位先出模式,如果與字模不符,可以考慮改為高位先出模式
{
*Q=(font_color>>8);//Q是緩沖區(qū)指針
Q++;
*Q=(font_color);
Q++;
}
else
{
*Q=(back_color>>8);
Q++;         
*Q=(back_color);
Q++;
}
temp>>=1;
}
  point++;
}
//開始刷屏,因為由DMA_SPI操作,基本不需要占用mcu時間。
lcd_address(x,y,x+15,y+31);      
kee=(unsigned int)(kkee);//取緩沖區(qū)首地址的值,也就是打算發(fā)送給屏幕的數(shù)據(jù)源地址的值
DMA_SPI_TXAH=(kee)>>8;//把源地值高位賦給地址寄存器
DMA_SPI_TXAL=kee;//地址是xdata的起始地址
DMA_SPI_AMTH=3;//0x03,表示的傳送總數(shù)據(jù)量是3ffh+1,也就是1024
DMA_SPI_AMT=255;//0xff
Q=kkee;//緩沖區(qū)指針復(fù)位
DMA_SPI_STA=0;//清中斷標(biāo)志位及錯誤標(biāo)志位
DMA_SPI_CR=0xc1;//開始執(zhí)行,采用主機(jī)模式,并清空FIFO,這句明顯要跟著程序走的
while(!(DMA_SPI_STA&0x01));//等待吧。這時可以做其它事
DMASPI_initial();//
}
字模顯示函數(shù)的編寫思路是,字模數(shù)組放在code區(qū)的頭文件數(shù)組中。使用時查到需要字模,讀取后轉(zhuǎn)換成屏顯需要的數(shù)據(jù),再存到緩沖區(qū)。然后開啟SPI_DMA刷到屏幕上。讀取和轉(zhuǎn)換程序與其它人寫的程序一樣,照抄的。區(qū)別就是轉(zhuǎn)換完后不是直接送屏顯示,而是送到了緩沖區(qū),再由SPI_DMA統(tǒng)一送屏。SPI_DMA刷屏則與前面的圖像顯示一樣。這個函數(shù)的優(yōu)點是不需要專門制作字模,過去的字模軟件可以直接用(臉紅的說一句,我沒用過硬件字庫)。
既然用了SPI_DMA,就會考慮能不能最大限度的發(fā)揮其作用,于是寫了一個SPI_DMA專用的字模顯示程序。由于沒有準(zhǔn)備字模,又寫了一個專用字模數(shù)據(jù)的生成函數(shù)。生成專用字模后,放在緩沖區(qū),就可以由專用顯示函數(shù)使用了。
void matrix_produce8x16(unsigned int font_color,unsigned int back_color)
{
char *Q;
unsigned char *point;
unsigned char column;
unsigned char temp,tm;
Q=&buffer3[0][0];//緩沖指針指向數(shù)字字模專用緩沖區(qū)buffer3
point=&number0_9_8x16[0][0];//8x16數(shù)字字模數(shù)組
for(column=0;column<160;column++)//字節(jié)數(shù)循環(huán),逐個字節(jié)進(jìn)行轉(zhuǎn)換
{
temp=*point;//*point是原字模數(shù)據(jù)指針,取出原字模數(shù)值
//把字節(jié)信息換算成屏需要的數(shù)據(jù),送到緩沖區(qū)
for(tm=0;tm<8;tm++)
{
if(temp&0x01)//注意這是低位先出模式,如果與字模不符,可以考慮改為高位先出模式
{
*Q=(back_color>>8);//Q是緩沖區(qū)指針
Q++;
*Q=(back_color);
Q++;
}
else
{
*Q=(font_color>>8);
Q++;         
*Q=(font_color);
Q++;
}
temp>>=1;
}
point++;
}
DMASPI_initial();//
}
專用字模顯示函數(shù)其實就是把普通字模全部轉(zhuǎn)換成顯示所用的字模數(shù)據(jù),放在緩沖區(qū)專用位置,供需要時讀取使用,由于緩沖區(qū)空間有限,只能供占空間不大,需要頻繁調(diào)用的字模采用。例程中是把0-9這十個8x16的數(shù)字轉(zhuǎn)換進(jìn)去了。屏幕上很小的那個字就是用它顯示的。
下面是專用字模調(diào)用程序
void word8x16_bydma_spi(unsigned int x,unsigned int y,unsigned char segin)
{
unsigned long kee;
lcd_address(x,y,x+7,y+15);      
kee=(unsigned long)(&buffer3[segin][0]);//取緩沖區(qū)首地址的值,也就是打算發(fā)送給屏幕的數(shù)據(jù)源地址的值
DMA_SPI_TXAH=(kee)>>8;//把源地值高位賦給地址寄存器
DMA_SPI_TXAL=kee;//地址是xdata中對應(yīng)數(shù)字的起始地址
DMA_SPI_AMTH=0;//0x00,表示的傳送總數(shù)據(jù)量是ffh+1,也就是256
DMA_SPI_AMT=255;//0xff
DMA_SPI_STA=0;//清中斷標(biāo)志位及錯誤標(biāo)志位
DMA_SPI_CR=0xc1;//開始執(zhí)行,采用主機(jī)模式,并清空FIFO,
while(!(DMA_SPI_STA&0x01));//等待吧。這時可以做其它事,                DMASPI_initial();//冗余指令
}
這程序不僅形式上簡潔多了,速度也快,特別是極少使用mcur 。
有了圖像和字符顯示,缺少的就是曲線了。橫平豎直的線太容易,不想寫了。曲線由于個人水平原因,沒找到能提高效率的思路,只好作罷。
使用SPI_DMA技術(shù),最大的不同在于要規(guī)劃和使用緩沖區(qū)。就是xdata區(qū)的那些空間,
我為了做驗證,在例程中設(shè)了三個數(shù)組,做為緩沖區(qū);buffer1兩個字節(jié),作用是占位,在整個程序中沒有出現(xiàn)調(diào)用它的指令,占位的意思是不讓其它函數(shù)使用這個空間,留給數(shù)據(jù)傳輸函數(shù)專用,(其實這樣做是沒必要的,只是驗證實驗中期望把數(shù)據(jù)傳輸函數(shù)效率做到最高,才給它留了一個最佳緩沖地址)c251內(nèi)存空間是自動安排的,不占位的話其它程序可能會來使用,使整個程序亂序。數(shù)據(jù)傳送函數(shù)使用buffer1時的語句是:
        *(unsigned char *)(0x10000)=dat1;//待傳送數(shù)據(jù)送專用緩存區(qū),就是buffer1
這樣做是因為buffer1要占住位置,只能設(shè)置在mai.c程序的模塊里,而我采用模塊化編程,數(shù)據(jù)傳送函數(shù)是在驅(qū)動模塊中的。這時不方便用數(shù)組名buffer1訪問。
第二個數(shù)組buffer2用了5600字節(jié)用來臨時存放傳送的圖像數(shù)據(jù),其實實際使用時臨時數(shù)據(jù)是5760字節(jié),超過了安排的緩沖區(qū),也就是侵占了后面的空間,例程中用做開機(jī)圖像傳送時,后面的緩沖區(qū)還沒使用,所以侵占一下也沒什么。但如果后面的用上了。侵占就導(dǎo)致后面的數(shù)據(jù)錯誤。這也是使用指針的優(yōu)點。
第三個數(shù)組是buffer3,安排了2560字節(jié),用來放10個8x16數(shù)字的顯示數(shù)據(jù),每個占256字節(jié)。使顯示速度達(dá)到最快。實際應(yīng)用中如果有需要頻繁刷屏的字符,可以采用這種模式處理。
Buffer3定義的是一個二維數(shù)組,寫入數(shù)據(jù)時只當(dāng)一維數(shù)組,按順序?qū)懀x出時按二維讀。編程方便許多。
例程中常規(guī)字模顯示函數(shù)用了buffer3做緩沖區(qū),這會影響專用字模顯示功能的使用,實際上常規(guī)字模顯示應(yīng)該使用buffer2,但技術(shù)原因有不方便之處,做為實驗使用,就保留了這個失誤,這樣常規(guī)顯示和專用字模顯示只能保留一個了(因為它們的緩沖區(qū)設(shè)重復(fù)了)
在例程中有開啟高速高級SPI的語句(在mcu設(shè)置函數(shù)mcu_initial.c里)
CLKSEL &= ~0x80; //默認(rèn)選擇 PLL 的 96M 作為 PLL 的輸出時鐘
USBCLK |= 0x20; //PLL 輸入時鐘 2 分頻 ,因為stc-isp設(shè)定頻率為24M
USBCLK |= 0x80; //使能 PLL 倍頻
delay(222);//等待PLL鎖頻
CLKSEL &= ~0x40; //默認(rèn) HSPWM/HSSPI 選擇主時鐘為時鐘源
HSCLKDIV = 0; //HSPWM/HSSPI 時鐘源不分頻
可以屏蔽掉,看一下對比效果。
例程驗證時使用的是STC32G12K128DIP40芯片,焊了一個小洞洞板。
FTF彩屏使用的是128x128分辨率。0.85吋,我手里大點的屏都是并口的。
調(diào)試中使用了STC-USB LINK1D硬件仿真器,個頭不大,但很給力。讓我這個第一次玩DMA的人能清楚地看到問題出在哪里,程序卡在哪里。對癥處理,節(jié)約了N多時間。
程序主要內(nèi)容和編程思路已經(jīng)說完了。完整的程序放在附件中可以下載查看。歡迎指導(dǎo),歡迎吐槽。
分享這個程序的目的是希望使用mcu芯片的朋友們能更好的使用DMA功能,更多地發(fā)揮出它的應(yīng)有效能。也為初學(xué)的朋友們提供一個實例借鑒。mcu技術(shù)的發(fā)展越來越復(fù)雜,例程對學(xué)習(xí)者的作用是不能低估的。

Q1.jpg (561.15 KB, 下載次數(shù): 143)

Q1.jpg

Q2.jpg (314.3 KB, 下載次數(shù): 149)

Q2.jpg

Q3.jpg (290.59 KB, 下載次數(shù): 122)

Q3.jpg

imagination.zip

289.36 KB, 下載次數(shù): 78, 下載積分: 黑幣 -5

附件內(nèi)為代碼


作者: heicad    時間: 2023-2-6 12:34
你好樓主,,此代碼編譯出現(xiàn):Error: Project 'imagination' requires 'C251' Toolchain which is not installed.
作者: 麗江春水    時間: 2023-2-6 13:23
heicad 發(fā)表于 2023-2-6 12:34
你好樓主,,此代碼編譯出現(xiàn):Error: Project 'imagination' requires 'C251' Toolchain which is not install ...

是不是你沒使用c251呀?
作者: dgyjh    時間: 2023-2-16 13:40
我就不明白,究竟是16位還是32位的,用C251的編譯器,按16位來編譯,怎么樣體現(xiàn)它是32位的,ACC和內(nèi)部總線是32位的嗎?還是讀一個32位的數(shù)要分2次讀??
作者: 麗江春水    時間: 2023-2-17 12:59
這個問題與本程序無關(guān)。是廠家應(yīng)該說明的,我看到他們說的是這款芯片是32位的8051,至于各種總線的位數(shù),在數(shù)據(jù)手冊里有具體說明,我記不太住,有興趣可以去看官方數(shù)據(jù)手冊,大概記得有些功能是32位,有些24位,有些8位。畢竟一組IO是8位,8位用著方便,但也有些32位的功能支持。我感興趣的是價格與功能符合我的需要,就選擇了它。
作者: weijoyer    時間: 2023-3-21 19:09
heicad 發(fā)表于 2023-2-6 12:34
你好樓主,,此代碼編譯出現(xiàn):Error: Project 'imagination' requires 'C251' Toolchain which is not install ...

缺少251的編譯器
作者: reking8    時間: 2023-9-1 18:05
這個芯片需要下載keil的 c251 版本




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美性猛交99久久久久99按摩 | 成人在线一区二区 | 伊人精品在线 | 亚洲成在线 | 国产日韩欧美日韩大片 | 青草视频网站 | 久久久久久久影院 | 他揉捏她两乳不停呻吟动态图 | 国产在线小视频 | 丝袜美腿一区二区三区 | 国产精品一区一区三区 | 久久只有精品 | 男女激情视频网站 | 视频一区二区在线播放 | 欧美日韩国产中文 | 黄大色黄大片女爽一次 | 91精品国产乱码久久久久 | 亚洲最新网址 | 成人羞羞国产免费 | 一级香蕉视频 | 久久男人天堂 | 精品天堂 | 国产av毛片| 91av视频在线 | 黄色网址在线播放 | 日韩中文av | 欧美激情综合网 | 中文字幕在线免费 | 一区二区三区在线观看免费 | 中文在线免费观看 | 日韩欧美在线免费观看 | 国产区在线视频 | 网站毛片 | 国产三级视频在线 | 欧美激情免费 | 久草福利在线观看 | 精品免费国产一区二区三区四区 | 国产成人福利 | 久久香蕉国产 | 在线日韩一区 | 日韩一区二区三免费高清在线观看 |