日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

12864液晶模块的详细使用

發布時間:2024/8/1 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 12864液晶模块的详细使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
備注:這篇文章是對12864操作的具體介紹,僅限剛接觸12864的新手,大神請拍磚,文章寫的較散,建議先參考12864手冊及控制驅動器ST7920英文手冊有個初步理解之后再閱讀該篇文章,將會有更深的認識。強烈建議閱讀ST7920英文手冊,細節內容里面有詳細介紹,中文的12864也是從中譯過來的。
本文分三個步驟介紹12864的內部資源原理,指令集詳細講解,以及應用例子。
對12864的所有操作概括起來有4種: 1)、讀忙狀態(同時讀出指針地址內容),初始化之后每次對12864的讀寫均要進行忙檢測。 2)、寫命令:所有的命令可以查看指令表,后續講解指令的詳細用法。寫地址也是寫指令。 3)、寫數據:操作對象有DDRAM、CGRAM、GDRAM。 4)、讀數據:操作對象也是DDRAM、CGRAM、GDRAM。 ?


對12864的學習首相要了解其內部資源,知道了它里面有哪些東西,你就可以更加方便的使用它。
先介紹幾個英文的名字: DDRAM:(Data Display Ram),數據顯示RAM,往里面寫啥,屏幕就會顯示啥。 CGROM:(Character Generation ROM),字符發生ROM。里面存儲了中文漢字的字模,也稱作中文字庫,編碼方式有GB2312(中文簡體)和BIG5(中文繁體)。筆者使用的是育松電子的QC12864B,講解以此為例。 CGRAM:(Character Generation RAM),字符發生RAM,,12864內部提供了64×2B的CGRAM,可用于用戶自定義4個16×16字符,每個字符占用32個字節。 GDRAM:(Graphic Display RAM):圖形顯示RAM,這一塊區域用于繪圖,往里面寫啥,屏幕就會顯示啥,它與DDRAM的區別在于,往DDRAM中寫的數據是字符的編碼,字符的顯示先是在CGROM中找到字模,然后映射到屏幕上,而往GDRAM中寫的數據時圖形的點陣信息,每個點用1bit來保存其顯示與否。 HCGROM:(Half height Character Generation ROM):半寬字符發生器,就是字母與數字,也就是ASCII碼。 至于ICON RAM(IRAM):貌似市場上的12864沒有該項功能,筆者也沒有找到它的應用資料,所以不作介紹。
下面就圍繞著上面列舉的這列資源展開對12864的講解: DDRAM: ????筆者使用的這塊12864內部有4行×32字節的DDRAM空間。但是某一時刻,屏幕只能顯示2行×32字節的空間,那么剩余的這些空間呢?它們可以用于緩存,在實現卷屏顯示時這些空間就派上用場了。 ????DDRAM結構如下所示: 80H、81H、82H、83H、84H、85H、86H、87H88H、89H、8AH、8BH、8CH、8DH、8EH、8FH 90H、91H、92H、93H、94H、95H、96H、97H98H、99H、9AH、9BH、9CH、9DH、9EH、9FH A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7HA8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7HB8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH
地址與屏幕顯示對應關系如下: 第一行:80H、81H、82H、83H、84H、85H、86H、87H 第二行:90H、91H、92H、93H、94H、95H、96H、97H? 第三行:88H、89H、8AH、8BH、8CH、8DH、8EH、8FH 第四行:98H、99H、9AH、9BH、9CH、9DH、9EH、9FH
說明:紅色部分的數據歸上半屏顯示,綠色部分的數據歸下半屏顯示。一般我們用于顯示字符使用的是上面兩行的空間,也就是80H~8FH,90H~9FH,每個地址的空間是2個字節,也就是1個字,所以可以用于存儲字符編碼的空間總共是128字節。因為每個漢字的編碼是2個字節,所以每個地址需要使用2個字節來存儲一個漢字。當然如果將2個字節拆開來使用也可以,那就是顯示2個半寬字符。 ????DDRAM內部存儲的數據是字符的編碼,可以寫入的編碼有ASCII碼、GB2312碼、BIG5碼。筆者使用的12864字庫貌似不太全,字符“數”都無法顯示,而是顯示其他字符。如果顯示長篇漢字文章就不太適合吧。 ????DDRAM數據讀寫: ????所有的數據讀寫都是先送地址,然后進行讀寫。對DDRAM寫數據時,確保在基本指令集下(使用指令0x30開啟),然后寫入地址,之后連續寫入兩個字節的數據。讀數據時,在基本指令集下先寫地址,然后假讀一次,之后再連續讀2個字節的數據,讀完之后地址指針自動加一,跳到下一個字,若需要讀下一個字的內容,只需再執行連續讀2個字節的數據。這里的假讀需要注意,不光是讀CGRAM需要假讀,讀其他的GDRAM、DDRAM都需要先假讀一次,之后的讀才是真讀,假讀就是讀一次數據,但不存儲該數據,也就是說送地址之后第一次讀的數據時錯誤的,之后的數據才是正確的。(dummy為假讀)

????關于編碼在DDRAM中的存儲需要說明事項如下: ????1)、每次對DDRAM的操作單位是一個字,也就是2個字節,當往DDRAM寫入數據時,首先寫地址,然后連續送入2個字節的數據,先送高字節數據,再送低字節數據。讀數據時也是如此,先寫地址,然后讀出高字節數據,再讀出低字節數據(讀數據時注意先假讀一次)。 ????2)、顯示ASCII碼半寬字符時,往每個地址送入2個字節的ASCII編碼,對應屏幕上的位置就會顯示2個半寬字符,左邊的為高字節字符,右邊的為低字節字符。 ????3)、顯示漢字時,漢字編碼的2個字節必須存儲在同一地址空間中,不能分開放在2個地址存放,否則顯示的就不是你想要的字符。每個字中的2個字節自動結合查找字模并顯示字符。所以,如果我們往一個地址中寫入的是一個漢字的2字節編碼就會正確顯示該字符,編碼高字節存放在前一地址低字節,編碼低字節存放在后一地址高字節,顯然他們就不會結合查找字模,而是與各地址相應字節結合查找字模。

????4)、因為控制器ST7920提供了4個自定義字符,所以這4個自定義字符也是可以顯示出來的,同樣這4個自定義字符也是采用編碼的方式,但是這4個字符的編碼是固定的,分別是0000H,0002H,0004H,0006H。如下圖所示:

上圖只是把2個字符的CGRAM空間畫出來,后續還有2個字符。可以看到每個字符都有16行16列,每一行使用2個字節,因此一個字符占用的空間是32字節,地址是6位的,4個字符的地址分別是:00H~0FH、10H~1FH、20H~2FH、30H~3FH。編碼使用2個字節,可以看到有2個位是任意的,說明其實這4個字符的編碼可以有多個,只是我們常用前面列舉的4個編碼。

CGRAM:?(數據讀寫) ????CGRAM的結構就是上面所示了,這里再補充一些讀寫CGRAM的內容,讀寫之前先寫地址,寫CGRAM的指令為0x40+地址。但是我們寫地址時只需要寫第一行的地址,例如第一個字符就是0x40+00H,然后連續寫入2個字節的數據,之后地址指針會自動加一,跳到下一行的地址,然后再寫入2個字節的數據。其實編程實現就是寫入地址,然后連續寫入32個字節的數據。讀數據也是先寫首地址,然后假讀一次,接著連續讀32個字節的數據。
GDRAM:(繪圖顯示RAM) 繪圖RAM的空間結構如下圖所示:

這些都是點陣,繪圖RAM就是給這些點陣置1或置0,可以看到其實它本來是32行×256列的,但是分成了上下兩屏顯示,每個點對應了屏幕上的一個點。要使用繪圖功能需要開啟擴展指令。然后寫地址,再讀寫數據。 ????GDRAM的讀寫: ????首先說明對GDRAM的操作基本單位是一個字,也就是2個字節,就是說讀寫GDRAM時一次最少寫2個字節,一次最少讀2個字節。 ????寫數據:先開啟擴展指令集(0x36),然后送地址,這里的地址與DDRAM中的略有不同,DDRAM中的地址只有一個,那就是字地址。而GDRAM中的地址有2個,分別是字地址(列地址/水平地址X)和位地址(行地址/垂直地址Y),上圖中的垂直地址就是00H~31H,水平地址就是00H~15H,寫地址時先寫垂直地址(行地址)再寫水平地址(列地址),也就是連續寫入兩個地址,然后再連續寫入2個字節的數據。如圖中所示,左邊為高字節右邊為低字節。為1的點被描黑,為0的點則顯示空白。這里列舉個寫地址的例子:寫GDRAM地址指令是0x80+地址。被加上的地址就是上面列舉的X和Y,假設我們要寫第一行的2個字節,那么寫入地址就是0x00H(寫行地址)然后寫0x80H(列地址),之后才連續寫入2個字節的數據(先高字節后低字節)。再如寫屏幕右下角的2個字節,先寫行地址0x9F(0x80+32),再寫列地址0x8F(0x80+15),然后連續寫入2個字節的數據。編程中寫地址函數中直接用參數(0x+32),而不必自己相加。 ????讀數據:先開啟擴展指令集,然后寫行地址、寫列地址,假讀一次,再連續讀2字節的數據(先高字節后低字節)。
讀寫時序:
讀寫時序圖如下:(上圖為寫,下圖為讀)



時序圖中的信號引腳就是12864主要的引腳,分別是: RS:命令/數據寄存器選擇端 WR:讀寫控制端
E:使能端
DB7~DB0:數據端 ? 所有對12864的操作都是圍繞著幾根引腳展開的。包括寫命令、寫數據、讀數據、讀狀態就是通過這些引腳的高低電平搭配來實現的。

根據時序圖可以編寫相應的寫命令函數、寫數據函數、讀數據函數、讀狀態函數。需要的注意的是有效數據出現的那段時間Tc必須合適,不能太短,否則會造成讀寫失敗。
? 給出幾個函數示例: //忙檢測,若忙則等待,最長等待時間為60ms
void busychk_12864(void){
?unsigned int timeout = 0;
?E_12864 = 0;
?RS_12864 = 0;
?RW_12864 = 1;
?E_12864 = 1;
?while((IO_12864 & 0x80) && ++timeout != 0);??//忙狀態檢測,等待超時時間為60ms
?E_12864 = 0;
} ? //寫命令子程序
void wrtcom_12864(unsigned char com){
?busychk_12864();
?E_12864 = 0;?
?RS_12864 = 0;
?RW_12864 = 0;
?IO_12864 = com;
?E_12864 = 1;
?delay_12864(50);????//50us使能延時!!!注意這里,如果是較快的CPU應該延時久一些
?E_12864 = 0; ?
}
? //讀數據子程序
unsigned char reddat_12864(void){
?unsigned char temp;
?busychk_12864();
?E_12864 = 0;
?IO_12864 = 0xff;??//IO口置高電平,讀引腳
?RS_12864 = 1;
?RW_12864 = 1;
?E_12864 = 1;
?delay_12864(50);????//使能延時!!!注意這里,如果是較快的CPU應該延時久一些
?temp = IO_12864;
?
?return temp;?
}
? //寫數據子程序
void wrtdat_12864(unsigned char dat){
?busychk_12864();
?E_12864 = 0;
?RS_12864 = 1;
?RW_12864 = 0;
?E_12864 = 1;
?IO_12864 = dat;
?delay_12864(50);????//使能延時!!!注意這里,如果是較快的CPU應該延時久一些
?E_12864 = 0;??
}
? 其中,忙檢測是必要的,當BF=1時,表示內部正在進行有關的操作,即處于忙狀態。在BF變回0之前ST7920不會接受任何指令。MCU必須檢測BF以確定ST7920內部操作是否完成,然后才能再發送指令。也可以用延時來替代忙檢測,但是需要延時足夠的時間。盲檢測實際就是讀內部的狀態寄存器,該寄存器最高位(D7)為忙標志BF,剩余7位為地址指針的內容,所以進行盲檢測實際上也把地址指針中的地址讀出來了。 ? 指令集: 指令集分為基本指令集和擴展指令集,使用相應的指令集必須先寫相應指令表明后續指令均為該類指令。如使用基本指令集時,寫指令(0x30),需要使用擴展指令集時寫指令(0x34)切換到擴展指令集。 ? 一)基本指令集(RE=0):(使用擴展指令集先寫指令0x30,這使得RE=0) ? 清屏指令(0x01):往DDRAM寫滿0x20,指針地址寫0x00。表現在屏幕就是顯示空白。 回車指令(0x02/0x03):地址指針內容寫0x00. 進入模式0 0 0 0 0 1 I/D S:設置讀寫數據之后光標、顯示移位的方向。內部有2個可編程位,I/D表示讀寫一個字符后數據指針是加一還是減一。I/D=1指針加一,I/D=0指針減一。S=1開啟整屏移動。 S I/D= H H,屏幕每次左移一個字符。 S I/D= H L ,屏幕每次右移一個字符。 但是平時不開啟屏幕移動,這里說明一個概念,就是屏幕移動,實際試驗中若開啟了屏幕移動你會發生顯示是灰常怪異的,說明如下:由于DDRAM的結構是下方表所示: 上半屏?????????????????????????????????????????????下半屏 80H、81H、82H、83H、84H、85H、86H、87H88H、89H、8AH、8BH、8CH、8DH、8EH、8FH 90H、91H、92H、93H、94H、95H、96H、97H98H、99H、9AH、9BH、9CH、9DH、9EH、9FH A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7HA8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7HB8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH 在未開啟屏移時,屏幕是以表格第一列作為參考起點,然后前8列歸上半屏顯示,后8列歸下半屏顯示。如果此時向左屏移一個字符,那么DDRAM內容與顯示映射關系變為: 80H81H、82H、83H、84H、85H、86H、87H88H89H、8AH、8BH、8CH、8DH、8EH、8FH 90H91H、92H、93H、94H、95H、96H、97H98H99H、9AH、9BH、9CH、9DH、9EH、9FH A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7HA8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7HB8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH 可以看到實際上原來第三第四行開始的字符跑到了第一行第二行的末尾,整個DDRAM的結構就是一種循環的結構,發生屏移時DDRAM與顯示映射關系不斷在改變。但是這不太符合我們的閱讀習慣,所以如果需要使用該項功能還需編程校正之。 顯示、光標、閃爍開關0 0 0 0 0 0 1 D C B: D=1: 顯示開(Display)?C=1: 光標開(Cursor)?B=1: 光標位置閃爍開(Blink)。為0則為關。 光標顯示移位控制0 0 0 1 S/C R/L X X ?
說明:
LL:這時僅僅是將地址指針AC的值減1。在屏幕上表現是光標左移一個字符。 LH:這時僅僅是將地址指針AC的值加1。在屏幕上表現是光標右移一個字符。 HL:AC指針不變,向左屏移一個字符。這是DDRAM結構循環左移,80H接在8FH后面,90H接在9FH后面。這與上面講的屏移是一樣的。 HH:AC指針不變,向右屏移一個字符。這是DDRAM結構循環右移,80H接在8FH后面,90H接在9FH后面。 功能設置:0 0 1 DL X?RE?X X:(切換基本指令集與擴展指令集) DL=1表示8為接口,DL=0表示4為接口。 RE=1表示開啟擴展指令,RE=0表示使用基本指令。 開啟基本指令則設置為0x30,開啟擴展指令則設置為0x34。 CGRAM地址設置:0x40+地址。地址范圍是00H~3FH。前提是SR=0,即允許設置IRAM和CGRAM地址!!! DDRAM地址設置:只有字地址。如下表所示。(注意DDRAM地址有4行×16字)如下所示: 80H、81H、82H、83H、84H、85H、86H、87H88H、89H、8AH、8BH、8CH、8DH、8EH、8FH 90H、91H、92H、93H、94H、95H、96H、97H98H、99H、9AH、9BH、9CH、9DH、9EH、9FH A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7HA8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7HB8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH 所以某一時刻只能顯示其中的2行。只有卷動顯示才能將另兩行的數據顯示出來。 讀忙標志(地址):同時忙標志和地址讀出來。忙狀態時,ST7920不會接受任何指令。按照時序圖將RS置0,RW置1,然后讀取狀態寄存器。 寫RAM(DDRAM/CGRAM/GDRAM):寫了控制邏輯(函數wrtcom_12864(地址);)之后,直接送數據(wrtdat_12864)。寫完后地址指針根據進入模式中的設置加一或減一。寫數據前先寫地址,而寫地址本身是一個寫地址命令,然后再寫數據。 讀RAM(DDRAM/CGRAM/GDRAM):記得先假讀一次,后面的才是真讀,假讀之后不需要再假讀了,除非重設了地址。 ? 二)擴展指令集(RE=1):(使用擴展指令集先寫指令0x34,這使得RE=1) ? 待機模式:0x01,不影響DDRAM,所以跟清屏指令不同,任何指令可以結束待機模式。 卷動地址/IRAM地址允許設置:0 0 0 0 0 0 1 SR: SR=1:允許設置垂直卷動地址。SR=0:允許設置IRAM和CGRAM地址。 設置卷動/IRAM地址:0x40+地址。(卷動地址為行地址,即縱向地址). 這里講解卷動,卷動就是上下滾屏,實現屏幕的垂直滾動。 卷動地址:地址范圍為0x00~0x63,共64行卷動地址其實就是垂直地址。每一個地址代表著DDRAM中的一行的像素點。卷動一次就是把該行所有點移到上半屏和下半屏幕最上方。 80H、81H、82H、83H、84H、85H、86H、87H88H、89H、8AH、8BH、8CH、8DH、8EH、8FH 90H、91H、92H、93H、94H、95H、96H、97H98H、99H、9AH、9BH、9CH、9DH、9EH、9FH A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7HA8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7HB8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH 還是DDRAM的結構圖,需要注意的是卷屏是分上半屏卷動和下半屏卷動,兩屏之間沒有關系,也就是DDRAM中左邊紅色部分在上半屏滾動,右邊綠色部分在下半屏滾動。 B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7H?的下一行是 80H、81H、82H、83H、84H、85H、86H、87H 也就是說左邊是一個上下相接的循環結構。同理右邊也是上下相接的循環結構。左邊內存中的字符上下滾動。右邊內存中的字符上下滾動,兩者木有關系。 要開啟卷動,首先開啟擴展指令集,然后允許卷動地址設置,再設置卷動地址。 wrtcom_12864(0x34);??????????????//打開擴展指令
wrtcom_12864(0x03);??????????????//允許輸入卷動地址
wrtcom_12864(0x40 + 地址????//設置卷動地址
wrtcom_12864(0x30);??????????????//回到基本指令
要實現全屏滾動,就必須使用循環不斷地修改卷動地址。從00~63如此循環,但遺憾的是這也不符合我們的閱讀習慣,后續的應用的中將講解全屏滾動的實現方法。這里只是把卷動原理講清楚。 反白顯示:0 0 0 0 0 1 R1 R0: R1、R0初始化的值為00。選擇1~4任一行反白顯示并可決定是否反白。 如何開啟反白顯示:首先開啟擴展指令(0x34),然后設置選中某一行設置反白顯示(0x04+R1R0)。00為第一行,01為第二行,10為第三行,11為第四行。需要說明的是,這里的行是指DDRAM所有內存的行,而不是顯示的行,屏幕只顯示2行。 所以如果我們開啟第3第4行的反白顯示,不卷動我們是看不到效果的。 同時,如果我們開啟第1行反白顯示,那么在屏幕中第1行第3行都會反白顯示,第2行則對應屏幕第2第4行,這一點需要注意。 如何關閉反白顯示:只需在此寫一次地址即可關閉,也就說,第一次寫第一開啟反白,第二次寫相同的地址關閉反白顯示。 wrtcom_12864(0x34);??//反白顯示試驗
wrtcom_12864(0x04);??//開啟反白顯示
delay_12864(60000);??//延時
delay_12864(60000);??//延時
wrtcom_12864(0x04); //關閉反白顯示
wrtcom_12864(0x30);??//開啟基本指令集
擴展功能設置:0x36設置繪圖顯示開。 當GDRAM寫完了之后,寫0x36則屏幕顯示你所繪制的圖形。 0 0 0 0 1 DL x RE G x (RE=1擴展指令,G=1開繪圖顯示,DL=1表示8為接口 設置GDRAM地址:繪圖時,需要將GDRAM的地址寫入地址指針中,然后才能寫入數據。連續寫入兩個字節,第一個為行地址(Y),第二個為列地址(X)。 需要注意的是:寫了數據之后,地址指針會自動加一(以字為單位),當到達該行的行尾時,指針下一次加一會使得地址指針跳回該行行首,也就說如果地址值為8FH時,下一次它就是80H(以第一行為例)。指針地址在本行之間循環。 指令介紹完 再講下初始化過程,根據ST7920的手冊提供的初始化步驟就可以了。

初始化函數如下:
//延時子程序
void delay_12864(unsigned int del){
?unsigned int i;
?for(i = 0; i < del; i++){;?}
}
? //初始化12864子函數
void initial_12864(void){
?delay_12864(40000);
?RST_12864 = 1;
?RST_12864 = 0;????//復位
?delay_12864(500);
?RST_12864 = 1;
?wrtcom_12864(0x30);???//設置為基本指令集動作
?delay_12864(100);
?wrtcom_12864(0x30);???//設置為基本指令集動作
?delay_12864(37);
?wrtcom_12864(0x08);???//設置顯示、光標、閃爍全關。
?delay_12864(100);
?wrtcom_12864(0x01);???//清屏,并且DDRAM數據指針清零
?delay_12864(100000);
?wrtcom_12864(0x06);??????//進入模式設置
}
? 應用部分: 這里講解12864的幾個典型應用: 1)、自編字符創建以及顯示 2)、GDRAM的繪制及顯示 3)、全屏卷動的實現方法 ? ? 1)、自編字符創建以及顯示 先明確的要點,12864具有4個自編字符,每個字符的編碼為0000H、0002H、0004H、0006H,4個自定義字符的CGRAM地址分別為00H~0FH、10H~1FH、20H~2FH、30H~3FH。 我們以第3個字符為例: 在這里先把整個源文件的宏定義以及各子函數貼出: #include <reg52.h> #define IO_12864??P0 sbit?RS_12864 = P2^5;
sbit?RW_12864 = P2^6;
sbit?E_12864 = P2^7;
sbit?RST_12864 = P2^2;
//忙檢測,若忙則等待,最長等待時間為60ms
void busychk_12864(void){
?unsigned int timeout = 0;
?E_12864 = 0;
?RS_12864 = 0;
?RW_12864 = 1;
?E_12864 = 1;
?while((IO_12864 & 0x80) && ++timeout != 0);??//忙狀態檢測,等待超時時間為60ms
?E_12864 = 0;
} ? //寫命令子程序
void wrtcom_12864(unsigned char com){
?busychk_12864();
?E_12864 = 0;?
?RS_12864 = 0;
?RW_12864 = 0;
?IO_12864 = com;
?E_12864 = 1;
?delay_12864(50);????//使能延時!!!注意這里,如果是較快的CPU應該延時久一些
?E_12864 = 0; ?
}
? //讀數據子程序
unsigned char reddat_12864(void){
?unsigned char temp;
?busychk_12864();
?E_12864 = 0;
?IO_12864 = 0xff;??//IO口置高電平,讀引腳
?RS_12864 = 1;
?RW_12864 = 1;
?E_12864 = 1;
?delay_12864(50);????//使能延時!!!注意這里,如果是較快的CPU應該延時久一些
?temp = IO_12864;
?
?return temp;?
}
? //寫數據子程序
void wrtdat_12864(unsigned char dat){
?busychk_12864();
?E_12864 = 0;
?RS_12864 = 1;
?RW_12864 = 0;
?E_12864 = 1;
?IO_12864 = dat;
?delay_12864(50);????//使能延時!!!注意這里,如果是較快的CPU應該延時久一些
?E_12864 = 0;??
}
? //初始化12864子函數
void initial_12864(void){
?delay_12864(40000);
?RST_12864 = 1;
?RST_12864 = 0;????//復位
?delay_12864(500);
?RST_12864 = 1;
?wrtcom_12864(0x30);???//設置為基本指令集動作
?delay_12864(100);
?wrtcom_12864(0x30);???//設置為基本指令集動作
?delay_12864(37);
?wrtcom_12864(0x08);???//設置顯示、光標、閃爍全關。
?delay_12864(100);
?wrtcom_12864(0x01);???//清屏,并且DDRAM數據指針清零
?delay_12864(100000);
?wrtcom_12864(0x06);???//進入模式設置
?wrtcom_12864(0x0c);???//開顯示
?
}
? 以上函數定義在main()函數之前,我們在主函數中編寫程序: void main(){ ??unsigned char i,*addr; ??unsigned char defchar[]?= {0x08,0x10,0x08,0x10,0x08,0x10,0x7F,0xFE,0x20,0x04,0x12,0x48,0x08,0x10,0x05,0xA0,0x02,0x40,0x01,0x80,0x01,0x80,0x07,0xE0,0x09,0x90,0x11,0x88,0x11,0x88,0x11,0x88};????//自定義字符,這里是筆者畫的一個小機器人。 ? ??delay_12864(100);??????//啟動延時 ??initial_12864();???????//初始化12864 ??addr = defchar; ??wrtcom_12864(0x40+0x20); //寫CGRAM首行地址 ??for(i = 0; i < 32; i++){ ????wrtdat_12864(*addr++);??? ??} ??wrtcom_12864(0x80);?????//在第一行第一個字符出顯示自定義字符 ??wrtdat_12864(0x00);?????//寫第三個自定義字符編碼的高字節 ??wrtdat_12864(0x04);?????//寫第三個自定義字符編碼的低字節 ? ??while(1); ? } 運行程序就可以看到第一個字符處出現一個小機器人了。 ? 2)、GDRAM的繪制及顯示 先明確的要點,GDRAM是32行×16字。寫數據之前必須先送行地址,然后送列地址。讀寫的基本操作單元是字(2個字節)。讀寫完一個字后地址指針在本行自動加一,到達行末則返回行首地址(地址循環)。 我們這里先以一個畫點函數函數為例,然后再根據畫點函數寫一個繪制矩形的函數 先建一個坐標左上角為(0,0),右下角為(63,127)。 畫點原理:由于GDRAM的讀寫基本操作單元是字,那么我們需要畫一個點但是又不改變其他點的內容,那么需要把該點所處的字中的2個字節均讀出,然后再單獨修改我們需要畫的那個點(其他位保持不變),最后把該字再寫回去。 因此,涉及的操作有先讀GDRAM,再寫GDRAM,再顯示GDRAM。 在寫主函數之前先寫幾個子函數,說明其作用: void clnGDR_12864(void)??//清空GDRAM
void drawdot_12864(unsigned char y,unsigned char x,unsigned char type) //畫點子函數
? 為什么要清空GDRAM呢,因為指令集中沒有GDRAM清空指令,而我們往里寫了什么它就會一直保存著,所以我們畫點之前先清空GDRAM,其實清空GDRAM就是不斷往里寫0x00。 ? //清空GDRAM,總共就是寫1KB的0x00。
void clnGDR_12864(void){
??unsigned char j,k; ??wrtcom_12864(0x34);??????//在寫GDRAM的地址之前一定要打開擴充指令集 ???????????????????????????//否則地址寫不進去!!
??for( j = 0 ; j < 32 ; j++ )
??{
???
????wrtcom_12864(0x80 + j) ;????//寫Y 坐標
????wrtcom_12864(0x80) ; ???????//寫X 坐標
??
????for( k = 0 ; k < 32 ; k++ ) //寫一整行數據
????{
?????wrtdat_12864( 0x00 );
????}
??}??
}
? //畫點函數,左上角為參考點(0,0)
//右下角為(63,127),點坐標形式為(行坐標,列坐標)
//參數type用于設置畫黑點、白點或取反(黑變白,白變黑)
//type = 0為白色,1 為黑色,2為取反
void drawdot_12864(unsigned char y,unsigned char x,unsigned char type){
??
?unsigned char X,Y,k;??//X存儲行地址,Y存儲列地址
???????????????????????//k存儲點在字中的位置從左至右為0~15
?unsigned char DH,DL;??//存放讀出數據的高字節和低字節
?
?if(y >= 0 && y <= 63 && x >= 0 && x <= 127)?{
??
??if(y < 32){?????//算法:確定所畫點的地址行與列地址
???X = 0x80 + (x >> 4);
???Y = 0x80 + y;?
??}else{
???X = 0x88 + (x >> 4);
???Y = 0x80 + (y - 32);
??}
???????
??wrtcom_12864(0x34);??//開啟擴展指令,關閉繪圖顯示
??wrtcom_12864(Y);??//寫入所確定的點的行位地址??
??wrtcom_12864(X); ??//寫入所確定的點的列字地址
?
??DH = reddat_12864();?//假讀
??DH = reddat_12864();????//讀高字節
??DL = reddat_12864();?//讀低字節
?
??k = x % 16;??????????//余數為點在字中的位置
?
??//畫點
??switch(type){?????//畫點類型,1黑或0白或2取反
???
???case 0:
????????if(k < 8){???//點在高字節
??????DH &= ~(0x01 << (7 - k));??//修改該點同時保持其他位不變
?????}else{??????????//點在低字節
??????DL &= ~(0x01 << (7 - (k % 8)));??//修改該點同時保持其他位不變
?????}
?????break;
???case 1:
?????if(k < 8){
??????DH |= (0x01 << (7 - k));??//修改該點同時保持其他位不變
?????}else{
??????DL |= (0x01 << (7 - (k % 8)));?//修改該點同時保持其他位不變
?????}
?????break;
???case 2:
?????if(k < 8){
??????DH ^= (0x01 << (7 - k));??//修改該點同時保持其他位不變
?????}else{
??????DL ^= (0x01 << (7 - (k % 8)));???//修改該點同時保持其他位不變
?????}
?????break;
???default:
?????break;??
??}
??
??wrtcom_12864(Y);??//寫行位地址
??wrtcom_12864(X);?????//寫列字地址
?
??wrtdat_12864(DH);??//將高字節數據寫回
??wrtdat_12864(DL);??//將低字節數據寫回
?
??wrtcom_12864(0x30);??//轉回普通指令
?}
}
? 下面編寫主函數,這就簡單了,如下: ? void main(void){ ?delay_12864(1000);
?initial_12864();
?clnGDR_12864();???????????//清空GDRAM
?drawdot_12864(20,50,1);???//畫點
?wrtcom_12864(0x36);???????//開繪圖顯示
?while(1);
}
? 程序運行后相應位置出現了一個黑點,手機壞了,拍不了照,不然就貼下照片。 然后根據畫點函數,擴展一個畫矩形的函數吧: ? //畫矩形子函數,參數為(點1行坐標,點1列坐標, //點2行坐標,點2列坐標,線條顏色(0為白,1為黑,2對原色取反))???????????
void drawrec_12864(unsigned char y1,unsigned char x1,unsigned char y2,unsigned char x2,unsigned char type){
?
?unsigned char largex,largey,smallx,smally;??//將兩點橫縱坐標按大小存儲
?unsigned char i;
?if(x1 > x2){
??largex = x1;
??smallx = x2;
?}else{
??largex = x2;
??smallx = x1;
?}
?
?if(y1 > y2){
??largey = y1;
??smally = y2;
?}else{
??largey = y2;
??smally = y1;
?}
?
//以下繪制4條矩形邊框 ?for(i = smallx; i < largex; i++){
??drawdot_12864(largey,i,type);?
?}
?for(i = largey; i > smally; i--){
??drawdot_12864(i,largex,type);
?}
?for(i = largex; i > smallx; i--){
??drawdot_12864(smally,i,type);
?}
?for(i = smally; i < largey; i++){
??drawdot_12864(i,smallx,type);
?}
?
?wrtcom_12864(0x30);?????//返回普通指令??
}
? 主函數為: void main(void){ ?delay_12864(1000);
?initial_12864();
?clnGDR_12864();??????????????????//清空GDRAM
?drawrec_12864(20,50,30,120,1);???//畫矩形
?wrtcom_12864(0x36);??????????????//開繪圖顯示 ?while(1);
}
? 關于GDRAM的操作就到這吧,下面講解下12864全屏卷動的實現方法。 ? 3)、12864全屏卷動的實現方法 首先需要明確的要點: DDRAM的結構如下: 80H、81H、82H、83H、84H、85H、86H、87H88H、89H、8AH、8BH、8CH、8DH、8EH、8FH 90H、91H、92H、93H、94H、95H、96H、97H98H、99H、9AH、9BH、9CH、9DH、9EH、9FH A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7HA8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7HB8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH 卷屏是分上下屏個各自卷動的,上半屏卷動左邊紅色區域的內容,下半屏卷動右邊綠色區域的內容。 ? 為了實現全屏卷動顯示,必須使用拼接的方法實現。 筆者花了幾個小時研究了下算法,然后第二天實現了。現講述如下: 細心觀察DDRAM的結構發現,如果在卷動過程中,在同一時刻屏幕顯示的內容最多涉及3行DDRAM的內容,而另一行是沒有顯示的,那么這一行就是用來緩存的數據的。 當屏幕顯示如下2行時開始卷動(一): 80H、81H、82H、83H、84H、85H、86H、87H88H、89H、8AH、8BH、8CH、8DH、8EH、8FH 90H、91H、92H、93H、94H、95H、96H、97H98H、99H、9AH、9BH、9CH、9DH、9EH、9FH 則屏幕同時出現以下3行DDRAM內容(二): 80H、81H、82H、83H、84H、85H、86H、87H88H、89H、8AH、8BH、8CH、8DH、8EH、8FH 90H、91H、92H、93H、94H、95H、96H、97H98H、99H、9AH、9BH、9CH、9DH、9EH、9FH A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7HA8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH 需要注意的是,左邊是上半屏顯示,右邊是下半屏顯示。 在程序的開始處往DDRAM對應區域填寫如下內容: 第一行字符???第三行字符-->??開始顯示 第二行字符???第四行字符 第三行字符???第五行字符-->??即將顯示 第四行字符???第六行字符 這樣在開始卷動之后,就可以實現拼接的效果了。當卷動了16次之后,也就是第一行字符已經移出屏幕,屏幕顯示的DDRAM如下: 第一行字符???第三行字符 第二行字符???第四行字符 第三行字符???第五行字符 第四行字符???第六行字符 此時,屏幕接著滾動,顯示內容涉及3行的DDRAM,如下: 第一行字符???第三行字符-->??已顯示完畢 第二行字符???第四行字符 第三行字符???第五行字符 第四行字符???第六行字符-->??即將顯示 第一行DDRAM是空余的,下次就該往第一行寫數據,寫完后DDRAM內容如下: 第五行字符???第七行字符 第二行字符???第四行字符 第三行字符???第五行字符 第四行字符???第六行字符 經過又一次的16次卷屏之后屏幕顯示內容如下: 第五行字符???第七行字符-->??即將顯示 第二行字符???第四行字符-->??顯示完畢 第三行字符???第五行字符 第四行字符???第六行字符 然后接下來又卷動16次,筆者的算法是,在每一次卷動后寫一個字到顯示完畢的那一行中,卷完16次,顯示完畢的那一行也就寫完了。然后接下來的16次卷動又寫剛剛顯示完畢的那一行,而剛被寫完的那一行將在后面16次卷動中顯示。 原理就是如此,然后從中提取出規律,設計出算法,并編程實現: 下面是程序實現: void main(void){ ?unsigned char code ser[] = {"一一一一一一一一二二二二二二二二叁叁叁叁叁叁叁叁四四四四四四四四中國中國中國中國"}; //這是要顯示的字符串 //沒有檢測換行符功能,只能顯示一長串的漢字或一串ASCII碼字符。
?unsigned char i,addr,flag,hang,over,*ptdat;
//addr用于存儲寫入地址 //flag存儲卷動地址,名字沒取好! //hang存儲下一行要寫入數據的行號(1~4) //over記錄寫入的空字符數 //ptdat存儲字符串的指針 ? ?delay_12864(1000);
?initial_12864();
? ?ptdat = ser;
?over = 0;????//寫入空字符數
? //這里先把前面DDRAM中的前3行的字符數據寫入 //如果字符不足<=4行,那么不卷動,之后字符>4行才卷動 //一直到末行顯示完畢則停止卷動 ?wrtcom_12864(0x80); //寫屏幕第一行字符
?for(i = 0; i < 16; i++){
??if(*ptdat != '\0'){
???wrtdat_12864(*ptdat++);
??}else{
???wrtdat_12864(0x20);
???over++;
??}
?}
?wrtcom_12864(0x90); //寫屏幕第二行字符
?for(i = 0; i < 16; i++){
??if(*ptdat != '\0'){
???wrtdat_12864(*ptdat++);
??}else{
???wrtdat_12864(0x20);
???over++;
??}
?}
?wrtcom_12864(0x88);//寫屏幕第三行字符
?for(i = 0; i < 16; i++){
??if(*ptdat != '\0'){
???wrtdat_12864(*ptdat++);
??}else{
???wrtdat_12864(0x20);
???over++;
??}
?}
?wrtcom_12864(0x98);//寫屏幕第四行字符
?for(i = 0; i < 16; i++){
??if(*ptdat != '\0'){
???wrtdat_12864(*ptdat++);
??}else{
???wrtdat_12864(0x20);
???over++;
??}
?}
?ptdat = ptdat - 32;
?wrtcom_12864(0xa0);?//寫DDRAM第3行數據
?for(i = 0; i < 16; i++){
??if(*ptdat != '\0'){
???wrtdat_12864(*ptdat++);
??}else{
???wrtdat_12864(0x20);
???over++;
??}
?}
?ptdat = ptdat + 16;
?for(i = 0; i < 16; i++){
??if(*ptdat != '\0'){
???wrtdat_12864(*ptdat++);
??}else{
???wrtdat_12864(0x20);
???over++;
??}
?}
//前面的代碼是往DDRAM中寫如下內容: //第一行字符???第三行字符 //第二行字符???第四行字符 //第三行字符???第五行字符 //如果寫第5行時全為空,說明字符剛好4行,不卷動。 //此時第5行寫入16個0x20空字符,over用于記錄空字符個數。 //如果不足4行,則前面也將會寫入空字符,此時寫完了3行DDRAM后 //over的值必大于16,而只要over>15,就不卷動 ? ?wrtcom_12864(0x0c);???//開顯示
?if(over > 15){;} ??//顯示字符不足4行,不卷動
?else ?????//顯示字符大于4行,開啟卷動
?{
??hang = 4;??//接下來要寫DDRAM第4行數據
??flag = 0x01; //初始卷動地址為1
?
??while(1){
?
???switch(hang){???//設置寫入DDRAM的地址
????
????case 1: addr = 0x80; break;??//往地址變量中寫第一行首地址
????case 2: addr = 0x90;?break;??//往地址變量中寫第二行首地址
????case 3: addr = 0xa0;?break;??//往地址變量中寫第三行首地址
????case 4: addr = 0xb0;?break;??//往地址變量中寫第四行首地址
???}
?
???switch(hang){???//指出下一次要寫的行地址
????
????case 1: hang = 2; break;//第1行寫完了,下一行要寫第2行
????case 2: hang = 3;?break;//第2行寫完了,下一行要寫第3行
????case 3: hang = 4;?break;//第3行寫完了,下一行要寫第4行
????case 4: hang = 1;?break;//第4行寫完了,下一行要寫第1行??
???}

//后續代碼為往每一行寫數據,卷動一次寫一個字。

???ptdat = ptdat - 32;
???for(i = 0; i < 8; i++){??//寫一行中的前8個字符
????wrtcom_12864(0x34);?????//打開擴展指令
????wrtcom_12864(0x03);?????//允許輸入卷動地址
????wrtcom_12864(0x40 + flag++);??//設置卷動地址
????wrtcom_12864(0x30);?????//回到基本指令
????wrtcom_12864(addr + i);
????delay_12864(20000);
?
????if(*ptdat != '\0'){
?????wrtdat_12864(*ptdat++);???//寫入高字節
????}else{
?????wrtdat_12864(0x20);????//字符串結束則寫入空字符
????}?????????
????????????
????if(*ptdat != '\0'){
?????wrtdat_12864(*ptdat++);???//寫入低字節
????}else{
?????wrtdat_12864(0x20);????//字符串結束則寫入空字符
????}
?
???}
?
???ptdat = ptdat + 16;
???for(i = 8; i < 16; i++){??//寫一行中的后8個字符
????wrtcom_12864(0x34);?????//打開擴展指令
????wrtcom_12864(0x03);?????//允許輸入卷動地址
????if(flag == 64){flag = 0;}
????wrtcom_12864(0x40 + flag);???//設置卷動地址
????flag++;
????wrtcom_12864(0x30);?????//回到基本指令
????wrtcom_12864(addr + i);
????delay_12864(20000);
?
????if(*ptdat != '\0'){
?????wrtdat_12864(*ptdat++);???//寫入高字節
????}else{
?????over++;???????//寫完最后一行字符,需要再卷動16次才能顯示出來。
?????wrtdat_12864(0x20);??????//字符串結束則寫入空字符??
????}?????????
????????????
????if(*ptdat != '\0'){
?????wrtdat_12864(*ptdat++);???//寫入低字節
????}else{
?????wrtdat_12864(0x20);???????//字符串結束則寫入空字符
????}
???}
???if(over < 8){;}
???else {break;}
??}
?}
? while(1);
}
到這里所有的內容都介紹完了。 筆者愚鈍,花了一個星期的時間琢磨它,本文就算是給自己的一個交代吧!

總結

以上是生活随笔為你收集整理的12864液晶模块的详细使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

欧美激情视频一区 | 黄网av在线 | 国产精品入口66mio女同 | 欧美成人tv | 97**国产露脸精品国产 | 在线观看免费版高清版 | 亚洲二区精品 | 三级av免费观看 | 九九热国产| 五月开心六月伊人色婷婷 | 国产人成看黄久久久久久久久 | 国产在线观看h | 超碰97人人爱 | 日韩在线观看你懂得 | 少妇搡bbbb搡bbb搡aa | 婷婷精品国产一区二区三区日韩 | 91丝袜美腿 | 久青草视频 | 久久综合天天 | av在线超碰 | 69精品视频 | 91在线看免费 | 在线观看播放av | 欧美亚洲久久 | 久久新| 久久久久久久久久久久久久免费看 | 又黄又爽的视频在线观看网站 | 在线色亚洲 | 97av视频在线观看 | 91精品国产一区二区三区 | av中文字幕网站 | 国产高清在线一区 | 国产精品mm| 超碰97在线看 | 成年人黄色在线观看 | 日日干,天天干 | 五月开心六月伊人色婷婷 | 不卡精品 | 日韩成人在线一区二区 | 99精品在线| 最近乱久中文字幕 | 97在线观看视频 | 香蕉久草在线 | 欧美午夜寂寞影院 | 三级视频日韩 | 91看片淫黄大片91 | 成人影音av | 亚洲 欧洲 国产 精品 | 黄色aaaaa| 欧美精品乱码久久久久久 | 91刺激视频 | 欧美少妇xxx | 九九久久影院 | 国产a高清 | 国产精品9999久久久久仙踪林 | 国产黄色片久久久 | 中文字幕在线看视频 | 成人一区不卡 | 中日韩三级视频 | 久久久久欧美精品 | 在线观看视频免费大全 | 久草在线视频网站 | 在线黄色av | 91精品国产综合久久久久久久 | 99精品影视 | 最新av网址在线观看 | 美女视频黄频 | 黄色a在线观看 | 日韩中文在线电影 | 久保带人 | 不卡的av在线播放 | 349k.cc看片app | 黄色福利视频网站 | 日韩视频在线观看免费 | 久操视频在线播放 | av成人亚洲 | www.夜色321.com | 9999免费视频 | 欧美激情精品久久久久久免费 | 国产精品日韩高清 | 最新av电影网站 | av资源免费看 | 亚洲每日更新 | 国产成人在线免费观看 | 99久久视频| 视频一区在线免费观看 | 久久精品国产精品亚洲精品 | 中文字幕在线观看网 | 精品免费视频123区 午夜久久成人 | 亚州中文av | 久久人人看 | 精品久久一 | 日韩av免费在线电影 | 麻豆国产在线播放 | 97人人精品 | 免费观看一级特黄欧美大片 | 久久色在线观看 | 91在线免费观看网站 | 午夜少妇一区二区三区 | 99精品免费久久久久久久久 | 国产精品免费人成网站 | 欧美成人影音 | 色视频在线看 | 国产精品电影一区二区 | av成人在线观看 | 黄www在线观看 | 97av.com| 黄色在线视频网址 | av成人免费 | 国产精品va在线观看入 | 久久久久久久久久影院 | 日韩在线观看一区二区三区 | 日韩国产欧美在线播放 | 亚洲高清资源 | 久久久久免费网站 | 久久这里只有精品9 | 欧美乱淫视频 | 在线岛国av | 在线观看免费视频你懂的 | 成人在线小视频 | 911亚洲精品第一 | 国产伦精品一区二区三区照片91 | 国内精品久久久久影院一蜜桃 | 久久免费视频观看 | 人人干人人超 | 欧美精品少妇xxxxx喷水 | 国偷自产中文字幕亚洲手机在线 | 国产亚洲欧美在线视频 | 日韩丝袜视频 | 亚洲高清视频在线观看免费 | 天天激情在线 | 亚洲精品在线免费 | 最新日韩精品 | 精品一区二区久久久久久久网站 | 中文字幕在线观看播放 | 日韩电影在线观看一区二区三区 | 欧美精品亚州精品 | 午夜在线资源 | 激情五月婷婷综合 | 日韩在线国产精品 | 久久精品视频2 | 中文字幕乱在线伦视频中文字幕乱码在线 | 天天躁日日躁狠狠躁 | 精品91在线| www.天天操 | 国产精品福利无圣光在线一区 | 亚洲精品国产精品国自产在线 | 久久综合五月天婷婷伊人 | 久久久久久久久免费视频 | 毛片播放网站 | 91在线资源 | 91高清在线 | 日韩中文字幕第一页 | 精品一二区 | 美女网站色在线观看 | 亚洲综合一区二区精品导航 | 人人澡人人模 | av一区二区三区在线播放 | 国产丝袜| a级国产毛片 | 国内精品久久久久久久影视简单 | av噜噜噜在线播放 | 视频国产区| 色的网站在线观看 | 久久久久久久免费看 | 天堂网一区 | av超碰在线| 天天天天天天操 | 欧美精品亚洲二区 | 成人免费精品 | 91福利视频网站 | 久久你懂得 | 亚洲免费婷婷 | 日韩精品免费一线在线观看 | 亚洲禁18久人片 | 精品亚洲欧美无人区乱码 | 成年人免费在线 | 麻豆视频免费在线播放 | 二区视频在线观看 | 欧美日本一二三 | 91大片网站 | 日韩乱码中文字幕 | 最新中文字幕在线播放 | 欧美日韩另类在线 | 不卡av在线 | 美女很黄免费网站 | 国产一级片免费观看 | 天天干天天看 | 日本久久免费视频 | 天天综合五月天 | 免费日韩精品 | 狠狠狠狠狠狠狠 | 欧美性脚交| 久久经典视频 | 草免费视频 | 国产精品久久三 | 蜜臀av一区 | 日韩成人免费在线观看 | 亚洲精品在线观看免费 | 日韩精品中文字幕在线播放 | 五月开心激情网 | 国产最新视频在线观看 | 久久韩国免费视频 | 日韩一级电影网站 | 四虎欧美 | 国产精品久久久精品 | 色中射 | 久久久久久高潮国产精品视 | 久久综合久色欧美综合狠狠 | 青草视频网 | 69成人在线 | 国产不卡免费视频 | 在线看av的网址 | 成人超碰97| 成人中文字幕av | 国产福利专区 | 久久久国产一区二区三区 | 最新高清无码专区 | 免费人人干 | 精品亚洲免a | 国产精品黄色 | 丝袜网站在线观看 | 免费在线观看日韩欧美 | 欧美成人精品三级在线观看播放 | 久久精品一二三区白丝高潮 | 免费a网址 | 国产免费中文字幕 | 激情五月av | 久久国产成人午夜av影院宅 | 激情深爱.com| 四虎永久国产精品 | 中文字幕第一页av | 色视频网址 | 国产精品麻豆99久久久久久 | 毛片a级片 | 九色视频网 | 久久99精品一区二区三区三区 | 午夜性生活片 | bbb搡bbb爽爽爽 | 国产女人40精品一区毛片视频 | a在线免费| 亚洲精品国产欧美在线观看 | av丝袜美腿 | 91资源在线观看 | 日韩精品一区二区三区免费视频观看 | 午夜精品一区二区三区可下载 | 91丨porny丨九色 | 香蕉视频国产在线 | 精品美女久久久久 | 九九九九热精品免费视频点播观看 | 日韩视频免费观看高清完整版在线 | a黄色片| 久久久久久久久毛片精品 | 精品久久九九 | 亚洲国产经典视频 | 国产精品久久久久久久久免费看 | 精品国产电影 | 日韩成人在线一区二区 | 国产视频在线一区二区 | 欧美精品被 | 国产精品第52页 | 亚洲一级电影在线观看 | 99热.com | 国产专区欧美专区 | 国产福利91精品 | 国产精品久久久久久久久久免费 | 狠狠的日 | 在线免费av电影 | 国产超碰在线 | 色视频网站在线观看一=区 a视频免费在线观看 | 国内精品久久久久久久影视简单 | 在线观看国产一区二区 | 亚洲人成人99网站 | 欧美成人日韩 | 黄色免费网战 | 五月天狠狠操 | 欧美久久久 | 欧美在线视频二区 | 久久这里只有精品视频首页 | 国产精品美女网站 | 久久免费国产 | 亚州精品一二三区 | 亚洲国产精品一区二区久久hs | 久久国产精品99久久久久久丝袜 | 国产一区二区三区在线 | av在线中文 | 日韩精品一区二区三区中文字幕 | 国产精品mm | 亚洲三级精品 | 欧美精品黑人性xxxx | www.天天射 | 波多野结衣精品 | 色中色资源站 | 国产99久久九九精品免费 | 亚洲成人一二三 | 久草91视频 | 欧美美女一级片 | 色av男人的天堂免费在线 | 日本精品视频免费观看 | 在线观看一 | 国产一级片观看 | 日本免费久久高清视频 | 色婷婷久久久综合中文字幕 | 日韩av在线免费看 | 久久五月情影视 | 在线视频观看91 | 日韩久久久久久久久久 | 久久精彩免费视频 | 色婷婷综合久久久久中文字幕1 | 亚洲精品美女久久 | 国产精品青草综合久久久久99 | 成人一级片免费看 | 中文字幕免费在线看 | 亚洲欧洲成人精品av97 | aⅴ视频在线 | 日日干美女 | 狠狠色狠狠综合久久 | 麻豆影视网 | 亚洲精品国产精品国产 | 男女男视频 | 在线视频电影 | 丁香亚洲 | 成年人在线观看 | 996久久国产精品线观看 | 在线日本看片免费人成视久网 | 亚洲国产福利视频 | 亚洲1区 在线 | www夜夜操com | 97人人模人人爽人人喊网 | 国产无遮挡又黄又爽馒头漫画 | 天天操天天拍 | 91av电影 | 999久久久久久久久 69av视频在线观看 | 探花视频在线观看免费 | 免费看黄色91 | 亚洲免费av网站 | 国产精品毛片一区二区在线 | 成片免费 | 西西大胆免费视频 | 久久美女精品 | 国产成人黄色网址 | 欧美色图亚洲图片 | 欧美日韩视频一区二区 | 午夜av在线 | 九九爱免费视频在线观看 | 日本久久视频 | 亚洲国内在线 | 国产精品欧美一区二区三区不卡 | 九精品 | 国产视频在线一区二区 | 日韩在线观看的 | 91久久精| 91在线精品秘密一区二区 | 亚洲欧洲在线视频 | 亚洲精品美女久久久 | 亚洲精品18p | 国产日韩在线看 | 在线91色| 国产成人精品av在线观 | 国产99久久久精品 | 在线观看网站你懂的 | 亚洲欧美国内爽妇网 | 91视频午夜 | 久久国产精品二国产精品中国洋人 | 激情五月婷婷激情 | 色狠狠久久av五月综合 | 国产一区二区高清视频 | 亚洲欧美日韩精品一区二区 | 久久国产精品久久w女人spa | 婷婷丁香自拍 | 欧美亚洲专区 | 99国产视频 | 91久久黄色 | 亚洲三级影院 | 福利视频 | 国产在线无 | 9992tv成人免费看片 | 中文字幕资源网 | 伊人久久影视 | 激情综合色综合久久综合 | 亚洲区另类春色综合小说校园片 | 久久精品中文字幕一区二区三区 | 久免费视频 | 天天操天天摸天天射 | 中文在线资源 | 五月天国产 | 999成人国产 | 久久久伦理 | 国产一区欧美一区 | 天天草天天干天天 | 亚洲第一区在线播放 | 免费观看一级视频 | 精品一区二区日韩 | 婷婷综合视频 | 精品免费国产一区二区三区四区 | 成 人 黄 色 免费播放 | www日韩精品| 91精品国产乱码久久 | 亚洲国产成人精品在线观看 | 丁香久久激情 | 色亚洲网 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 欧美黄网站 | 91精品在线免费观看 | 久久免费视频这里只有精品 | 国产精品一区二区三区在线免费观看 | 在线观看一级片 | 免费看的av片 | 9999国产精品 | 麻豆视频成人 | 韩国精品福利一区二区三区 | 香蕉视频最新网址 | www五月天婷婷 | 亚洲va欧美va人人爽春色影视 | 日韩精品一区二区三区高清免费 | 久草精品视频在线看网站免费 | 日韩专区 在线 | 欧美xxxx性xxxxx高清 | 亚洲高清视频一区二区三区 | 天堂资源在线观看视频 | 一区二区三区在线播放 | 亚洲闷骚少妇在线观看网站 | 91正在播放 | 国产一区二区精品久久91 | 欧美日韩久久 | 国产成人一级 | 婷婷色狠狠 | 九九久久电影 | 久久久久久久久久久久亚洲 | 永久免费视频国产 | 97天天干| 久久久久久久久亚洲精品 | 国产麻豆精品传媒av国产下载 | 91在线视频免费播放 | 久久久国产精品成人免费 | 98涩涩国产露脸精品国产网 | 欧美日韩国产一区二区三区在线观看 | 日韩av片无码一区二区不卡电影 | av在线a| 一区二区三区精品在线视频 | 日本少妇高清做爰视频 | 一区二区三区高清不卡 | 日韩久久久久久久久 | 欧美国产视频在线 | 婷婷久操| 久久精品99国产精品亚洲最刺激 | 国产视频不卡 | 8x成人在线 | 国产第页 | 国产精品地址 | 黄色的网站免费看 | 操老逼免费视频 | 日韩成人免费观看 | 久久久久国产精品厨房 | 欧日韩在线视频 | 又黄又刺激视频 | 久热色超碰| 久久久久国产视频 | 91av视频免费观看 | 久草在线免费电影 | 国产精品美女久久 | 91一区啪爱嗯打偷拍欧美 | 99欧美| 日韩欧美一区二区三区免费观看 | 国产精品久久久久久99 | 精品在线观看一区二区 | 91成人免费 | 日韩久久精品一区二区 | 五月激情五月激情 | 伊人久久在线观看 | av免费电影在线 | 综合五月婷婷 | 国产成人一区二区三区电影 | 亚洲国产精品人久久电影 | 日韩欧美在线观看一区二区 | 欧美男男激情videos | 国产精品美女久久 | 97视频人人澡人人爽 | 成年人在线观看视频免费 | 久久久免费精品国产一区二区 | 91人人爽久久涩噜噜噜 | 麻豆精品国产传媒 | 中文字幕中文字幕在线中文字幕三区 | 午夜精品在线看 | 欧美另类色图 | 国产精品99久久久久久武松影视 | 国产精品一区二区久久久 | 四虎成人精品永久免费av九九 | 91九色porny蝌蚪视频 | 麻豆国产精品视频 | 97超碰人人澡人人爱学生 | 99色婷婷 | 伊人久久五月天 | 久久久久久片 | 欧美在线观看视频一区二区三区 | 天天色宗合 | 国产精品高潮呻吟久久久久 | 又色又爽又激情的59视频 | 91亚洲成人| 成人午夜影视 | 免费情缘| 91视频免费看 | 中文在线字幕免费观 | 欧美日韩xx | 亚洲精品国久久99热 | 国产免费观看高清完整版 | 日韩在线观看一区二区三区 | 日韩美在线观看 | 国产精品99久久99久久久二8 | 色丁香婷婷 | 日韩精品不卡在线观看 | 日本久久91 | 天天干天天干天天操 | 成人一级片免费看 | 激情综合色播五月 | 日韩毛片一区 | 97精品一区| 久草在线免费资源站 | 热久久免费视频 | 中文久久精品 | 欧美日韩精品在线免费观看 | 狠狠色香婷婷久久亚洲精品 | 99精品偷拍视频一区二区三区 | 手机在线永久免费观看av片 | 国产精品乱码久久久久 | 国产麻豆剧果冻传媒视频播放量 | 91成品人影院 | 亚洲视频久久久久 | 麻豆精品视频在线观看免费 | 91福利视频网站 | 日韩天堂在线观看 | 国产精品毛片久久久久久久 | 日韩欧美精品在线观看 | 午夜国产一区二区三区四区 | 国产在线精品二区 | 精品uu | 天天天天天天操 | 成人影视免费 | 国产精品不卡一区 | 伊人色播 | 麻花豆传媒mv在线观看 | 中文字幕一区二区三区久久蜜桃 | 久久av黄色| 欧美性大胆 | 久草9视频 | 色婷婷综合久久久中文字幕 | 亚洲成人免费观看 | 日韩电影一区二区三区在线观看 | 五月婷婷久草 | 日韩 精品 一区 国产 麻豆 | 丁香六月中文字幕 | 国产黄色av网站 | 女人魂免费观看 | 亚洲a在线观看 | 久久激情视频免费观看 | 91亚洲精品乱码久久久久久蜜桃 | 亚洲另类人人澡 | 天天操天天干天天操天天干 | 久久国产精品小视频 | 欧美性久久久久久 | 日日夜夜天天干 | 日本黄色免费电影网站 | 国产视频在线播放 | 日日操夜| 精品久久久久久久久久久久久久久久 | 久久久久久久久久久国产精品 | 欧美成年人在线观看 | 午夜精品福利一区二区三区蜜桃 | 中文字幕中文 | 激情视频二区 | 91精品人成在线观看 | 国产高清日韩 | 欧美色图88 | 在线激情网 | 操高跟美女 | 日韩av手机在线看 | 免费情缘 | 美女福利视频网 | 最近中文字幕完整高清 | 麻豆视频在线免费观看 | 午夜在线观看一区 | 国产精品手机在线播放 | 久久你懂得 | 福利视频一区二区 | 啪啪资源| 免费观看av | 欧美日韩视频在线播放 | 狠狠88综合久久久久综合网 | 高清av中文在线字幕观看1 | 国产精品99久久久久久武松影视 | www.888av | 久久久国产精品视频 | 成人午夜在线电影 | 国产理论影院 | 亚洲永久精品一区 | 国产精品久久久久久高潮 | 日韩av电影免费观看 | 日韩欧美精品在线 | 精品国产一区二区三区久久久 | 国产美女久久久 | 香蕉视频一级 | 亚洲国产日韩欧美 | 成人av免费电影 | 中国一级片在线 | 黄网站色 | 日韩av一区二区在线影视 | 久久久久黄 | 91视频91蝌蚪 | 99精品视频播放 | 亚洲高清在线视频 | 91看片淫黄大片在线播放 | 欧美一级特黄高清视频 | 成人在线观看资源 | 99久久精| 伊在线视频 | av片在线观看 | 国产精品不卡视频 | 亚洲精品在线电影 | 人人舔人人插 | 久99久精品视频免费观看 | 欧美最猛性xxxxx亚洲精品 | 日本一区二区高清不卡 | 99r在线视频 | 成人av片在线观看 | 亚洲国产激情 | 91精品视频播放 | 国内精品久久久久久久久久 | 精品在线观看免费 | 精品久久片| 丰满少妇在线观看资源站 | 日本在线观看一区 | 久久综合久色欧美综合狠狠 | 亚洲人片在线观看 | 最近日本韩国中文字幕 | 丁香5月婷婷 | 蜜桃av久久久亚洲精品 | 精品亚洲免费 | 欧美一级久久久 | av品善网| 成人污视频在线观看 | 一区在线观看 | 欧美激情视频三区 | 亚洲va欧美va人人爽春色影视 | 日日干激情五月 | 亚洲午夜精品久久久久久久久久久久 | 最近中文字幕完整高清 | 久久福利精品 | 国产精品午夜8888 | 久久伊人精品一区二区三区 | 欧美激情综合五月色丁香 | 国产高清免费视频 | 国产视频一区在线免费观看 | 1000部18岁以下禁看视频 | 婷婷99| www免费视频com━ | 99热日本 | 99色在线视频 | 综合在线观看色 | 9热精品 | 欧美激情另类 | 久久黄色片 | 亚洲 成人 一区 | 91精品区| 精品免费久久 | 成人免费观看在线视频 | 99re国产视频 | www.99热精品 | 欧美污在线观看 | 国产黑丝一区二区三区 | 国产精品一区免费看8c0m | 草免费视频 | 中国一 片免费观看 | www五月| 欧美久久综合 | 一区二区三区电影 | 五月婷婷六月丁香 | 五月天婷婷丁香花 | 国产免费久久久久 | 亚洲污视频| 四虎免费在线观看视频 | 一区二区三区在线看 | 久久国产精品99国产 | 精品久久久久一区二区国产 | 超碰夜夜 | 精品久久久久一区二区国产 | 免费av网站在线看 | 国产一区二区不卡在线 | 亚洲国产美女精品久久久久∴ | 日韩a在线播放 | 国产99久久 | 免费成视频 | 亚洲六月丁香色婷婷综合久久 | 国产精品久久久久免费观看 | 狠狠撸电影 | 婷婷中文字幕综合 | 午夜精品在线看 | 999在线视频| 欧美在线观看视频 | 在线观看视频国产一区 | 亚洲日b视频 | 久久影院午夜论 | 婷婷久久网站 | 日韩在线观看a | 久久一视频 | 精品国产一区二区三区不卡 | 美女网站一区 | 伊人成人久久 | av黄色免费在线观看 | 国产精品精品久久久久久 | 日本精品视频一区二区 | 国产成人一区二区在线观看 | 视频国产在线 | www.色五月 | av资源免费在线观看 | 91亚色免费视频 | 亚洲五月婷 | av高清免费 | 深爱开心激情 | 国产日韩在线观看一区 | 五月婷激情 | 91免费观看国产 | 国产+日韩欧美 | 久久99视频 | 免费在线黄网 | 久久精品看片 | 久久久污| 亚洲成人精品影院 | 国产99久久九九精品 | 91精品久久久久久久久久入口 | av动态图片| 国产成人精品一区二区 | 日韩sese| 国产在线精 | 久久福利 | 美女国产网站 | 免费高清男女打扑克视频 | 99视频偷窥在线精品国自产拍 | 黄色大片免费播放 | 国产69久久精品成人看 | 成年人免费在线观看网站 | 99久久视频| 日韩精品91偷拍在线观看 | 亚洲丁香久久久 | 最近中文字幕视频完整版 | 色播六月天 | 色婷婷中文 | 97免费| 免费看片网址 | 欧美精品久久久久久 | 五月激情亚洲 | 99久久精品国产免费看不卡 | 在线观看亚洲免费视频 | 国产在线观看免 | 91完整视频 | 国产福利一区二区三区在线观看 | 在线观看国产一区二区 | 粉嫩一二三区 | 国产一区二区高清 | 久久精品久久精品久久精品 | 日韩中文字幕a | 欧美在线视频一区二区三区 | 天天天综合网 | 日韩欧美在线免费 | 亚洲视频分类 | 国产日产精品久久久久快鸭 | av黄在线播放 | 亚洲精品国偷拍自产在线观看蜜桃 | 91av在线精品| 国产在线国偷精品产拍 | 日韩精品一区二区在线观看视频 | 国产一区二区三区视频在线 | 亚洲精品视频免费 | 日韩小视频 | 香蕉视频网站在线观看 | av.com在线 | 国产精品久久久久一区二区三区共 | 91黄在线看 | 在线观看视频免费播放 | 91精品国产91 | 日韩乱码在线 | 81国产精品久久久久久久久久 | 国产成人久久精品77777综合 | 亚洲国产精品影院 | 网址你懂的在线观看 | 亚洲五月综合 | 91av综合 | 欧美久久久久 | 国产在线v | 欧美精品乱码久久久久久 | 午夜国产福利在线 | 亚洲区视频在线观看 | 日韩电影在线视频 | 免费在线看v | 97在线播放视频 | 国产一区二区三区高清播放 | 99re亚洲国产精品 | 欧美激情视频一区 | 狠狠色丁香婷婷综合久小说久 | 国产一二三四在线观看视频 | 九九综合久久 | 国产成人亚洲在线观看 | 国模精品一区二区三区 | 911香蕉视频 | 国产精品va在线 | 超碰人人在线观看 | 亚洲精品麻豆 | 成人av手机在线 | 亚洲欧美日韩在线一区二区 | 欧美成年人在线观看 | 丁香激情综合久久伊人久久 | 亚洲成人国产精品 | 成人四虎 | 久久高清 | 成人一区在线观看 | 麻豆av一区二区三区在线观看 | 亚洲爱av | 亚洲区色| 久草在线视频看看 | 在线免费观看视频一区二区三区 | 久久久久久高潮国产精品视 | 五月开心激情网 | 日韩免费中文字幕 | 人人网人人爽 | 久久天天躁狠狠躁亚洲综合公司 | 久久高清视频免费 | 国产成人精品综合久久久 | 日韩免费在线网站 | 亚洲天堂网在线观看视频 | 九九三级毛片 | 久久久久 免费视频 | 狠狠狠的干 | 波多野结衣精品视频 | 久久爱导航| 精品久久久久一区二区国产 | 在线观看视频一区二区三区 | 中文字幕一区二区三区久久 | 欧美日韩免费一区二区三区 | 黄色精品网站 | 成人免费观看a | 99久热在线精品视频 | 91麻豆文化传媒在线观看 | 96精品高清视频在线观看软件特色 | 草在线视频 | 青青啪 | 玖玖视频精品 | 久久综合久久综合久久综合 | 成人理论在线观看 | 在线看av网址 | 综合国产在线 | 久草91视频 | 一级黄色毛片 | 欧美一级看片 | av高清免费在线 | 99视频| 亚洲国产精品va在线看 | 人人爽人人澡人人添人人人人 | 成人在线电影观看 | 欧美韩日视频 | 激情久久网 | 精品国产成人av在线免 | 国产午夜精品免费一区二区三区视频 | 天天综合天天做 | 日韩综合在线观看 | 国产福利在线免费 | 中文在线资源 | 精品国产伦一区二区三区观看方式 | 丰满少妇对白在线偷拍 | 免费人成在线观看网站 | 91欧美日韩国产 | 中文字幕一区二区三区在线观看 | 免费av片在线 | 亚洲精品午夜久久久久久久久久久 | 国产黄网站在线观看 | 九九九在线观看视频 | 精品av网站 | 人人射av| 日韩精品中文字幕有码 | 国产精品 国内视频 | 在线观看免费一区 | 国产99久久久久 | 2023亚洲精品国偷拍自产在线 | 人人精品久久 | 在线观看黄色的网站 | 色婷婷综合五月 | 日本视频久久久 | 四虎影视成人永久免费观看视频 | 免费在线观看成人小视频 | av在线播放中文字幕 | 伊人亚洲综合网 | 99色国产| 午夜精品久久久久久久久久 | 夜夜摸夜夜爽 | 色综合久久88色综合天天6 | 日韩午夜高清 | 欧美日韩视频免费看 | av黄色免费看 | 久久久视频在线 | 九九热只有精品 | 国产一级特黄毛片在线毛片 | 中文字幕韩在线第一页 | 制服丝袜欧美 | 日日操天天操夜夜操 | 亚洲欧美一区二区三区孕妇写真 | 成人av电影网址 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 久久99网 | 亚洲欧美日韩一二三区 | 国产精品xxxx18a99| 97精品国产一二三产区 | 天天搞夜夜骑 | 99热这里只有精品免费 | 免费a视频在线观看 | 亚洲一区精品人人爽人人躁 | 久久视频精品在线 | 亚洲最新合集 | 亚洲第一区在线观看 | 一级成人免费视频 | 日本最新一区二区三区 | 亚洲成人黄色在线 | 色噜噜在线观看视频 | 天天操天天拍 | av免费观看网站 | 国产在线视频资源 | 成人h视频在线播放 | 成年人免费电影 | 91在线小视频 | 在线观看中文字幕一区二区 | 日韩特黄一级欧美毛片特黄 | 97国产小视频| 久久中国精品 | 国产 视频 久久 | 国产精品 中文在线 | 国产探花 | 97碰在线| 久久久久婷 | 久久婷婷一区二区三区 | 天天操天天射天天 | 高清av免费观看 | 视频在线亚洲 | 日韩欧美69 | 九九激情视频 | 日韩色在线观看 | 欧洲精品码一区二区三区免费看 | 97超碰人人澡人人爱学生 | 在线免费日韩 | 成人永久视频 | 欧美黑人xxxx猛性大交 | 欧美日韩破处 | 91精品视频免费看 | 天天夜夜操 | 国产精品国产三级国产不产一地 | 国模精品在线 | 97夜夜澡人人双人人人喊 | 欧美在线视频精品 | 亚洲 成人 一区 | 999电影免费在线观看 | 最近中文字幕视频完整版 | 成人理论在线观看 | 久久久国产高清 | 黄色三级免费网址 | 又黄又爽又色无遮挡免费 | 国产免费a| 欧美性脚交 | 亚洲理论视频 | 六月激情久久 | 成人小视频在线观看免费 | 国产精品午夜8888 | 激情综合亚洲精品 | 黄色www在线观看 | 免费性网站 | 亚洲激情电影在线 | 在线欧美中文字幕 | 日韩中文在线电影 | 成人在线免费看视频 | 在线国产激情视频 | 久久久久久麻豆 | 五月婷婷中文网 | 国产视频资源 | 午夜久久久久久久久久影院 | 欧美亚洲国产一卡 | 日本在线中文在线 | 91精品久久久久久久久久入口 | 中文字幕不卡在线88 | 国产婷婷| 久久精品亚洲 | 国产视频日本 | 很黄很黄的网站免费的 | 久久久国产影院 | 狠狠操操 | 天天操导航 | 久久女同性恋中文字幕 | 国产高清久久 | 国产精品免费观看网站 | 啪啪午夜免费 | 日韩丝袜在线观看 | 欧美日韩国产一区二区在线观看 | 成人午夜在线观看 | 三级黄色在线观看 |