LCD12864显示屏原理及使用教程
1.芯片簡介
????????LCD12864液晶顯示模塊是 128×64點陣的漢字圖形型液晶顯示模塊,可顯示漢字及圖形,內(nèi)置 8192個中文漢字(16X16 點陣)(需帶有字庫的型號才能顯示中文)、128 個字符(8X16 點陣)及 64X256 點陣顯示 RAM(GDRAM)。可與 CPU 直接接口,提供兩種界面來連接微處理機:8-位并行及串行兩種連接方式。具有多種功能:光標(biāo)顯示、畫面移位、睡眠模式等。
主要特點如下
-
邏輯工作電壓(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);#endifLCD12864.c
?
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;//Eextern 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); #endifLCD12864.c
#include <reg52.h> #include <intrins.h> #include"LCD12864.h" /**************************************************************//串行方式控制 /*******************************************************************常量聲明區(qū) ********************************************************************/ unsigned char code AC_TABLE[]={ //坐標(biāo)編碼 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),0while(0x80&ReceiveByte()); }/******************************************************************寫一個字節(jié)的指令 *******************************************************************/ void WriteCommand( unsigned char Cbyte ) {CS = 1;CheckBusy();SendByte(0xf8); //11111,RW(0),RS(0),0SendByte(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),0SendByte(0xf0&Dbyte);SendByte(0xf0&Dbyte<<4);CS = 0; }/******************************************************************lcd初始化函數(shù) *******************************************************************/ void LcmInit( void ) {WriteCommand(0x30);WriteCommand(0x03);WriteCommand(0x0c);WriteCommand(0x01);WriteCommand(0x06); }/*******************************************************************************************************設(shè)定光標(biāo)函數(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 != '\0'){if(col==8){col=0;row++;}if(row==4) row=0;WriteCommand(AC_TABLE[8*row+col]);WriteData(*puts);puts++;if(*puts != '\0'){WriteData(*puts);puts++;col++;} } }如需資料可在該賬號下載頻道下載,或關(guān)注公眾號-單片機實例設(shè)計,發(fā)送“LCD12864”獲取。
總結(jié)
以上是生活随笔為你收集整理的LCD12864显示屏原理及使用教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 淘宝客系统教学系列_1.简单介绍和平台搭
- 下一篇: SpringBoot 2.3.x gra