Ⅰ 為什麼51單片機匯流排控制LCD12864的時候P0口可不要上拉電阻,而用位操作的時候必須接上拉
P0僅作為地址讀寫時,不用加上拉電阻;但如果P0同時作為I/O口使用,則要加上拉電阻。不過,現在很多單片機(如STC等),它可以通過軟體設置其I/O口的為弱上拉、強上拉或高阻模式,針對這類單片機則可以不加上拉電阻。
Ⅱ 【51單片機】LCD12864顯示字元和圖片
本次所使用的顯示屏為AMPIRE 128x64 Graphical LCD with KS0108 controllers。它自身並不帶字型檔,因此,如果想要在顯示屏上顯示字元,必須通過取模軟體自製字型檔。
AMPIRE12864顯示屏由左右兩個半屏組成,分別由兩片控制器控制,控制引腳為CS1和CS2。每個控制器內部有64*64位的RAM緩存區,每個半屏有8頁、64列,每頁包含8行。一個中文字元的顯示需要16*16個點,因此整個顯示屏最多可顯示32個中文字元,每兩頁顯示一行,共可顯示4行。
AMPIRE12864的控制指令包括:
1、顯示開關設置:將D設置為0可以關閉顯示(指令為0x3F);設置D為1則可以開啟顯示(指令為0x3E)。顯示開關不影響顯示存儲器的內容。
2、顯示起始行設置:通過設置L5~L0來指定顯示起始行,可表示1-64行(當L5~L0為0時,指令為0xC0)。執行此命令後,設置的行將顯示在屏幕第一行。顯示起始行存儲在Z地址計數器中,具有循環計數功能,每掃描一行就自動加一。通過定時長、等間距地修改此指令,可使顯示屏內容呈現向上或向下平滑滾動的顯示效果。
3、頁面地址設置:使用P2~P0來指定頁地址,可表示1-8頁(當P2~P0為0時,指令為0xB8)。該指令規定了後續讀寫操作將在哪一頁進行,除非重新設置該地址,否則均在該頁進行。頁地址存儲在X地址計數器中,讀寫數據對頁地址沒有影響。
4、列地址設置:通過設置C5~C0來指定列地址,可表示1-64列(當C5~C0為0時,指令為0x40)。執行該指令後,後續的讀寫操作將在該列進行。列地址存儲在Y地址計數器中,具有自動加一功能,每一次讀寫數據後自動加一。進行連續讀寫時,列地址只需設置一次即可。
5、讀取狀態字:通過檢查BUSY、ON/OFF和RESET來判斷控制器的狀態。BUSY=1表示控制器正在處理指令或數據,不再接受除讀狀態字以外的操作,單片機需要等待;BUSY=0表示控制器准備就緒,可接受指令。ON/OFF=1表示顯示狀態為關狀態;ON/OFF=0表示顯示狀態為開狀態。RESET=1表示顯示屏處於復位狀態;RESET=1表示顯示屏處於正常工作狀態。
6、讀寫數據:寫指令時,將RS設置為0,R/W設置為0,D0~D7為指令碼,E在下降沿時寫入指令。寫數據時,將RS設置為1,R/W設置為0,D0~D7為數據,E在下降沿時寫入數據。讀狀態時,將RS設置為0,R/W設置為1,E在下降沿時讀取顯示屏狀態,D0~D7為狀態碼。
為了在AMPIRE12864上顯示字元和圖片,需要通過取模軟體提取字元和圖片的字模。提取字元和圖片字模的過程如下:
1、首先,將圖片使用Windows自帶的畫圖軟體打開,調整圖片大小(例如64x64像素),並另存為單色點陣圖(bmp格式)。
2、然後,打開取模軟體(如PCtoLCD2002),導入保存的單色點陣圖圖像,設置好字模生成選項後,點擊生成字模即可。
(註:AMPIRE12864的像素點在低電平時顯示藍色,高電平顯示黑色,因此在取模時應選擇陽碼;取模方式可選擇列行式;每行顯示點陣數據根據圖像大小來選擇,這里選擇64。)
對於漢字字模提取,應遵循先左後右、先上後下的順序提取字模。一個漢字需要16*16點,占據2頁、16列,因此應先提取這一頁的16列數據,再提取下一頁的16列數據,形成一個漢字的字模數據,顯示時按照順序寫入對應DDRAM地址即可。
最後,下面是一個簡單的示例代碼,用於說明如何在AMPIRE 128x64 LCD上顯示字元和圖片:
main.c代碼:
LCD12864.c代碼:
LCD12864.h代碼:
Ⅲ LCD12864的屏總是在閃,我是用51單片機做的,屏帶字型檔,補充里是整個程序,怎麼解決謝謝
看了你的程序,問題在while裡面。沒必要循環初始化你的LCD,將初始化程序放到主函數中。你的顯示函數中也已經包含了清屏指令,不需要在while裡面再次加入清屏指令。如果一定要用,建議你在所有清屏指令後加入的延時夠大。清屏指令過多,延時太少的話,相當於清屏之後又寫入,再清屏再寫入,你看到的就是閃了。