1. 程式人生 > >小白學1602字元點陣型LCD液晶顯示模組

小白學1602字元點陣型LCD液晶顯示模組

       我們都知道,液晶顯示已經深入我們的日常的生活之中,液晶顯示器的英文名:LCD,而它經常被用於顯示動畫,比如影視,在工業上,LCD被經常用於狀態的顯示視窗。

       對於液晶的控制,我們第一步需要知道液晶的構造,液晶全稱是“液態晶體”,介於固態和液態之間,我們一般常用的液晶形態是向列型液晶,分子形狀為細長棒形,或者稱之為桿狀。在不同電流電場的作用下,液晶分子會做規則旋轉呈90度排列。即在上下兩片玻璃之間旋轉,這樣就會改變透射率和反射率。

       第二步就需要知道1602顯示模組的介面。本次的1602液晶顯示之所以叫1602,是因為它可以顯示2行,每行顯示16個點陣字元。再仔細的分下去就是一個點陣字元的大小為5*8點陣的圖形字元(你可以仔細數一下液晶顯示屏)。它帶有字型檔,能顯示ASCII字元。下圖是1602LCD模組的顯示圖:


對於1602LCD的引腳說明:

V0:接可調電阻,可以調節液晶顯示的對比度(一般俗指的就是亮度),若直接接地,對比度最高。

RS:資料或者命令的選擇端,通俗的講就是資料的讀寫和指令的寫入。當微控制器要往LCD模組寫指令的時候,應使RS為低電平(從中央下達指令給地方,地方要擺好低姿態),同樣當微控制器從LCD模組讀取狀態時,RS也為低電平(從中央收取地方報告時,地方要以低姿態上書)。但是當微控制器要寫入資料給LCD時,應使RS為高電平(地方要高調的完成中央下達的年度計劃)。微控制器一般不會用於對LCD讀取資料。

R/W:讀寫控制端。R/W為高電平時,表示讀;R/W為低電平時,表示寫(地方放低姿態)。

E:LCD模組的使能訊號控制端。

微控制器需要通過RS,RW和E這三端來控制LCD模組。

D0-D7:8位資料匯流排,三態雙開(高電平狀態、低電平狀態、高阻狀態[既懸空])

BLK:需要背光時,BLA串接一個限流電阻後接Vcc,BLK接地

BLK:背光接地。

寫指令   輸入:RS=L,R/W=L,E=下降沿脈衝,DB0-DB7=指令碼

             輸出:無

讀狀態   輸入:RS=L,R/W=H,E=H(L為低電平,H為高電平),

             輸出:DB0-DB7=狀態字

寫資料   輸入:RS=H,R/W=L,E=下降沿脈衝,DB0-DB7=資料

             輸出:無

讀資料   輸入:RS=H,R/W=H,E=H(L為低電平,H為高電平),

             輸出:DB0-DB7=資料

       對於相關的指令碼,可以通過LCD資料手冊查詢初始LCD的狀態設定,既通過設定指令碼(8個指令碼D0-D7)來設定其狀態,可以通過替換程式當中的LCD初始化中的小括號裡面的16進位制數值改變初始狀態。

       一般來說:在LCD模組內部頻率為270kHz(一些廠家為250KHz),而大部分的指令執行時間需要37us(40us)左右,只有清屏和DDRAM資料地址指標AC清零(或者說歸位)指令執行時間需要1.52ms(1.64ms)左右,因此延時值可以取大點如5ms,保證操作可靠,以滿足要求。

下面咱們就程式來說一下:

LCDdisplay.c

#include"stm32f10x_heads.h"

//Write_Command_LCM對LCD1602寫指令

voidWrite_Command_LCM(u8 com)

{

  GPIO_ResetBits(GPIOD,GPIO_Pin_5);//RW=0,寫操作

  GPIO_ResetBits(GPIOD,GPIO_Pin_4);//RS=0,指令

  GPIO_Write(GPIOD,com);

  GPIO_ResetBits(GPIOD,GPIO_Pin_6);//E=0,形成寫脈衝

  delay_nms(5);

  GPIO_SetBits(GPIOD,GPIO_Pin_6);  //E=0,形成寫脈衝

  delay_nms(5);

  GPIO_ResetBits(GPIOD,GPIO_Pin_6); //E=0,下降沿寫

}

//Write_Data_LCM對LCD1602寫資料

void Write_Data_LCM(u8info)

{

  GPIO_ResetBits(GPIOD,GPIO_Pin_5);//RW=0,寫操作

  GPIO_ResetBits(GPIOD,GPIO_Pin_6);//E=0,形成寫脈衝

  GPIO_Write(GPIOD,info);

  GPIO_SetBits(GPIOD,GPIO_Pin_4);//RS=1,指令

  delay_nms(5);

  GPIO_SetBits(GPIOD,GPIO_Pin_6);  //E=1,形成寫脈衝

  delay_nms(5);

  GPIO_ResetBits(GPIOD,GPIO_Pin_6); //E=0,下降沿寫

}

//LCM_Init(),對LCD1602初始化

voidLCM_Init(void)//LCM初始化

{

  Write_Command_LCM(0x38);//顯示模式設定

  Write_Command_LCM(0x08);//關閉顯示

  Write_Command_LCM(0x01);//顯示清屏

  Write_Command_LCM(0x06);//顯示游標移動位置

  Write_Command_LCM(0x0C);//顯示開及游標設定

}

// Set_xy_LCM() 對LCD1602設定顯示座標位置,既開始顯示資料時的位置

voidSet_xy_LCM(unsigned char x,unsigned char y)

{

  unsigned char address;

  if(x==0) //在lcd的顯示屏的第一行顯示資料

          address=0x80+y;

  if(x==1) //在lcd的顯示屏的第二行顯示資料

          address=0xc0+y;

  Write_Command_LCM(address);

}

//Display_List_Char()按指定的位置顯示一串字元

voidDisplay_List_Char(unsigned char x,unsigned char y,unsigned char *s)

{

  Set_xy_LCM(x,y);

  while(*s)

  {

          Write_Data_LCM(*s)

          s++;

  }

}

//主程式執行

int main()

{

  LCM_Init();

  Display_List_Char(0,0,"fo.xi.90s");

 Display_List_Char(1,0,"guan,zhu,wo");

  while(1);

}

下面是LCD的.h檔案

#ifndef __LCD_H

#define __LCD_H    

#include"sys.h"

#define rsPCout(6)

#define enPCout(8)

void Write_Command_LCM(u8info);

void Write_Data_LCM(u8info);

void LCM_Init (void);

       當然我們在日常的使用中,會用到動態的顯示效果,這個可以利用switch和case語句進行程式的編寫。(碼字太煩躁了,不想碼了,想要動態程式的可以留言,我看到後會發給你)。

需要將上面的程式慢慢看一下,方可與之前所描述的文字相對應,進行理解,可能說的有一些錯誤的地方,希望能提醒批改。