2019年5月9日 星期四

Intel 8080-like and Motorola 6800-like interfaces的LCD控制介面

近日由於要開發某測試器,使用COG LCD display,因此寫個筆記,後續自己用STM32寫driver來控制吧!

目前選用的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介面來控制,速度就快多了!

在COG或其它點矩陣的LCD常用介面為6800 or 8080介面,簡單來說就是8bit(D7~D0)資料寬度的並列介面,並用3個控制RS. E. R/W(6800)或RS. RD. RW(8080)來控制讀寫資料或讀寫Instruction,
下圖為參考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,就可以顯示圖形了!



二維陣列指標的表示方法