一文搞懂8080協議
什么是 8080 協議?8080 時序也叫因特爾總線,一般mcu(mpu)模式的lcd上。Inter總線控制線有四根:RD:寫使能WR:讀使能DC(RS):數據/命令CS:片
什么是 8080 協議?
8080 時序也叫因特爾總線,一般mcu(mpu)模式的lcd上。
Inter總線控制線有四根:
- RD:寫使能
- WR:讀使能
- DC(RS):數據/命令
- CS:片選
LCD控制及傳輸數據所需要的管腳:
| 管教名稱 | 功能描述 |
|---|---|
| CS | 片選信號 |
| DC(RS) | 數據或者命令管腳(1:數據讀寫,0:命令讀寫) |
| WR | MCU(MPU)向LCD寫入數據控制線,上升沿有效,寫數據時 RD拉高 |
| RD | MCU (MPU) 從LCD讀數據控制線,上升沿有效,讀數據時,WR拉高 |
| DB[x:0] | 8/9/16/18bit 雙向數據總線,一般8位MCU接口用的比較多 |
| RST | 硬件復位 LCD 信號 |
| BL | LCD背光信號 |
| IM2/IM1/IM0 | 接口控制. IM2=0 串行,IM2 =1,IM1=0,IM0=0,6800/8080 8bit 并行接口;IM1=0,IM0=1,6800/8080 16bit 并行接口;IM1=1,IM0=0,6800/8080 9bit 并行接口;IM1=1,IM0=1,6800/8080 18bit 并行接口; |
| P68 | 6800/8080 選擇。0 表示8080,1 表示6800 |
讀寫數據
讀時序圖
通用時序圖如下:

讀數據的過程:
- CS 拉低,選中
- DC/RS 為高(讀數據)
- WR 為高,禁止寫
- 在RD的上升沿,讀線上的數據(D[0:7]),假設8位 8080并口
- CS 拉高,取消片選
偽代碼:
LCD_CS = 0; //開始片選 nLCD_DC = 1; //讀數據 nLCD_WR = 1; //禁止寫 nLCD_RD = 0; //開始讀ndata = DATAIN();//讀取數據 nLCD_RD = 1; //結束讀nLCD_CS = 1; //結束片選
寫入數據
寫時序圖

寫數據的過程:
- CS為低,選中
- RD為高, 禁止寫
- DC/RS為高(寫數據,寫命令拉低)
- 在WR的上升沿,使數據寫入到 驅動 IC 里面
- CS為高,結束一組數據讀取
偽代碼:
LCD_CS = 0; //開始片選 nLCD_RD = 1; //禁止讀 nLCD_DC = 1; //寫數據 nDATAOUT(Data); //輸出數據 ,先準備好數據,然后上升沿一次性更新到lcdnLCD_WR = 0; //寫入開始 nLCD_WR = 1; //寫入結束 nLCD_CS = 0; //結束片選
實列演示:GPIO 模擬讀寫時序
以GC9106 這塊LCD 驅動IC為例,介紹一下,如何根據datasheet,去模擬讀寫操作,方便后續遇到新的屏幕,可以快速入手。事實上,大部分時候,我們的主控一般都會存在lcd控制器,支持讀寫操作,只需要配置寄存器即可。不過通過GPIO模擬,對整個過程會有更新的認識。
第一步:根據硬件確認屏幕所接接口,確認引腳及協議:以8080 8位并行為例
協議:8080時序
引腳:LCD_CS、LCD_RD、LCD_WR、LCD_DC、LCD_Data[7:0]
第二步:根據 datasheet 閱讀讀寫時序
- 讀時序

驅動IC會在下降沿產生數據,主控(MCU)在上升沿從D[7:0] 讀數據

整個讀數據的過程,分為兩步:寫入一個command address, 讀數據。
寫入cmd:

讀數據:根據時序圖,真正讀數據的過程中,第一個周期的數據是無效的,這個可以很好的解釋command列表中,為何第一次數據都是dummy data

- 寫時序

主控(MCU)會在下降沿產生數據,驅動IC在上升沿從D[7:0] 讀數據

整個寫數據的階段分為兩個:寫命令和寫數據,唯一的區別是DC不一樣。

第三步:查看command列表。這里以讀ID為列(04H)


- 閱讀command信息
- 根據timing,先寫入一個cmd(04H)
- 緊接著,讀四次數據。
- 舍棄第一個數據(dummy data)
- 注意:初始狀態和初始值。如果讀不出來數據,可能是上電時序的問題,這個時候可以通過硬件GPIO 復位一下lcd,然后在讀取數據。
write_cmd(0x04);nread_data(); //dummy datanID0 = read_data();nID1 = read_data();nID2 = read_data();
第四步:模擬基本讀寫時序操作。根據通用8080協議時序即可
此處用偽代碼表示思路即可:
static void write_lcd_dc(int isCmd, unsigned int value)n{n LCD_CS = 0; /* 拉低 */n LCD_RD = 1; /* 禁止讀 */n if (isCmd == 1) {n LCD_DC = 0; /* 拉低 寫命令 */n } else {n LCD_DC = 1; /* 拉高 寫數據 */n }n data_out(value); /* 準備數據 */n LCD_WR = 0; /* 拉低 */n delay10us(); /* 上升沿更新數據*/n LCD_WR = 1; /* 拉高*/n delay10us();n LCD_CS = 1; /*拉低, 取消片選*/n}nnstatic void data_out(unsigned int value)n{n /* 假設 data[0:8] 在一組GPIO上,并且連續n * 設置data[0:8] 為輸出狀態,切默認都輸出0n */n int i = 0;n for (int i = 0; i < 8; i++) {n LCD_Data[i] = ((value >> i) & 0x01);n }n}nnstatic unsigned int read_lcd_data()n{n int ret = 0;n LCD_CS = 0; /* 拉低,選中 */n LCD_WR = 1; /* 拉高, 禁止寫 */n LCD_DC = 1; /* 拉高,表明將要讀數據 */n LCD_RD = 0; /* 拉低, 開始讀數據*/n delay10us();n ret = data_In(); /* 讀數據*/n delay10us();n LCD_RD = 1;/* 拉高, 結束讀數據 */n delay10us();n LCD_CS = 1; /* 取消片選*/n n return ret;n}nnstatic unsigned int data_in()n{n int ret = 0;n /* 假設 data[0:8] 在一組GPIO上,并且連續n * 設置data[0:8] 為輸入狀態n */n int i = 0;n for (int i = 0; i < 8; i++) {n ret |= (gpio_get_value(LCD_Data[i]) << i);n }n n return ret ;n}
總結
本文介紹了8080協議的基礎時序,以及通用的讀寫操作,旨在了解學習8080協議。然后通過實際的lcd 驅動IC 應用舉例,介紹如何閱讀 lcd datasheet.通過GPIO 模擬讀寫操作,達到對整個協議的理解。
事實上,大多數情況下,我們不需要親自模擬時序,調試一款新屏時,一般通過配置lcd控制器,會自動模擬時序,只需要將原廠的setting,按照對應的規則,加入到驅動中即可。當然,也可以通過gpio模擬讀寫,將lcd的setting,通過自己模擬的讀寫接口,設進去。








