1、(word完整版)12864LCD液晶显示原理及使用方法12864LCD液晶显示原理及使用方法液晶简介液晶是一种在一定温度范围内呈现既不同于固态液态又不同于气态的特殊物质态,它既具有各向异性的晶体所特有的双折射性又具有液体的流动性液晶显示器件(英文的简写为LCD)就是利用液晶态物质的液晶分子排列状态在电场中改变而调制外界光的被动型显示器件.点阵式图形液晶显示屏是 LCD 的一种能够动态显示图形汉字以及各种符号信息为各种电子产品提供了友好的人机界面点阵式图形液晶显示屏的主要特点如下(这些特点也就是LCD 的特点):工作电压低、微功耗、体积小、可视面积大、无电磁辐射、数字接口、寿命长等特点.128
2、64LCD是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及12864 全点阵液晶显示器组成。可完成图形显示,也可以显示84 个(1616 点阵)汉字或者显示164个(816 点阵)ASCII码。分为两种,带字库的和不带字库的。不带字库的LCD需要自己提供字库字模,此时可以根据个人喜好设置各种字体显示风格,设计上较为灵活。带字库的LCD提供字库字模,但是只能显示GB2312的宋体。各有优缺点,根据不同应用场景灵活选择。其液晶模块原理图如下所示。12864LCD点阵图形液晶模块原理框图下面给出了其应用连接电路,分别介绍其各引脚的功能和作用。如下表所示:12864LCD 的引脚说明管脚号管脚名
3、称LEVER 管脚功能描述1GND 0 电源地2VCC+5.0V 电源电压3VLCD 液晶显示器驱动电压4RS (D/I) H/LD/I=“H”,表示DB7DB0 为显示数据D/I=“L”,表示DB7DB0 为显示指令数据5R/W H/L R/W=“H”,E=“H”数据被读到DB7DB0R/W=“L”,E=“HL”数据被写到IR 或DR6EN H/L R/W=“L”,E 信号下降沿锁存DB7DB0R/W=“H”,E=“H”DDRAM 数据读到DB7DB07DB0 H/L 数据线8DB1 H/L数据线9DB2 H/L 数据线10DB3 H/L 数据线11DB4 H/L数据线12DB5 H/L数据
4、线13DB6 H/L数据线14DB7 H/L数据线15CS1 H/L H:选择芯片(右半屏)信号16CS2 H/L H:选择芯片(左半屏)信号17RET H/L复位信号,低电平复位18VEE -10VLCD 驱动负电压19LED+ LED 背光板电源20LED- LED 背光板电源12864LCD点阵图形液晶模块应用连接电路液晶驱动设置在理解12864LCD硬件原理和管脚功能之后,可以针对LCD进行驱动的编写,分两种情况:仿真环境下和实物开发板编程。仿真驱动定义如下:define uint8 unsigned chardefine uint32 unsigned intdefine LCD_d
5、atabus P0 /LCD8位数据口sbitDI = P22; /DI为0写指令或读状态;1数据sbit RW = P21; /RW为1写;0读sbit EN = P20; /使能端sbit CS1 = P24; /片选1低电平有效,控制左半屏sbit CS2 = P23; /片选1低电平有效,控制右半屏实物开发板驱动接线和定义如下#define LCD_PORT_NUM 0 /LCD端口P0#define DATA_PORT_NUM 1 /数据端口P1define CS1_PIN 23 /片选1低电平有效,控制左半屏#define CS2_PIN 24 /片选1低电平有效,控制右半屏#de
6、fine RST_PIN 21 /复位信号低电平有效#define RW_PIN 20 /RW为1写;0读define DI_PIN 19 /DI为0写指令或读状态;1数据define EN_PIN 22 /使能端uchar DIN8 = 24, 23, 20, 21, 28, 29, 19, 22; /8位数据线的接线方式P2。24, P2.23,P2.22对于D0,D1,D7,低位到高位涉及到的一些控制指令:0x3E关显示,0x3F开显示;总共有八页,一页占八行点阵点,页的首地址为0xB8;行的起始地址为0xC0,有规律的改变起始行号可以实现滚屏的效果;列的起始地址为0x40一直到0x7F
7、共64列;读状态指令时,数据位最高位D7为1内部忙,为0空闲;对应接线为P2。22;通过GPIO_ReadValue获取P2端口的32位数据P2.0到P2.31,然后进行相应的与或操作进行判断。仿真环境下的驱动程序编写:void delay(uint8 i) /延时函数while(i);void Read_busy() /读忙函数-数据位的最高位D7为1则忙P0 = 0X00;DI = 0;RW = 1;EN = 1while(P0 0x80);EN = 0;void write_LCD_command(uint8 value) /写命令函数Read_busy(); /每次读写都要忙判断DI
8、= 0; /选择命令RW = 0; /读操作LCD_databus = value;EN = 1; /EN由10锁存有效数据_nop_();_nop_();EN = 0; void write_LCD_data(uint8 value) /写数据函数Read_busy();DI = 1; /选择数据RW = 0;LCD_databus = value;EN = 1; /EN由10锁存有效数据_nop_();_nop_();EN = 0; void Set_page(uint8 page) /设置显示起始页page = 0xB8 | page; /页的首地址为0xB8wite_LCD_comma
9、nd(page);void Set_line(uint8 startline) /设置显示的起始行startline = 0xC0 |startline;write_LCD_command(startline);void Set_column(uint8 column) /设置显示的列column = column 0x3F; /列的最大值为64column = column 0x40; /列的首地址为0x40write_LCD_command(column);void SetOnOff(uint8 onoff) /显示开关函数;0x3E是关显示,0x3F是开显示onoff = 0x3E |
10、onoff;write_LCD_command(onoff);void SelectScreen(uint8 screen) /选择屏幕switch(screen) case 0: CS1 = 0; CS2 = 0; break; /全屏case 1: CS1 = 0; CS2 = 1; break; /左半屏case 2: CS1 = 1; CS2 = 0; break; /右半屏default: break;void ClearScreen(uint8 screen) /清屏uint8i, j;SelectScreen(screen);for(i=0;i8;i+)Set_page(i);S
11、et_column(0);for(j=0;j64;j+)write_LCD_data(0x00); /写入0,地址指针自动加1void InitLCD() /LCD初始化Read_busy();SelectScreen(0);SetOnOff(0); /关显示SelectScreen(0);SetOnOff(1); /开显示SelectScreen(0);ClearScreen(0);Set_line(0);连接开发板实物的底层应用程序:voidLCD_Check_Busy(void) unsignedint value = 0, rvalue = 0;GPIO_SetDir(DATA_PORT_NUM, 0x31F80000L, 0);GPIO_ClearValue(LCD_PORT_NUM, (1 DI_PIN));GPIO_SetValue(LCD_PORT_NUM, (1 RW_PIN)); GPIO_SetValue(LCD_PORT_NUM, (1 3应该写成i*3+(j3),因为“的优先级小于“+”,通过对其修改,可以在液晶屏上输入正确的结果。