詳解LCD12864顯示屏的使用(並行控制)

一.概述

LCD12864顯示屏是所說的點陣液晶顯示模塊,就是由12864個液晶顯示點組成的一個128列64行的陣列,所以也就叫成了12864。每個顯示點都對應着有一位二進制數,0表示滅,1表示亮。存儲這些點陣信息的RAM被稱爲顯示數據存儲器。如果要顯示某個圖形或漢字就是將相應的點陣信息寫入到對應的存儲單元中。圖形或漢字的點陣信息是由自己設計(如果模塊帶有字庫,則不需要自己設計漢字),這時候問題的關鍵是顯示點在液晶屏上的位置與其在存儲器中的地址之間的關係。

二.LCD12864基本參數
1.電氣參數
  • 電源電壓:VDD:+3.0–+5.5V
  • 顯示分辨率:128×64點
  • 內置漢字字庫,提供8192個16×16點陣漢字(簡繁體可選)
  • 內置128個16×8點陣字符
  • 2MHZ時鐘頻率
  • 顯示方式:STN、半透、正顯
  • 驅動方式:1/32DUTY,1/5BIAS
  • 視角方向:6點
  • 背光方式:側部高亮白色LED,功耗僅爲普通LED的1/5—1/10
  • 通訊方式:串行、並口可選
  • 內置DC-DC轉換電路,無需外加負壓
  • 無需片選信號,簡化軟件設計
  • 工作溫度:0℃-+55℃,
  • 存儲溫度:-20℃-+60℃
2.引腳說明

LCD12864的引腳總共有20個,如圖:
在這裏插入圖片描述
在這裏插入圖片描述
其中,引腳PSB爲並/串行接口選擇引腳,高電平爲並行控制;低電平爲串行控制。

3. 電路圖

在這裏插入圖片描述
其中可調電阻用於調整顯示器的對比度。三極管是爲增強電流的驅動能力,爲背光LED提供足夠的驅動電流。

三.控制程序
1.控制時序

LCD12864控制時序有兩種,一種爲並行控制時序(本次是以並行爲例),另一種是串行控制時序。
簡單來說,大部分情況下我們只對顯示屏做寫操作,讀操作很少用,所以讀操作就不做介紹。LCD12864顯示屏控制程序簡化下來,也相對簡單,只需要實現忙檢查、寫數據、寫指令、初始化四個控制函數即可實現對LCD12864的控制。寫時序如圖:
在這裏插入圖片描述

2. 忙狀態檢查函數
/*******************************************************************************
* 函 數 名         : LCD12864_Busy
* 函數功能       : 檢測LCD是否忙
* 輸    入         : 無
* 輸    出         : 1或0(1表示不忙,0表示忙)
*******************************************************************************/
uchar LCD12864_Busy(void)
{
  uchar i = 0;
  LCD12864_RS = 0;     //選擇命令
  LCD12864_RW = 1;  //選擇讀取
  LCD12864_EN = 1;
  LCD12864_Delay1ms(1);
  while((LCD12864_DATAPORT & 0x80) == 0x80)  //檢測讀取到的值
  {
    i++;
    if(i > 100)
    {
      LCD12864_EN = 0;
      return 0;     //超過等待時間返回0表示失敗
    }
  }
  LCD12864_EN = 0;
  return 1;
}
3. 寫指令函數
/*******************************************************************************
* 函 數 名         : LCD12864_WriteCmd
* 函數功能       : 寫命令
* 輸    入         : cmd
* 輸    出         : 無
*******************************************************************************/
void LCD12864_WriteCmd(uchar cmd)
{
  uchar i;
  i = 0;
  while( LCD12864_Busy() == 0)
  {
    LCD12864_Delay1ms(1);
    i++;
    if( i>100)
    {
      return;     //超過等待退出
    }  
  }  
  LCD12864_RS = 0;     //選擇命令
  LCD12864_RW = 0;     //選擇寫入
  LCD12864_EN = 0;     //初始化使能端
  LCD12864_DATAPORT = cmd;   //放置數據
  LCD12864_EN = 1;       //寫時序
  LCD12864_Delay1ms(5);
  LCD12864_EN = 0;              
}
4. 寫數據函數
/*******************************************************************************
* 函 數 名         : LCD12864_WriteData
* 函數功能       : 寫數據
* 輸    入         : dat
* 輸    出         : 無
*******************************************************************************/
void LCD12864_WriteData(uchar dat)
{
  uchar i;
  i = 0;
  while( LCD12864_Busy() == 0)
  {
    LCD12864_Delay1ms(1);
    i++;
    if( i>100)
    {
      return;     //超過等待退出
    }  
  }
  LCD12864_RS = 1;     //選擇數據
  LCD12864_RW = 0;     //選擇寫入
  LCD12864_EN = 0;     //初始化使能端
  LCD12864_DATAPORT = dat;   //放置數據
  LCD12864_EN = 1;       //寫時序
  LCD12864_Delay1ms(5);
  LCD12864_EN = 0;                    
}

與LCD1602一樣,LCD12864寫數據和寫指令的區別在於RS引腳的電平;RS爲高電平時,寫數據;RS爲低電平時,寫指令。

5. 初始化函數
/*******************************************************************************
* 函 數 名         : LCD12864_Init
* 函數功能       : 初始化LCD12864
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void LCD12864_Init()
{
  LCD12864_PSB = 1;    //選擇並行輸入
  LCD12864_RST = 1;    //復位
​
  LCD12864_WriteCmd(0x30);  //選擇基本指令操作
  LCD12864_WriteCmd(0x0c);  //顯示開,關光標
  LCD12864_WriteCmd(0x01);  //清除LCD12864的顯示內容
}
四.顯示程序

在LCD12864上顯示特定的字符,實際上就是對LCD12864的DDRAM上寫入對應的數據,顯示屏便顯示你想要的字符。其中,英文字符佔用1個字節,中文字符佔用2個字節。

1. 顯示座標關係

在這裏插入圖片描述
如上圖所示,第一行顯示的地址爲80H-87H,第二行爲90H-97H,第三行爲88H-8FH,第四行爲98H-9FH。所以要顯示屏上哪個位置顯示哪個漢字,只需要寫入對應位置的地址,再寫入對應漢字即可。

2. 顯示漢字

只要實現以上忙檢查、寫數據、寫指令、初始化四個控制函數,就可以實現LCD12864顯示屏漢字的顯示控制。

顯示函數只需要寫入起始座標,然後顯示對應的漢字。

/*******************************************************************************
* 函 數 名         : LCD12864_SetWindow
* 函數功能       : 設置在基本指令模式下設置顯示座標,並顯示漢字。注意:x是設置行,y是設置列
* 輸    入         : x, y,word
* 輸    出         : 無
*******************************************************************************/
void LCD12864_SetWindow(uchar x, uchar y,uchar *word)
{
  uchar pos;
  uchar i=y;
  if(x == 0)     // 第一行的地址是80H
    x = 0x80;   
  else if(x == 1)  //第二行的地址是90H
    x = 0x90;  
  else if(x == 2)  //第三行的地址是88H
    x = 0x88; 
  else if(x == 3)  //第三行的地址是98H
    x = 0x98;
  
  pos = x + y;
  LCD12864_WriteCmd(pos);  
  while(word[i]!='\0')
  {
    if(i<16)    //判斷是否在本行的顯示範圍內
    {
      LCD12864_WriteData(word[i]);
      i++;
    } 
  }
}
3.主函數

最後,在主函數上實現漢字的顯示了。

#include<reg51.h>
#include"lcd12864.h"
​
unsigned char code CharCode[]="電子應用學習館";
​
void main()
{
  unsigned char i;
​
  LCD12864_Init();
  LCD12864_SetWindow(0, 0,CharCode);
  while(1);
}

如需LCD12864相關資料及例程, 請關注公衆號,首頁回覆LCD12864獲取資料
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章