色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

高電平穩定時該如何處理呢?

lhl545545 ? 來源:玩轉單片機 ? 作者:玩轉單片機 ? 2020-06-10 14:28 ? 次閱讀

相信很多道友都有對輸入IO 口進行濾波的需求,比如按鍵輸入、紅外對管輸入等。這里魚鷹就以按鍵為例介紹如何進行較為高效的濾波。我們以為接入單片機引腳的按鍵按下后(并彈起)電平變化應該是這樣的:

高電平穩定時該如何處理呢?

實際上卻是這樣的:

高電平穩定時該如何處理呢?

首先思考一個問題,如果沒有進行濾波,會有什么問題?一次按下過程可能被認為多次按下,因為按下后有抖動過程,這個過程電平并不穩定,導致單片機在很短的時間內多次檢測到低電平狀態。這樣一來,本來只按下了一次,程序卻認為按下了多次,這對按鍵功能會產生影響。如果將按鍵引腳設置為外部中斷觸發,那么在極短的時間內CPU將多次進入中斷,影響中斷的性能(所以對于非數字接口,即沒有穩定的高低電平的接口,如果不需要非常高的實時性,那么魚鷹不建議設置為外部中斷觸發方式)。那么我們該如何進行處理呢?很自然的,因為按下過程中有抖動期,我們就會想辦法跳過抖動時間,然后再檢測電平變化,所以,V0.1 版本就應運而生,這也是郭天祥老師告訴我們初學者最簡單易懂的方式:V0.1

typedef enum { KEY_LEVEL_DOWN, // 假設低電平為按下 KEY_LEVEL_UP, }KeyLevelTypedef; KeyLevelTypedef get_key_level(){ return (KeyLevelTypedef)HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); } // V0.1void key_scan(){ // 歡迎關注:魚鷹談單片機 if(get_key_level() == KEY_LEVEL_DOWN) { HAL_Delay(20); // 假設抖動時間 20 ms if(get_key_level() == KEY_LEVEL_DOWN) { key_flag = 1;// 按鍵按下標志位 } } }對于初學者而言,這段代碼簡單易懂,但是對于工作多年的人來說,這種方式效率極其低下。有可能你會說,如果使用操作系統,當延時函數使用系統延時,那么這段時間就可以切換到其他任務進行處理,而不會浪費CPU使其空轉了。但是如果這個任務本身功能比較復雜,那么這種處理會嚴重影響其他功能的執行,所以這種代碼應該不會出現在工作多年的工程師手中。那么是否有更高效的方式呢?有,就是記錄前后兩次電平的變化,通過比較兩次電平是否相等來確定電平是否穩定(這個方式在《延時功能進化論(合集)》有做簡單介紹)。V1.0

typedef enum { KEY_STATE_IDLE, // 按鍵空閑 KEY_STATE_DOWN, // 按鍵按下 KEY_STATE_FINISH, // 按鍵處理完成(由應用程序設置) }KeyStateTypedef; KeyStateTypedef key_state;KeyLevelTypedef key_last_level; // 上次電平狀態 // V1.0// 函數調用周期 20 ms(如何實現應該不需要再說明了吧)void key_scan(){ // 歡迎關注:魚鷹談單片機 KeyLevelTypedef temp; // 可不可以不使用這個中間變量? temp = get_key_level(); if(temp != key_last_level){ key_last_level = temp; return; } // 當運行到這里,說明電平已經穩定下來了 if(temp == KEY_LEVEL_DOWN){if(key_state == KEY_STATE_IDLE){ // 確保曾經釋放過按鍵,這樣可以保證在按下時不會不停設置該標志位 key_state = KEY_STATE_DOWN;// 按鍵按下標志位 } } else{ if(key_state == KEY_STATE_FINISH){ // 防止多線程情況下同時修改 key_state = KEY_STATE_IDLE; // 釋放按鍵 } }}在這里,使用了兩個全局變量,一個是 key_state,一個是 key_last_level。前者共三種狀態,這是為了防止按鍵掃描和按鍵處理程序不是順序執行而設定的。當你按下按鍵后,保證按鍵處理程序必然可以得到按下狀態,同時只有釋放了按鍵之后才可以更改狀態位,然后才能再次觸發。這樣可以保證按鍵掃描和按鍵處理得以順序執行(這里面的關系需要考慮清楚,否則的就會寫出有 BUG 的程序)。而后者只在本函數使用,所以不存在使用風險(前提是沒有多個任務同時調用該函數,否則照樣有風險)。可以看到該代碼沒有任何延時函數,簡單、高效,當然這里有一個前提,那就是該函數的調用周期必須大于抖動時間,但是也別太長,否則實時性不好。假設抖動期時間為 20 ms,實現 20 ms 的調用周期有很多種方法:1、中斷定時器定時調用2、軟件定時器調用(需操作系統)3、線程內周期執行該函數(需操作系統)4、使用魚鷹介紹的方式(《延時功能進化論之V2.5~V2.7(魚鷹強烈建議)》)我們再次看這個圖:

高電平穩定時該如何處理呢?

如果我們使用 V1.0 的方式,我們就會發現,當程序運行在抖動期,因為函數調用的時間大于抖動時間,那么程序總是可以得到穩定后的狀態。比如空閑狀態下(key_last_level為高電平),突然按下按鍵,假設在抖動中期程序檢測到高電平,那么20 ms 后檢測的是低電平,顯然這是不相等的(key_last_level更新為低電平),那么程序就會執行下一次,下一次即40 ms 后檢測肯定是低電平(如果不是,說明電平不穩定),此時電平相等,即可認為電平穩定了。而如果在抖動中期程序檢測到低電平,那么20 ms 后檢測的應該還是低電平,那么程序認為此時電平已經穩定了,那也沒有問題,因為它已經跳過了抖動期。V2.0如果說,濾波只有按鍵這種抖動的話,那么上述方式應該算很不錯了,但有時對IO濾波的需求比較復雜,那么上述方式只可參考,不可直接拿來對任何 IO 進行濾波。而且很多時候,程序需要定時檢測多個 IO 的電平狀態,當電平發生變化時,我們能及時通知應用層,而且只在電平發生變化時才進行通知。但與此同時我們需要在電平穩定之后才通知,而不是變化后馬上進行通知,否則可能在電平抖動時多次通知。所以針對這種需求,我們需要設計一個更加通用一些的濾波函數,能應對所有數字 IO 的濾波(包括按鍵)。其實按鍵濾波已經包含了濾波思想,只是不夠通用,需要進一步改進。

typedef enum { LEVEL_LOW, // LEVEL_HIGH, }LevelTypedef;

typedef struct { uint32_t last_time; // 上次時間 LevelTypedef last_level; // 上次電平狀態}FilterParaTypedef;

// V2.0// para 濾波變量,level 當前檢測電平狀態, time 當前時間戳,單位 1 ms, stable_time希望電平穩定的時間uint8_t filter(FilterParaTypedef *para, LevelTypedef level, uint32_t time, uint32_t stable_time){ // 歡迎關注:魚鷹談單片機 if(level != para-》last_level){ para-》last_level = level; // 更新當前電平狀態 para-》last_time = time; // 更新電平變化的時刻 return 0; // 電平未穩定 } if(time - para-》last_time 》 stable_time){ // 這兩個條件可以放在一起進行 && 判斷嗎? return 1; // 需要上報 } return 0; // 電平穩定時間不夠長}

這個代碼的思想就是,當電平不穩定時,更新當前時間戳,一旦電平不再變化,并且持續的時間夠長(這個時間由用戶決定),那么返回 1 表示電平已經穩定了(這個函數沒有調用周期限制,調用周期不同,會產生一些影響,這個和濾波時間精度有關)。這個代碼看起來挺簡單的,也好像沒啥問題,但實際上是存在問題的。看到那個穩定時間判斷條件了嗎?如果下次繼續執行這個函數,那么程序依然返回 1,所以它總是會在穩定后不停的返回 1(判斷條件總是成立),這樣一來,這個函數并不能實現電平變化后才進行通知,也就是說調用者無法通過返回值直接決定下一步動作。可能你會說,如果在返回 1 之前先更新一下時間戳呢?看過魚鷹之前筆記的應該知道,這種方式會周期性返回 1,即如果希望電平穩定時間為 10 ms,那么在電平穩定后,每隔 10 ms 返回 1,這是我們不希望看到的。那么有沒有什么解決辦法呢?當然。因為我們只希望在變化之后再穩定時才返回1,即我們既希望短暫電平變化并不返回1,而那些長時間穩定的電平能在穩定時間閾值之后返回1,又希望在穩定之后只返回一次1,之后電平變化后如果再次穩定才返回1。有點繞口,看圖好了:

高電平穩定時該如何處理呢?

因為目前判斷條件總是返回1,所以我們需要增加限制條件,讓它不總是返回1。簡單的辦法是,增加一個變量,用于記錄上次的穩定后的電平,比如這樣:

typedef enum { LEVEL_LOW, // LEVEL_HIGH, }LevelTypedef;

typedef struct { uint32_t last_time; // 上次時間 LevelTypedef last_level; // 上次電平狀態 LevelTypedef last_stable_level; // 上次穩定的電平狀態 }FilterParaTypedef;

// V2.0// para 濾波變量,level 當前檢測電平狀態, time 當前時間戳,單位 1 ms, stable_time希望電平穩定的時間uint8_t filter(FilterParaTypedef *para, LevelTypedef level, uint32_t time, uint32_t stable_time){ // 歡迎關注:魚鷹談單片機 if(level != para-》last_level){ para-》last_level = level; // 更新當前電平狀態 para-》last_time = time; // 更新電平變化的時刻 return 0; // 電平未穩定 } if(time - para-》last_time 》 stable_time){ // 這兩個條件可以放在一起進行 && 判斷嗎? if(level != para-》last_stable_level) { // 電平穩定時間夠長且電平發生了變化 para-》last_stable_level = level; return 1; // 需要上報 } } return 0; // 電平穩定時間不夠長}

這樣一來,下一次繼續執行時,就不會再次返回1了。但是以上代碼其實是有一個隱含問題的,那就是如果兩次長時間電平之間有一個短時間的不同電平存在,那么也只會上報一次,即返回一次1,即如下情況:

高電平穩定時該如何處理呢?

如果說這是你想要的效果,那么恭喜你,你不用更改代碼;但如果這不是你想要的結果,那這個代碼就存在BUG,畢竟變化的時間雖然短,但還是變化了的嘛(這個問題稍后討論)。還有一個問題,看過魚鷹以前筆記的人都知道,這種計時方式是存在問題的,因為如果你的電平穩定時間很長,長到四字節計時器溢出了,那么就可能出問題。不過在這里,即使出現溢出,也沒關系,結果是一樣的,因為如果電平穩定時間很長了,那么肯定已經上報過一次了,后面肯定也不需要再次上報了。V2.5V2.0方式確實很高效,但是為了只在變化時上報一次,就要增加一個變量還是很不爽的,如果說魚鷹沒有找到好的方式,那么魚鷹會采用的,但湊巧的是,魚鷹想到了更好的方式,不需要增加這個變量也能達到效果。一個用于計時,一個用于記錄上次電平,這兩個變量肯定是不可或缺的。但是如果你仔細思考一下,就會發現,所謂的記錄上次電平,其實是在變化時就被快速更改了的,它記錄的是實時電平變化,而計時是在變化后更新時間戳,穩定時判斷穩定時間,如果我們把計時順序換一下,會如何呢?即,穩定時更新時間戳,變化時判斷穩定時間,而記錄電平的變量只記錄已穩定的電平,會怎么樣?

typedef struct { uint32_t last_time; // 上次時間 LevelTypedef last_stable_level; // 上次穩定的電平狀態 }FilterParaTypedef;

// V2.5// para 濾波變量,level 當前檢測電平狀態, time 當前時間戳,單位 1 ms, stable_time希望電平穩定的時間uint8_t filter(FilterParaTypedef *para, LevelTypedef level, uint32_t time, uint32_t stable_time){ // 歡迎關注:魚鷹談單片機 if(level != para-》last_stable_level){ if(time - para-》last_time 》 stable_time) { para-》last_stable_level = level; // 如果這次電平穩定時間足夠長,那么記錄這次穩定的電平 return 1; // 上報 } return 0; // 不上報,同時不更新時間戳(穩定時間不夠) }

para-》last_time = time; // 不斷更新電平穩定時間,保存電平穩定時的時間戳 return 0; // 不上報}

上面的代碼比V2.0簡單了許多,但也稍微難理解,但如果你仿真測試一番,其實也容易理解。測試代碼(rt_tick_get() 函數用于獲取當前時間,單位 ms):

FilterParaTypedef FilterPara;

void task(void *parameter){ while(1) { LevelTypedef temp = (LevelTypedef)HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); if(filter(&FilterPara, temp, rt_tick_get(), 100)) { rt_kprintf(“stable level is %u

”,temp); } rt_thread_delay(5); } }

當你修改PB0電平時,可得到如下測試結果:

高電平穩定時該如何處理呢?

在這個例子中,要求電平穩定時間20 ms,而線程的執行周期為 5 ms,即電平采樣率為5 ms,當你的手速點擊足夠快時(如果不夠快,可以加長 20 ms),那么應該不會有任何打印信息輸出。需要注意的是,采樣率比較關鍵,如果電平變化快,而采樣率設置的不合適,那么不能完全反應外界引腳電平的變化,這個和“香農定理”有關,超出魚鷹的范圍,就不多說了。V3.0有的時候需求可能要求只需要穩定一個高電平或者低電平才上報,其他時候不上報,那么該如何修改V2.5的代碼呢?上報時加入限制條件即可,如下所示:

// V3.0// para 濾波變量,level 當前檢測電平狀態, time 當前時間戳,單位 1 ms, stable_time希望電平穩定的時間uint8_t filter(FilterParaTypedef *para, LevelTypedef level, uint32_t time, uint32_t stable_time){ // 歡迎關注:魚鷹談單片機 if(level != para-》last_stable_level){ if(time - para-》last_time 》 stable_time) { para-》last_stable_level = level; // 如果這次電平穩定時間足夠長,那么記錄這次穩定的電平 if(level == LEVEL_HIGH) // LEVEL_HIGH 可以作為 para 的成員變量參數傳入,方便適應其他電平 { return 1; // 上報 } } return 0; // 不上報,同時不更新時間戳(穩定時間不夠) }

para-》last_time = time; // 不斷更新電平穩定時間,保存電平穩定時的時間戳 return 0; // 不上報}

這樣一來,只會在高電平穩定時才會進行上報,而低電平卻不會上報。但是這種方式同樣有一個隱藏限制,那就是低電平必須能穩定一段時間,否則下次高電平無法上報,照樣有 V2.0 的限制,如何打破這種限制呢?V3.1如果我們的需求是,變化后高電平穩定時上報一次,如果之后存在低電平,然后又變為高電平,并且穩定了,那么希望也能上報,那該如何處理呢?

高電平穩定時該如何處理呢?

代碼如下:

// V3.1// para 濾波變量,level 當前檢測電平狀態, time 當前時間戳,單位 1 ms, stable_time希望電平穩定的時間uint8_t filter(FilterParaTypedef *para, LevelTypedef level, uint32_t time, uint32_t stable_time){ // 歡迎關注:魚鷹談單片機 if(level != para-》last_stable_level){ if(level != LEVEL_HIGH) // LEVEL_HIGH 可以作為 para 的成員變量參數傳入,方便適應其他電平 { para-》last_stable_level = level; // 快速切換狀態 // para-》last_time = time; // 是否有必要同時更新時間戳呢? } else if(time - para-》last_time 》 stable_time) { para-》last_stable_level = level; // 如果這次電平穩定時間足夠長,那么記錄這次穩定的電平 if(level == LEVEL_HIGH) // LEVEL_HIGH 可以作為 para 的成員變量參數傳入,方便適應其他電平 { return 1; // 上報 } } return 0; // 不上報,同時不更新時間戳(穩定時間不夠) }

para-》last_time = time; // 不斷更新電平穩定時間,保存電平穩定時的時間戳 return 0; // 不上報}

V3.2為了讓這個濾波代碼(事實上已經不僅僅承擔濾波功能,同時承擔了變化并穩定后上報功能)更加通用,可以這樣設計:

typedef enum { LEVEL_LOW, // LEVEL_HIGH, }LevelTypedef;

typedef struct { uint32_t last_time; // 上次時間 LevelTypedef last_stable_level; // 上次穩定的電平狀態 LevelTypedef filter_level; // 希望濾波的電平}FilterParaTypedef;

// V3.2// para 濾波變量,level 當前檢測電平狀態, time 當前時間戳,單位 1 ms, stable_time希望電平穩定的時間uint8_t filter(FilterParaTypedef *para, LevelTypedef level, uint32_t time, uint32_t stable_time){ // 歡迎關注:魚鷹談單片機 if(level != para-》last_stable_level){ if(level != para-》filter_level) // LEVEL_HIGH 可以作為 para 的成員變量參數傳入,方便適應其他電平 { para-》last_stable_level = level; // 快速切換狀態 // para-》last_time = time; // 是否有必要同時更新時間戳呢? } else if(time - para-》last_time 》 stable_time) { para-》last_stable_level = level; // 如果這次電平穩定時間足夠長,那么記錄這次穩定的電平 if(level == para-》filter_level) // LEVEL_HIGH 可以作為 para 的成員變量參數傳入,方便適應其他電平 { return 1; // 上報 } } return 0; // 不上報,同時不更新時間戳(穩定時間不夠) }

para-》last_time = time; // 不斷更新電平穩定時間,保存電平穩定時的時間戳 return 0; // 不上報}

因為函數沒有全局變量,所以可以認為它是一個可重入函數(前提是傳入的參數指針地址不同),可放心使用。
責任編輯:pj

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6042

    文章

    44617

    瀏覽量

    637563
  • 濾波
    +關注

    關注

    10

    文章

    669

    瀏覽量

    56723
  • 高電平
    +關注

    關注

    6

    文章

    153

    瀏覽量

    21478
收藏 人收藏

    評論

    相關推薦

    TTL電平高電平信號的轉換

    在電子工程領域,信號電平的轉換是一個常見的需求,尤其是在不同技術標準之間。TTL(晶體管-晶體管邏輯)電平高電平信號是兩種不同的電平標準,它們在電壓水平和應用場景上有所不同。 TTL
    的頭像 發表于 01-16 10:28 ?125次閱讀

    DAC7744用作TMS320F2812的DAC時是否需要將2812輸出的高電平轉化為5v的高電平

    請問DAC7744用作TMS320F2812的DAC時是否需要將2812輸出的高電平轉化為5v的高電平?謝謝!
    發表于 11-15 06:57

    高電平輸入和低電平輸入是什么意思

    在現代電子系統中,數字電路扮演著至關重要的角色。這些電路處理的是二進制信號,即由邏輯“1”和邏輯“0”組成的信號。這些邏輯狀態通常通過電壓水平來表示,其中高電平代表邏輯“1”,低電平代表邏輯“0
    的頭像 發表于 10-17 14:56 ?3016次閱讀

    rca輸出是低電平還是高電平

    (黃色插頭)。這些連接器通常用于連接家庭影院系統、音響設備、游戲機和其他多媒體設備。 關于RCA輸出是低電平還是高電平,這實際上是一個關于信號電平的問題。在電子學中,電平通常指的是信號
    的頭像 發表于 10-17 11:01 ?1072次閱讀

    雙色led燈的引腳為高電平還是低電平

    雙色LED燈的引腳電平高電平或低電平)取決于其電路設計和控制方式。雙色LED燈通常包含兩個LED芯片(如紅色和綠色),它們共用一個引腳(共陰或共陽),另外兩個引腳則分別控制這兩個LED芯片的開關。
    的頭像 發表于 10-01 17:25 ?1247次閱讀

    對于高速型運放,空腳NC是懸空好呢還是接地或是接高電平

    請教一下,對于高速型運放,空腳NC是懸空好呢還是接地或是接高電平? 把空腳接到高電平或是接地是否可以減少噪聲,提高運放性能極其穩定
    發表于 09-24 06:01

    芯片引腳懸空是高電平還是低電平

    芯片引腳懸空時的電平狀態(高電平或低電平)并不是一個固定答案,它取決于多個因素,包括芯片類型、生產廠家、引腳特性以及周圍電路環境等。 首先,從邏輯門電路的角度來看,當引腳懸空時,其電平
    的頭像 發表于 08-28 09:55 ?2798次閱讀

    INA-138設計了一款電路,取樣后1腳的輸出不是一個穩定電平,如何處理

    設計了一款電路,使用到INA-138 ,SOT-23封裝,取樣后1腳的輸出不是一個穩定電平,如何處理
    發表于 08-12 06:51

    與非門的閑置輸入端如何處理

    在數字電路設計中,與非門(NAND gate)是一種基本的邏輯門,它具有兩個或多個輸入端和一個輸出端。當所有輸入端都為高電平時,輸出端為低電平;當至少有一個輸入端為低電平時,輸出端為高電平
    的頭像 發表于 07-30 14:47 ?1877次閱讀

    高電平和低電平輸入有什么區別

    Level)通常指電壓高于某個閾值的電平狀態,而低電平(Low Level)則指電壓低于閾值的電平狀態。在數字電路中,高電平和低
    的頭像 發表于 07-23 11:25 ?5867次閱讀

    請問stm8的空腳不用何處理

    我現在沒用的空腳沒有設置輸入輸出模式也沒外接上拉電阻或電容,每當我去觸碰這個空腳時都會引起單片機復位。加了個104就好了,但是文檔上說要接上下拉電阻,我試了管腳也會復位。那究竟stm8不用的管腳何處理?
    發表于 05-08 06:00

    播放avi視頻時,音頻數據何處理啊 ?

    請教下,播放 avi 視頻時,音頻數據何處理啊 ???
    發表于 05-06 07:56

    STM8L spi通信的單線雙向通信,何處理收和發

    如題,SPI通信中,在手冊和庫中都有描述,但是在具體使用中,何處理收和發?貌似這就是傳說中的三線SPI,有人能指點下么,謝謝
    發表于 04-28 08:01

    STM32F103RCT6定時器采集高電平數據有波動的原因?

    通過STM32F103RCT6需要采集3路方波的高電平,沒有使用輸入捕獲采集(輸入捕獲是特定的引腳,比較麻煩)采集的方波的周期是7MS頻率145HZ,通過定時加外部中斷的方式實現了采集,由于對采集
    發表于 04-15 06:51

    STM32的IO口初始化為輸入浮空,那管腳是高電平還是低電平

    STM32的IO口初始化為輸入浮空,那管腳是高電平還是低電平
    發表于 04-07 07:12
    主站蜘蛛池模板: 热综合一本伊人久久精品 | 2017年伦理片免费观看 | 亚洲嫩草AV永久无码精品无码 | 久久精品中文騷妇女内射 | 亚洲黄网站wwwwww | 精品久久久久久综合网 | 男人一生要读的书 | 久久热这里只有 精品 | 三级色视频 | 国产色欲一区二区精品久久呦 | 大胸美女被吊起来解开胸罩 | 手机在线成人精品视频网 | 久久亚洲精品成人综合 | 国产精品伦一区二区三级视频 | 亚洲 综合 欧美在线视频 | 视频在线免费观看 | 越南女子杂交内射BBWXZ | 成片免费观看视频在线网 | 免费无码一区二区三区蜜桃大 | 午夜电影三级还珠格格 | 丝袜情趣在线资源二区 | 美女被爆插 | 奶水四溅54p | 欧美精品成人一区二区在线观看 | 99视频精品国产免费观看 | 超h高h肉h文教室生理课 | 97精品国产高清在线看入口 | 免费精品美女久久久久久久久久 | 在线欧美 精品 第1页 | 亚洲成在人线视频 | 一本色道久久综合亚洲精品 | 狠狠色丁香婷婷久久综合 | 亚洲成人一区 | 亚洲久久少妇中文字幕 | 中文无码在线观 | 依人青青青在线观看 | 野草在线视频完整视频 | 熟女久久久久久久久久久 | 欧美性xxxx18 | 耻辱诊察室1一4集动漫在线观看 | 99在线在线视频观看 |