1.芯片簡介
LCD12864液晶顯示模塊是 128×64點陣的漢字圖形型液晶顯示模塊,可顯示漢字及圖形,內(nèi)置 8192個中文漢字(16X16 點陣)(需帶有字庫的型號才能顯示中文)、128 個字符(8X16 點陣)及 64X256 點陣顯示 RAM(GDRAM)??膳c CPU 直接接口,提供兩種界面來連接微處理機:8-位并行及串行兩種連接方式。具有多種功能:光標顯示、畫面移位、睡眠模式等。
主要特點如下
- 邏輯工作電壓(VDD):4.5~5.5V;
- 背光源電壓 :4.5~5.5V;
- 工作溫度(Ta):0~60℃(常溫) / -20~75℃(寬溫);
- 顯示角度:6:00 鐘直視;
- 與 MCU 接口:8位或3位串行模式;
2. LCD12864引腳定義
3.LCD12864并行控制
(1)讀操作時序如圖
(2)寫操作時序如圖
(3)與MCU連接原理圖
并行模式,除電源外,需要將模塊的CS、SCLK、SID、DB0-DB7引腳一一與單片機連接,PSB接VCC(接地為串行模式,接VCC為并行模式),RST接VCC(低電平復(fù)位);
(4)并行模式驅(qū)動程序
LCD12864.h
#ifndef __LCD12864_H
#define __LCD12864_H
//---包含頭文件---//
#include< reg51.h >
//---重定義關(guān)鍵詞---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//---定義使用的IO口---//
#define LCD12864_DATAPORT P0 //數(shù)據(jù)IO口
sbit LCD12864_RS = P2^6; //(數(shù)據(jù)命令)寄存器選擇輸入
sbit LCD12864_RW = P2^5; //液晶讀/寫控制
sbit LCD12864_EN = P2^7; //液晶使能控制
sbit LCD12864_PSB = P3^2; //串/并方式控制
sbit LCD12864_RST = P3^4; //復(fù)位端
//---聲明全局函數(shù)---//
void LCD12864_Delay1ms(uint c);
uchar LCD12864_Busy(void);
void LCD12864_WriteCmd(uchar cmd);
void LCD12864_WriteData(uchar dat);
void LCD12864_Init();
void LCD12864_ClearScreen(void);
void LCD12864_SetWindow(uchar x, uchar y,uchar *word);
#endif
LCD12864.c
#include"lcd12864.h"
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_Delay1ms
*******************************************************************************/
void LCD12864_Delay1ms(uint c)
{
uchar a,b;
for(; c >0; c--)
{
for(b=199; b >0; b--)
{
for(a=1; a >0; a--);
}
}
}
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_Busy
* 函數(shù)功能 : 檢測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;
}
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_WriteCmd
* 函數(shù)功能 : 寫命令
*******************************************************************************/
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; //放置數(shù)據(jù)
LCD12864_EN = 1; //寫時序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;
}
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_WriteData
* 函數(shù)功能 : 寫數(shù)據(jù)
*******************************************************************************/
void LCD12864_WriteData(uchar dat)
{
uchar i;
i = 0;
while( LCD12864_Busy() == 0)
{
LCD12864_Delay1ms(1);
i++;
if( i >100)
{
return; //超過等待退出
}
}
LCD12864_RS = 1; //選擇數(shù)據(jù)
LCD12864_RW = 0; //選擇寫入
LCD12864_EN = 0; //初始化使能端
LCD12864_DATAPORT = dat; //放置數(shù)據(jù)
LCD12864_EN = 1; //寫時序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;
}
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_Init
*******************************************************************************/
void LCD12864_Init()
{
LCD12864_PSB = 1; //選擇并行輸入
LCD12864_RST = 1; //復(fù)位
LCD12864_WriteCmd(0x30); //選擇基本指令操作
LCD12864_WriteCmd(0x0c); //顯示開,關(guān)光標
LCD12864_WriteCmd(0x01); //清除LCD12864的顯示內(nèi)容
}
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_SetWindow
*******************************************************************************/
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]!='?')
{
if(i< 16) //判斷是否在本行的顯示范圍內(nèi)
{
LCD12864_WriteData(word[i]);
i++;
}
}
}
4.LCD12864串行控制
(1)串行控制時序如圖:
第一字節(jié):格式 11111ABC
- A 為數(shù)據(jù)傳送方向控制:H 表示數(shù)據(jù)從 LCD 到 MCU,L 表示數(shù)據(jù)從 MCU 到 LCD;
- B 為數(shù)據(jù)類型選擇:H 表示數(shù)據(jù)是顯示數(shù)據(jù),L 表示數(shù)據(jù)是控制指令;
- C 固定為 0;
第二字節(jié):(串行)8 位數(shù)據(jù)的高 4 位—格式 DDDD0000;
第三字節(jié):(串行)8 位數(shù)據(jù)的低 4 位—格式 0000DDDD;
(2)與MCU連接原理圖
串行模式,除電源外,只需要將模塊的CS、SCLK、SID引腳與單片機連接,PSB接GND(接地為串行模式,接VCC為并行模式),RST接VCC(低電平復(fù)位);
(3)串行模式驅(qū)動程序
LCD12864.h
#ifndef _LCD12864_h_
#define _LCD12864_h_
/**************************************************************
iO口宏定義區(qū)
***************************************************************/
sbit CS =P2^3;//RS
sbit SID=P2^4;//RW
sbit SCK=P2^5;//E
extern void WriteCommand( unsigned char Cbyte ); //寫入指令函數(shù)
extern void WriteData( unsigned char Dbyte ); //寫入指令數(shù)據(jù)
extern void LcmInit( void ); //顯示屏初始化
extern void LcmClearTXT( void ); //顯示屏清屏
extern void Location_xy_12864(unsigned char x,unsigned char y);
extern void PutStr(unsigned char row,unsigned char col,unsigned char *puts);
#endif
LCD12864.c
#include < reg52.h >
#include < intrins.h >
#include"LCD12864.h"
/**************************************************************
//串行方式控制
/*******************************************************************
常量聲明區(qū)
********************************************************************/
unsigned char code AC_TABLE[]={ //坐標編碼
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
};
/****************************************************************
發(fā)送一個字節(jié)
*****************************************************************/
void SendByte(unsigned char Dbyte)
{
unsigned char i;
for(i=0;i< 8;i++)
{
SCK = 0;
Dbyte=Dbyte< 1;
SID = CY;
SCK = 1;
SCK = 0;
}
}
/**********************************************************
接收一個字節(jié)
***********************************************************/
unsigned char ReceiveByte(void)
{
unsigned char i,temp1,temp2;
temp1=temp2=0;
for(i=0;i< 8;i++)
{
temp1=temp1< 1;
SCK = 0;
SCK = 1;
SCK = 0;
if(SID) temp1++;
}
for(i=0;i< 8;i++)
{
temp2=temp2< 1;
SCK = 0;
SCK = 1;
SCK = 0;
if(SID) temp2++;
}
return ((0xf0&temp1)+(0x0f&temp2));
}
/****************************************************************
檢查忙狀態(tài)
******************************************************************/
void CheckBusy( void )
{
do SendByte(0xfc); //11111,RW(1),RS(0),0
while(0x80&ReceiveByte());
}
/******************************************************************
寫一個字節(jié)的指令
*******************************************************************/
void WriteCommand( unsigned char Cbyte )
{
CS = 1;
CheckBusy();
SendByte(0xf8); //11111,RW(0),RS(0),0
SendByte(0xf0&Cbyte);
SendByte(0xf0&Cbyte< 4);
CS = 0;
}
/*************************************************************
寫一個字節(jié)的數(shù)據(jù)
**************************************************************/
void WriteData( unsigned char Dbyte )
{
CS = 1;
CheckBusy();
SendByte(0xfa); //11111,RW(0),RS(1),0
SendByte(0xf0&Dbyte);
SendByte(0xf0&Dbyte< 4);
CS = 0;
}
/******************************************************************
lcd初始化函數(shù)
*******************************************************************/
void LcmInit( void )
{
WriteCommand(0x30);
WriteCommand(0x03);
WriteCommand(0x0c);
WriteCommand(0x01);
WriteCommand(0x06);
}
/*******************************************************************************************************
設(shè)定光標函數(shù)
********************************************************************************************************/
void Location_xy_12864(unsigned char x,unsigned char y)
{
switch(x)
{
case 0:
x=0x80;break;
case 1:
x=0x90;break;
case 2:
x=0x88;break;
case 3:
x=0x98;break;
default:
x=0x80;
}
y=y&0x07;
WriteCommand(0x30);
WriteCommand(y+x);
WriteCommand(y+x);
}
/***********************************************************************************
清除文本
************************************************************************************/
void LcmClearTXT( void )
{
unsigned char i;
WriteCommand(0x30);
WriteCommand(0x80);
for(i=0;i< 64;i++)
WriteData(0x20);
Location_xy_12864(0,0);
}
/****************************************************************************************
顯示字符串
*****************************************************************************************/
void PutStr(unsigned char row,unsigned char col,unsigned char *puts)
{
WriteCommand(0x30);
WriteCommand(AC_TABLE[8*row+col]);
while(*puts != '?')
{
if(col==8)
{
col=0;
row++;
}
if(row==4) row=0;
WriteCommand(AC_TABLE[8*row+col]);
WriteData(*puts);
puts++;
if(*puts != '?')
{
WriteData(*puts);
puts++;
col++;
}
}
}
-
接口
+關(guān)注
關(guān)注
33文章
8447瀏覽量
150720 -
液晶顯示模塊
+關(guān)注
關(guān)注
0文章
45瀏覽量
11709 -
串行連接
+關(guān)注
關(guān)注
1文章
6瀏覽量
6678 -
LCD12864液晶
+關(guān)注
關(guān)注
0文章
2瀏覽量
1145
發(fā)布評論請先 登錄
相關(guān)推薦
評論