wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1212|回復: 0
收起左側

PONG...PONG 8x8 LED 矩陣的復古玩法

[復制鏈接]
ID:1130439 發表于 2024-10-8 14:57 | 顯示全部樓層 |閱讀模式
。。。上一次和同學們(同學=一同學習者,同游=一同云游者,同居? 。。。 以此類推,不一而論)瞎聊了一點有關二進制數的宏定義以及用 bit map 手工輸入點陣圖形的事(http://www.izizhuan.cn/bbs/dpj-237651-1.html), 但沒有提及如何玩 51 單板機上那個 8x8 LED 矩陣。 BBC Micro:bit 上有一組 5 x 5 的LED 矩陣,官方很認證地開發了一個"喜怒哀樂"表情包,意欲把那個稀缺資源的利用發揮到極致,考慮到Micro:bit不過是兒童的玩具,我就不把那個表情包port到51 單板機上了。對于認真的程序員,把 PONG 這個古老的游戲port過來,以表示對前輩程序員的敬意,視乎更有一點意思?

。。。閑話少敘,我們單刀直入,先在那個 8x8LED 矩陣上實現單個 LED 的動畫,而后展開相應的數據結構,以實現“乒乓球”和“乒乓板”之間的互動。為此,我們來看看如何實現用(x,y)一對坐標來實現對64個LED當中任何一個LED的“尋址” 。。。 以下是N種方案當中的一種:

u8 data bitBuffer []= {
  b00111000,  //x(7,0)       *(7,7)
  b01111100,  //  |
  b01111110,  //  |
  b00111111,  //  |
  b00111111,  //  |   *(x,y)
  b01111110,  //  |
  b01111100,  //  |  
  b00111000   //(0,0)-------->y(0,7)
};
按照單板機上具體的硬件設計,我們可以把(x,y)映射為8x8LED矩陣的行列端口控制信號,以我手上那塊單板機為例(http://www.izizhuan.cn/bbs/dpj-237407-1.html),其映射關系如下:

(x,y) --> ( LedMatrixPort_Col = ~(1<<(7-x)) ,74hc595_Dout = 1<<(7-y))  )
這里,x 和 y 的值域都是整數閉區間 [0,7].

如你想要點亮(x,y)位置上單獨一顆LED,調用以下函數即可:
//void _8x8ledMatrixShow(u8 x,u8 y) compact{
//       
//        LedMatrixPort_Col = ~(1<<(7-x));
//        hc595_write_data(1<<(7-y));
//        delay_10us(100);       //延時一段時間,等待顯示穩定
//        hc595_write_data(0x00);//消影
//}

有了這個函數,你可以讓這顆被點亮的LED在各種(數學)軌跡上游走,實現任意動畫效果, piece of cake?

細心的同學會注意到我把上述函數注釋屏蔽掉了,表示我在實際的PONG游戲代碼里并沒有使用這個函數。在游戲更新“乒乓球”位置的代碼中,我直接利用了(x,y)和行-列端口的映射關系,同時把球的位置信息和“乒乓板”的位置信息一起緩存在bitBuffer 里面,當所有需要更新的數據都準備好之后才一次性地“刷新” LED矩陣的顯示,這是幾乎所有游戲編程普遍使用的所謂double buffer 技術,大家可以誰便參考一本游戲編程的書籍了解其原委,我不講了。


避免調用上述函數,對于51 單片機這樣的系統還考慮到硬件資源問題。51單片機的片內 數據RAM 非常貧乏,只能實現一個很淺的stack, 如果在函數調用時使用很多參數,最糟的情況下(如遞歸調用帶參數的函數),stack 很容易overflow, 導致程序崩潰。因此,大家在不影響程序代碼架構清晰的情況下,盡量使用全局變量為上策。

okay,我們繼續PONG的編程。。。在游戲世界里,“球”和“板”都是所謂的 objetcs (東東? sprite ? whatever ),如果開發環境比較豪華,我們應該用類似C++ 的class 來封裝這些東東的屬性和行為,但這里比較簡陋,我們就用struct 來簡單湊合一下吧。。。

typedef struct {
        signed char pTop;   // 球板的頂端 y 坐標
        signed char pShift; // 球板的頂端 x 坐標,缺省值為 7,如果<7, 表示迎著球的方向擊球,如果值不變,就是簡單的擋球。。。
        u8 score;               // 用于計分
} sPaddle;

sPaddle myPaddle;    // 左側球板,手工通過按鈕實現上下移動或由 MPU 判斷球的來路自動移動
sPaddle mpuPaddle;  // 右側球板,由 MPU 判斷球的來路自動移動


struct {
        signed char x, y;   // 球的位置
        signed char vx,vy; // 球的速度
}ball;


在游戲初始化時,我們必須給這些東東一些初始值,例如:

        if(bGameReStart)// 如果全局變量 bGameReStart ==1 , 從新開局
        {
                LED_PORT=0xff; // 熄滅 8x8 LED 矩陣
                srand (rand());   //  隨機數下種, 要在main.c 開頭處加上 #inlude <stdlib.h> 才能調用 srand 和 rand 函數

                myPaddle.pTop = 3; myPaddle.pShift  = 0;myPaddle.score  = 0;
                mpuPaddle.pTop = rand() % 6;mpuPaddle.pShift = 7;mpuPaddle.score = 0;
                ball.x = 6;
                ball.y =  myPaddle.pTop + rand() % 3;    //ball start by human
                ball.vx = 1 + rand()%2; //  相當于 random(1,2);
                ball.vy = -2 + rand()%5;// 相當于 random(-2,2);     avoid use function stack...

                bGameReStart =0; // don't keep running the code inside  {}
        }


世上所有游戲的靈魂是隨機數,包括你在“真實”世界里面玩現實版的“真人游戲”, 所以我對隨機數多啰嗦幾句。。。由于硬件隨機數發生器非常昂貴,大多數數字系統都采用軟件偽隨機數,其原理大家自行wikipeida, 我只解釋上面的代碼里,我為何免用 random(上限,下限) 這樣的函數,而是直接用 % 運算符來取指定范圍的隨機數。

在<stdlib.h>庫里,rand() 的16位整數值域是 [0, 32767],    random(上限,下限) 的定義通常類似以下形式:
unsigned int  random(unsigned int  lo,unsigned int  hi) {
  return ( lo +  (hi - lo)* rand()/32768 );
}

或者,限于返回8位(signed)整數:
signed char random(signed char lo, signed char hi){
return  (lo +  rand()%((hi-lo+1)) );
}


但這樣的函數定義都有參數調用的開銷,前一個還涉及“昂貴”的除法,這些都是資源匱乏的單板機需要盡量避免的。通常在C語言里,我們可以采用宏定義來重寫函數定義,調用時采用 inline 宏定義,這樣可以避免運行時的開銷,把計算的負擔分配到編譯時,由編譯器來代勞。同學們可以自行實驗利用宏來修改上面的代碼,提高程序的可讀性。

接下來就是游戲的主循環。。。

L_GAME_START:
    bGameReStart =1;                       
    while(1)
                {
                                key_matrix_flip_scan(key_value);  // 4 x 4 按鈕矩陣掃描
                                if (key_value ==2 || key_value == 5 )OE_74HC595 = 1; //turn off 8x8 LED matrix
                                        else OE_74HC595 = 0; // enable it otherwsie


                       
                                switch (key_value)
                                {
                                        case 1:     // 按鈕- 1
                                                        _8x8ledMatrixDisplay(mPONG);
                                                         bGameReStart = 1;  // 從新開始游戲
                                                        continue;
                                        case mPADDLE_UPP-1:               
                                        case mPADDLE_UPP:
                                             myPaddle.pShift = mPADDLE_UPP - key_value;
                                                                myPaddle.pTop -=2;
                                                                if (myPaddle.pTop < 0)myPaddle.pTop =0;
                                                                goto L_GAME_UPDATE;       
                                       
                                        case mPADDLE_UP-1:
                                        case mPADDLE_UP:
                                                                myPaddle.pShift = mPADDLE_UP - key_value;                               
                                                                myPaddle.pTop -=1;
                                                                if (myPaddle.pTop < 0)myPaddle.pTop =0;
                                       
                                                                goto L_GAME_UPDATE;       
                                        case mPADDLE_DOWN-2:
                                        case mPADDLE_DOWN-1:
                                        case mPADDLE_DOWN:
                                                                myPaddle.pShift = mPADDLE_DOWN - key_value;
                                                                myPaddle.pTop +=1;
                                                                if (myPaddle.pTop > 4)myPaddle.pTop =5;
                                       
                                                                goto L_GAME_UPDATE;       
                                       
                                        case mPADDLE_DOWND-3:
                                        case mPADDLE_DOWND-2:
                                        case mPADDLE_DOWND-1:
                                        case mPADDLE_DOWND:  
                                                                myPaddle.pShift = mPADDLE_DOWND - key_value;
                                                                myPaddle.pTop +=2;
                                                                if (myPaddle.pTop > 4)myPaddle.pTop =5;
                                                                goto L_GAME_UPDATE;               
                                       
                                        case mUPDATE_PONG:  
                                                             if(bGameReStart)// re-start game
                                                             {
                                                               // 游戲初始化代碼,前面已經講解,此處不再重復
                                                            }
                                               
                                        L_GAME_UPDATE:       
                                                            _8x8clearBitBuffer();         // 清除緩沖區內容
                                                 
                                                             // 畫球板
                                                              bitBuffer[myPaddle.pShift]  = b11100000;
                                                              bitBuffer[myPaddle.pShift]  = bitBuffer[myPaddle.pShift]>>myPaddle.pTop;

                                                            // 更新球的位置
                                                             ball.x += ball.vx;
                                                             ball.y += ball.vy;
                                                 
                                                            // 更新球板的位置
                                                           if (ball.vx > 0 ) // ball coming to human
                                                          {
                                                            // 如果 MPU 控制球板,計算球板如何判斷球路做相應的移動
                                                            }

                                                         if(myPaddle.pTop <0) myPaddle.pTop =0;
                                                         if (myPaddle.pTop > 4)myPaddle.pTop =5;


                                                       // 判斷球板是否接住球,沒有接住,對方就加分。。。
                                                       if(ball.x >= (7 - myPaddle.pShift) )
                                                      {
                                                         ball.x = 7;
                                                         ball.vx=-ball.vx; //左側 X方向反彈
                                                         
                                                         if( abs(ball.vy)<=1)
                                                         {
                                                                 if ( ball.y < myPaddle.pTop || ball.y > (myPaddle.pTop+2))
                                                                 {
                                                                         mpuPaddle.score++;  // 球板沒有擋住球,對方加分
                                                                 }
                                                         }
                                                         else
                                                         {
                                                             // 等等其它判斷和計分邏輯 。。。
                                                         }
                                                     }
                                                 
                                                  if( ball.y <=0 )
                                                 {
                                                    ball.y = 0;       // 頂端 Y- 方向反彈
                                                    ball.vy=-ball.vy;
                                                 }
                                                 if( ball.y >= 7)
                                                 {
                                                    ball.y = 7;   // 底端 Y- 方向反彈
                                                     ball.vy=-ball.vy;
                                                 }
                                                   if( ball.x <=0 )
                                                 {
                                                   ball.x = 0;  //右側 X方向反彈
                                                   ball.vx=-ball.vx;
                                                 }
                                                         
                                               
                                                 bitBuffer[7-ball.x] = 128>>ball.y;  // 把球的位置“寫” 入緩存區域
                                               
                                                 _8x8ledMatrixDisplay(bitBuffer);    // 刷新 8x8 LED 顯示
                                                 key_value = mUPDATE_PONG; // repeat run mUPDATE_PONG section
                                                 
                                                 // 在 7 段數碼管上 顯示計分
                                                ired_buf[0]=gsmg_code[mpuPaddle.score];
                                                ired_buf[3]=gsmg_code[myPaddle.score];
                                               
                                                smg_display(ired_buf,1);
                                                continue;                                       
                                }
                }
//END OF GAME


同學們可以看到我在這個循環里大大冒犯了一下 Goto 語句的批評者,我是實用主義者,goto 語句在這里的使用,既有效也不影響程序的可讀性。C就是高級的匯編語言啊,匯編語言大量使用各種 JMP 指令,C語言里適當使用 goto 語句,大家可以理直氣壯。

這個循環的上面有一小段和 PZ 單板機設計缺陷有關的代碼:


if (key_value ==2 || key_value == 5 )OE_74HC595 = 1; //turn off 8x8 LED matrix
        else OE_74HC595 = 0; // enable it otherwsie


板子的設計者提示玩家,如果要禁止 8x8 LED 矩陣,可以使用跳針,其實沒有這個必要,這個跳針設計是多余的。8x8 LED 矩陣的開關,完全可以通過軟件加以控制。我在板子上加了一根飛線,用 sbit OE_74HC595 = P1^7 定義了其用法,接下來就可以用P1^7 端口控制74HC595芯片,從而實現8x8 LED 矩陣的開和關,大家留意一下下面視頻和圖片里的飛線即可。

.....  ......  ...... let's call it a day. .................. .................... ................... ........................ ........... .......... .............

自動回球

自動回球

飛線

飛線














評分

參與人數 1黑幣 +70 收起 理由
admin + 70 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
国产欧美一区二区精品婷婷| 国产亚洲精品久久久久久牛牛| 粉嫩av一区二区三区| 极品美女销魂一区二区三区| 日韩国产成人精品| 国产福利精品一区| 蜜臀va亚洲va欧美va天堂| 国内精品福利| 一区二区影院| 欧美国产精品| 国产精品一级二级三级| 久久精品不卡| 麻豆蜜桃在线观看| 国产一区二区在线| 亚洲影视一区| 性欧美精品高清| 美女视频黄频大全不卡视频在线播放| 黄色成人av网站| 欧美美女日韩| 久久www人成免费看片中文| 精品久久久无码中文字幕| 操人视频免费看| 成人亚洲视频在线观看| 日韩亚洲视频| 一区二区三区 日韩| 全部免费毛片在线播放一个| 里番全彩acg☆无翼乌全彩3d| 午夜爽爽爽男女免费观看影院| 天天草天天操| 欧美日韩国产黄色| 午夜剧场免费看| 丰满大乳奶做爰ⅹxx视频| 91大神免费观看| 性生交大片免费看l| 中文字幕亚洲影院| 久久久久久不卡| 日本免费网址| 自拍偷拍欧美视频| 久久99精品国产麻豆婷婷 | www.操.com| 精品三区视频| 国产美女在线观看一区| 亚洲一区www| 日韩小视频网站| 亚洲一区精品在线观看| 舔足天天操天天射| 日韩在线观看一区| 欧美在线观看视频在线| 欧美日韩一区二| 中文字幕精品无码一区二区| 免费福利在线观看| 欧美日韩久久| 精品福利一二区| 手机成人在线| 丰满少妇xoxoxo视频| 亚洲熟女乱色一区二区三区久久久| 超碰在线观看免费版| 国产精品无遮挡| 激情视频一区二区| 日本黄色三级视频| 午夜天堂精品久久久久| 久久久亚洲网站| 嫩草影院一区二区三区| 成人免费在线电影网| 欧美精选在线播放| 成人激情黄色网| 亚洲色图欧美另类| 女人天堂网站| 欧美天堂亚洲电影院在线观看 | 国产欧美日韩视频在线观看| 国自产精品手机在线观看视频| 中文字幕第3页| 日韩一卡二卡在线| 极品一区美女高清| 亚洲猫色日本管| 成人精品网站在线观看| 五月婷婷激情五月| jizz日韩| 三级一区在线视频先锋| 99riav久久精品riav| 国产精品久久久久久久久晋中 | 久久久久久成人精品| 免费成人美女女在线观看| 成av人电影在线观看| 一区二区三区视频在线观看| 精品丰满人妻无套内射| 国产美女视频黄a视频免费| 国产麻豆精品久久一二三| 97人人干人人| 欧美视频亚洲色图| 久久一二三区| 国产高清精品一区| 青青草国产免费自拍| 国产精品日韩欧美一区| 国产一区二区视频在线免费观看| 青青青青久久精品国产一百度| 一本色道精品久久一区二区三区| 91精品国产91久久久久久最新| 97精品一区二区视频在线观看| 性感美女一级片| 大白屁股一区二区视频| 无限资源日本好片| 欧美激情极品| 欧美另类videos| 在线观看的黄色| 国产精品视频中文字幕91| 99在线免费视频| 成人免费在线视频| 欧美性受xxxx黒人xyx性爽| av网站免费在线| 国产精品人成在线观看免费| 男人插女人下面免费视频| 黑料不打烊so导航| 国产日产精品一区| 国产在线观看免费播放| 欧美1—12sexvideos| 亚洲电影中文字幕| 亚洲熟妇av乱码在线观看| 久久不见久久见中文字幕免费| 一区二区三区视频观看| 国产亚洲精品熟女国产成人| 午夜欧美巨大性欧美巨大 | 亚洲一区精品在线| 国产精品区免费视频| 一分钟免费观看视频播放www| 久久永久免费| 亚洲午夜精品久久| 天堂网www中文在线| 日韩欧美国产网站| 国产天堂av在线| 午夜先锋成人动漫在线| 成人精品一区二区三区电影免费 | 不卡的看片网站| 亚洲另类第一页| 日韩脚交footjobhd| 中文字幕精品国产| 人人妻人人澡人人爽久久av| 国产成人自拍网| 国产97在线 | 亚洲| 蜜桃传媒在线观看免费进入| 亚洲国产日韩欧美在线动漫| 国产精品777777| 嫩草成人www欧美| 少妇久久久久久被弄到高潮| 在线观看wwwxxxx| 美女精品久久久| 国产在线视频精品视频免费看| 99久久精品国产麻豆演员表| 无码人妻一区二区三区精品视频| 日韩伦理一区二区| 国产精品久久久久久婷婷天堂| 变态黄色小视频网站| 黑人狂躁日本妞一区二区三区| 国产亚洲精品久久久久久无几年桃 | 日本aⅴ精品一区二区三区 | 亚洲第一视频在线| 99久久婷婷国产| 久久成人激情视频| 中文欧美日韩| 在线观看国产福利| 日本女优一区| 欧美日韩精品在线一区二区| 欧美专区视频| 欧美午夜精品理论片a级大开眼界| 超碰在线观看免费| 国产精品亚洲网站| 91电影在线播放| 91av在线看| 大片免费播放在线视频| 色综合久综合久久综合久鬼88| 国产91福利| 在线看日韩av| 全部a∨一极品视觉盛宴| 国产一区二区三区18| av播放官网| 视频一区视频二区国产精品| 少妇**av毛片在线看| 欧美激情xxxx| 国产高清自拍视频在线观看| 日韩av免费在线播放| 1769视频在线播放免费观看| 国产成人精品优优av| 久久bbxx| 免费亚洲一区二区| 欧美少妇激情| 九九久久九九久久| 免费精品国产的网站免费观看| 女人扒开屁股爽桶30分钟| 97精品一区| 极品白嫩少妇无套内谢| 黑人巨大精品欧美一区| 久久久久久久9999| 亚洲靠逼com| 欧美1区二区三区公司| 亚洲精品91美女久久久久久久| 九色蝌蚪视频在线| 97在线看福利| 日本在线人成| 日韩影片在线播放| 精品视频免费在线观看| 蜜桃视频无码区在线观看| 日本va欧美va欧美va精品| 老熟妇仑乱一区二区av| 欧美中文字幕一区| 免费男女羞羞的视频网站中文版 | 免费高潮视频95在线观看网站| 五月天亚洲综合| 另类国产ts人妖高潮视频| 老熟妇一区二区三区| 亚洲成人免费网站| 国产成人精品一区二三区在线观看 | 久久国产美女视频| 亚洲日本电影在线| 欧美娇小极度另类| 色综合久综合久久综合久鬼88| 偷拍视频一区二区三区| 无人在线观看的免费高清视频| 丰满放荡岳乱妇91ww| 亚洲欧美色视频| 欧美黑人性生活视频| 伊人久久高清| 古装做爰无遮挡三级聊斋艳谭| 成人av在线资源网站| аⅴ成人天堂中文在线| 久久成人亚洲精品| 国产亚洲人成a在线v网站| 亚洲成人av免费看| 久久久久久久一区| 在线视频在线视频7m国产| 日韩中文字幕在线播放| 97一区二区国产好的精华液| 国产午夜视频在线| 日韩视频永久免费观看| 一区二区免费| 欧美另类视频在线观看| 亚洲成人中文字幕| 韩国一区二区三区视频| 中文字幕亚洲欧美日韩| 日韩av在线一区| 亚洲成人五区| 国产精品21p| 久久久久久国产| 91亚洲国产高清| 男人打飞机网站| 久久精品国产第一区二区三区最新章节 | 成人免费的视频| 亚洲无码精品在线观看| 中文字幕一区二区精品| 国产亚洲电影| 男人天堂网站| 亚洲午夜精品一区二区三区| 国产欧美一区二区三区网站 | 精品二区视频| 精品无码人妻一区二区三区| 日韩精品在线私人| 黄色网一区二区| 国产黄色av片| 欧美一区三区二区在线观看| 亚洲丝袜美腿综合| 欧美日韩五区| 蜜臀av免费在线观看| 亚洲国产精品久久久久婷婷老年 | 国产99久久久欧美黑人 | 久久69精品久久久久久国产越南| 亚洲性感美女99在线| xxxxx性| 国产高潮视频在线观看| 色悠悠国产精品| 麻豆91小视频| 黄色片免费在线观看| 日韩三级小视频| 国产另类第一区| 亚洲第一搞黄网站| 在线免费成人| 色欲av无码一区二区人妻| 欧美综合天天夜夜久久| 亚洲精品资源| 欧美成人a交片免费看| 成人亚洲欧美日韩在线观看| 亚洲欧美日韩第一页| 亚洲国产日韩综合一区| 日韩成人网免费视频| 不卡的av中国片| 国产欧美高清视频在线| 免费在线观看视频| 国产裸体永久免费无遮挡| 亚欧激情乱码久久久久久久久| 91wwwcom在线观看| 91丨国产丨九色丨pron| 日韩精品极品| 国模人体一区二区| 久久无码高潮喷水| 国产一区二区av| 久久97超碰色| 朝桐光一区二区| 四虎激情影院| 亚洲在线观看网站| 日本精品久久中文字幕佐佐木| 99麻豆久久久国产精品免费| 亚洲资源在线| 青青草.com| 第一次破处视频| 欧美高清视频一区| 老司机aⅴ毛片免费观看| 99热一区二区| 欧美激情啪啪| 开心色怡人综合网站| 蜜臀av性久久久久蜜臀aⅴ流畅| 涩爱av色老久久精品偷偷鲁| 欧美videossex另类| 中文字幕欧美人妻精品一区蜜臀| 91豆花精品一区| 视频精品一区二区| 欧美写真视频一区| 日韩一级片大全| 国产精品久久97| 日韩美女视频一区| 国精品一区二区三区| 亚洲成人激情社区| 五月天最新网址| 理论片中文字幕| 欧美高清视频一区二区三区| 99久久久无码国产精品6| 国产日产亚洲精品| 亚洲最新在线视频| 色婷婷国产精品| 国产亚洲欧美日韩日本| 一本色道久久综合亚洲精品不| 国产专区精品| www国产在线观看| 最新日本视频| 青青青爽在线视频免费观看| 国产熟女精品视频| 强行糟蹋人妻hd中文| 国产精品19p| 激情综合网俺也去| 国产精品美女在线播放| 99re视频在线观看| 国内偷自视频区视频综合| 精品99久久久久久| 欧美在线看片a免费观看| 国产精品二三区| 精品一区二区三区香蕉蜜桃 | 三级全黄做爰视频| 亚洲一区二区三区四区五区| 日本免费不卡一区二区| 中文精品一区二区三区| 日本亚洲欧洲精品| 精品久久久久久中文字幕动漫| 国产精品一区二区电影| 欧美在线视频观看| 欧美亚洲国产视频小说| 97香蕉久久夜色精品国产| 国产精品极品美女粉嫩高清在线| 欧洲中文字幕国产精品| 97视频人免费观看| 丝袜亚洲另类欧美重口| 日韩欧美一区二区三区| 成人午夜视频网站| 国产欧美综合一区二区三区| 日韩欧美黄色| 成人免费一区| 牛牛精品在线视频| 在线色视频观看| 柠檬在线导航福利| 五月婷婷六月丁香| 亚洲欧美在线视频免费| 日本不卡一二区| 国产免费一区二区三区最新6| 无码精品a∨在线观看中文| 日本高清xxxx| 色一情一乱一伦一区二区三欧美| 久久久久中文字幕2018| 亚洲精品一区二区在线观看| 天天色天天操综合| 国产精品羞羞答答xxdd| 美腿丝袜亚洲三区| 午夜精品免费| 激情综合色播五月| 亚洲乱码中文字幕综合| 久久婷婷成人综合色| 欧美成人69av| 老牛国产精品一区的观看方式| 亚洲综合不卡| 成人美女在线观看| 日韩美女精品在线| 欧美日韩在线观看一区二区| 精品国产精品一区二区夜夜嗨| 亚洲男人av在线| 77777亚洲午夜久久多人| 懂色一区二区三区av片| 久久久天堂国产精品| www.99r| 成年人看的免费视频| 亚洲va在线观看| 国内精品2019| 一个人看的www一区| 97在线超碰| 九九视频精品全部免费播放| 日韩高清一区二区|