目前選用的COG LCD使用Sitronix的ST7565P控制器,有三個控制LCD的介面可以讓MCU來讀寫,分別為6800/8080/SPI-4,由於SPI-4為串列介面,必須為8bit依序傳送,雖然LCD更新顯示不需要太快,但拖太久也不好,假設SPI跑1MHz,猜測送完1byte至少花10us以上,以我選擇的COG LCD為128X64,總共有8 pages的顯示資料,每個page有128 bytes,總共需要1024 bytes,若使用SPI更新全畫面需要10ms,基於耗電考量,改使用Parallel介面來控制,速度就快多了!
下圖為參考ST AN2790 Table 2的資料,
ST7565P datasheet裡面有些不一樣的地方是RS pin命名為A0, A0 = 0 for instruction read or wirte; A0 = 1 for data read or write,其他兩個控制pin分別為RD(E)及RW(R/W),兩個pin讓6800與8080共用,選擇6800則使用E(Enable = 1)及RW(Read = 1, Write = 0);選擇8080則使用RD及RW,兩者皆為Low active
簡單來說6800與8080之間的差異在於控制這兩pin的方式, 6800使用E(Enable)及R/W控制,讀寫時E須為1,且以R/W來區分Read(1) or Write(0); 而8080則使用RD及RW控制讀或寫,但沒有Enable控制,請注意觀察上表的控制pin可能會有上標線,代表是Low active,由於這邊文字無法打成上標線,因此須注意一下!
以我本人來說,覺得6800比較直觀,用R/W控制讀或寫,且用Enable控制是否要寫入
// 6800 Interface
void Write_data(unsigned char data)
{
LCM_RS = 1; // 將寫入LCD DDRAM
LCM_RW = 0; // Writes display data ram
LCM_PORT=data; // 將資料寫入8bit寬度的bus
LCM_ENABLE = 1; // Enable write
_nop_(); // wait for lcd controller data latch
LCM_ENABLE = 0; // Disable write
}
void Write_command(unsigned char command)
{
LCM_RS = 0; // 將寫入instruction register
LCM_RW = 0; // Writes instruction register
LCM_PORT = command; // 將command寫入8bit寬度的bus
LCM_ENABLE = 1; // Enable write
_nop_(); // wait for lcd controller data latch
LCM_ENABLE = 0; // Disable write
}
上面兩個副程式分別用來寫入DDRAM或Instruction,只要有這兩個基本概念,再將兩個副程式用來應用設計就可以成為initialize LCD的程式及寫入圖形的程式,LCD的dot matrix,就可以顯示圖形了!