小白學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語句進行程式的編寫。(碼字太煩躁了,不想碼了,想要動態程式的可以留言,我看到後會發給你)。
需要將上面的程式慢慢看一下,方可與之前所描述的文字相對應,進行理解,可能說的有一些錯誤的地方,希望能提醒批改。