有片很早以前買的Nokia5110 LCD一直在紙箱里吃灰. 可能是買其它配件時送的? 沒有合適的用途一直扔在那裡, 偶爾見到總會想什麼時候有空給它點一下. 外觀長這樣. 其實市面上這種模塊有幾個不同的版本, 另一種版本是上下有兩排排針, 方便不同的PCB佈局, 功能是一樣的. 單色LCD, 84x... ...
目錄
- STC8H開發(一): 在Keil5中配置和使用FwLib_STC8封裝庫(圖文詳解)
- STC8H開發(二): 在Linux VSCode中配置和使用FwLib_STC8封裝庫(圖文詳解)
- STC8H開發(三): 基於FwLib_STC8的模數轉換ADC介紹和演示用例說明
- STC8H開發(四): FwLib_STC8 封裝庫的介紹和使用註意事項
- STC8H開發(五): SPI驅動nRF24L01無線模塊
- STC8H開發(六): SPI驅動ADXL345三軸加速度檢測模塊
- STC8H開發(七): I2C驅動MPU6050三軸加速度+三軸角速度檢測模塊
- STC8H開發(八): NRF24L01無線傳輸音頻(對講機原型)
- STC8H開發(九): STC8H8K64U模擬USB HID外設
- STC8H開發(十): SPI驅動Nokia5110 LCD(PCD8544)
Nokia5110 LCD
有片很早以前買的Nokia5110 LCD一直在紙箱里吃灰. 可能是買其它配件時送的? 沒有合適的用途一直扔在那裡, 偶爾見到總會想什麼時候有空給它點一下.
外觀長這樣. 其實市面上這種模塊有幾個不同的版本, 另一種版本是上下有兩排排針, 方便不同的PCB佈局, 功能是一樣的.
單色LCD, 84x48像素, 帶4顆藍色LED燈珠作為背光. 顯示晶元是Philips PCD8544.
因為是Nokia5110手機的顯示屏, 所以一般都叫它Nokia5110 LCD. 在2014年大屏手機還沒流行的年代, 這是個相當不錯的顯示輸出設備, 相對於1602和2004LCD, 體積小解析度高, 便宜量又足.
現在遍地12864的LCD/OLED, 還有解析度更高的彩色LCD可以選擇, 這個模塊也就沒什麼人用了.
PCD8544
- 菲利普生產的單片低功耗CMOS LCD驅動控制器晶元, 用於驅動84x48像素的LCD
- 介面是SPI
- 顯示記憶體 = 6 banks x 84 segments x 8 bits = 4032 bits = 504位元組
- Each bank contains 84 columns/segments (from 0 to 83)
- Each column can store 8 bits of data (from 0 to 7)
Pin腳
- RST 複位
- CE 片選, CS
- DC 數據/指令選擇, D/C
- DIN SPI數據, MOSI
- CLK SPI時鐘線
- VCC 電源, 這個模塊相容3.3V和5V, 如果沒有標識建議使用3.3V
- BL 背光
- GND 接地
指令說明
PCD8544 的指令很少, 比 ST7567還少. 顯示機制和 ST7567 基本上是一樣的.
寫數據和寫命令
使用D/C pin控制, 高電平表示寫入數據, 低電平表示寫命令
功能設置
Function set: 0x20, 疊加下麵的參數
- Power down control: 0x04 關機模式
- Entry mode: 0x02 定址方式, 設置後變成垂直定址, 先下再右; 正常模式是先右再下, 一般使用正常模式
- Extended instruction set: 開啟擴展指令. 開啟後可以修改溫度參數, 電壓基準偏移, 顯示電壓, 後面兩個用於調節LCD的對比度
顯示控制
Display control: 0x08, 疊加下麵的參數
- Display blank 顯示空白: 0x00
- Normal mode 正常顯示: 0x04
- All display segment on 顯示全部: 0x01
- Inverse video mode 反顯模式: 0x05
坐標定位
PCD8544的顯示結構
只能定位到位元組, 定位後寫入數據, 會按設置好的定址方式往下寫
- 設置x坐標: 0x80 疊加 [0x00, 0x84) 之間的值
- 設置y坐標: 0x40 疊加 [0x00, 0x06) 之間的值
擴展指令
下麵的命令必須在開啟擴展指令後執行才有效
- Temperature control 溫度因數, 0x04 疊加取值 [0x00, 0x03]
- Bias system 電壓基準控制, 0x10 疊加取值 [0x00, 0x07]
- Set Vop 顯示電壓控制, 0x80 疊加取值 [0x00, 0x7F]
這三個指令需要說明一下, 設置不當可能會顯示全黑或者完全無顯示
- 溫度因數可以不設置, 使用預設
- 電壓基準設置得越大, 最後的實際顯示電壓越高, LCD顯示部分就越黑, 如果屏幕無顯示, 可以先調成0x07試試
- 顯示電壓高低和設置的值成正比, 值越高實際顯示電壓越高, LCD顯示部分就越黑
使用 STC8H 進行測試
以下使用 STC8H3K32 和 FwLib_STC8 進行測試
接線
上電前一定要檢查一下VCC和GND是否正確, 電壓是否正確
P37 -> RES, RESET
P36 -> DC, A0
P35 -> CE, Chip Select
P32 -> SCK, SCL, CLK, Clock
P12 -> BL, Backlight
P34 -> MOSI, Din
GND -> GND
3.3V -> VCC
代碼
代碼可以從GitHub或者Gitee下載
- GitHub: FwLib_STC8/tree/master/demo/spi/pcd8544_nokia5110_lcd
- Gitee: FwLib_STC8/tree/master/demo/spi/pcd8544_nokia5110_lcd
初始化
// 重置
PCD8544_Reset();
// 設置對比度, 如果顯示太淡或太深, 需要自行調整
PCD8544_SetContrast(0x06, 0x20);
// 設置為正常顯示模式
PCD8544_SetDisplayNormal();
開啟和關閉背光
// 開啟背光
PCD8544_SetBackLightState(HAL_State_ON);
// 關閉背光
PCD8544_SetBackLightState(HAL_State_OFF);
清屏
PCD8544_Fill(0);
PCD8544_UpdateScreen();
反顯
開啟反顯後, 需要再設置為正常顯示模式才能恢復, 不能通過再次調用反顯恢復
PCD8544_SetDisplayInverted();
畫線
// 從(0,0)畫線到(83,0)
PCD8544_DrawLine(0, 0, 83, 0, 1);
PCD8544_DrawLine(0, 0, 0, 47, 1);
PCD8544_DrawLine(83, 0, 83, 47, 1);
PCD8544_DrawLine(0, 47, 83, 47, 1);
PCD8544_UpdateScreen();
顯示文字
// 移動坐標到(3,3)
PCD8544_GotoXY(3, 3);
// 使用5x7字體顯示英文
PCD8544_Puts("LCD:PCD8544", &Font_5x7, 1);
PCD8544_UpdateScreen();
關機模式
// 關機
PCD8544_SetPowerDownMode(HAL_State_ON);
// 開機
PCD8544_SetPowerDownMode(HAL_State_OFF);
參數說明
這三個擴展命令會影響顯示, 設置不當會變成全白或全黑
#define PCD8544_SETTEMP 0x04 // Extended instruction set - Set temperature coefficient
#define PCD8544_SETBIAS 0x10 // Extended instruction set - Set bias system
#define PCD8544_SETVOP 0x80 // Extended instruction set - Write Vop to register
其中
PCD8544_SETTEMP
是溫度因數, 通常不需要設置PCD8544_SETBIAS
是偏壓級別, 通常設置為[3,7]之間的指, 對應的寫入就是[0x13, 0x17]PCD8544_SETVOP
是系統電壓, 會受上面的兩個參數影響
如果初始化後無顯示或顯示全黑的, 可以根據上面的範圍調整.
演示
視頻中可以看到不同基準電壓下, 調節顯示電壓造成的對比度變化
https://www.bilibili.com/video/BV1eF411G7Y7
參考
- https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library
- https://lastminuteengineers.com/nokia-5110-lcd-arduino-tutorial/
- 使用Arduino UNO 驅動 Nokia5110 LCD https://www.youtube.com/watch?v=VtZvf5T98FI