12864LCD液晶显示原理及使用方法液晶简介液晶是一种在一定温度范围内呈现既不同于固态液态又不同于气态的特殊物质态,它既具有各向异性的晶体所特有的双折射性又具有液体的流动性液晶显示器件(英文的简写为LCD)就是利用液晶态物质的液晶分子排列状态在电场中改变而调制外界光的被动型显示器件。
点阵式图形液晶显示屏是 LCD 的一种能够动态显示图形汉字以及各种符号信息为各种电子产品提供了友好的人机界面点阵式图形液晶显示屏的主要特点如下(这些特点也就是LCD 的特点):工作电压低、微功耗、体积小、可视面积大、无电磁辐射、数字接口、寿命长等特点。
12864LCD是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64 全点阵液晶显示器组成。
可完成图形显示,也可以显示8×4 个(16×16 点阵)汉字或者显示16×4个(8×16 点阵)ASCII码。
分为两种,带字库的和不带字库的。
不带字库的LCD需要自己提供字库字模,此时可以根据个人喜好设置各种字体显示风格,设计上较为灵活。
带字库的LCD提供字库字模,但是只能显示GB2312的宋体。
各有优缺点,根据不同应用场景灵活选择。
其液晶模块原理图如下所示。
12864LCD点阵图形液晶模块原理框图下面给出了其应用连接电路,分别介绍其各引脚的功能和作用。
如下表所示:12864LCD 的引脚说明管脚号管脚名称LEVER 管脚功能描述1GND 0 电源地2VCC+5.0V 电源电压3VLCD - 液晶显示器驱动电压4RS (D/I) H/LD/I=“H”,表示DB7∽DB0 为显示数据D/I=“L”,表示DB7∽DB0 为显示指令数据5R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR 或DR 6EN H/L R/W=“L”,E 信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM 数据读到DB7∽DB0 7DB0 H/L 数据线8DB1 H/L数据线9DB2 H/L 数据线10DB3 H/L 数据线11DB4 H/L数据线12DB5 H/L数据线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 char#define uint32 unsigned int#define LCD_databus P0 //LCD8位数据口sbitDI = P2^2; //DI为0写指令或读状态;1数据sbit RW = P2^1; //RW为1写;0读sbit EN = P2^0; //使能端sbit CS1 = P2^4; //片选1低电平有效,控制左半屏sbit CS2 = P2^3; //片选1低电平有效,控制右半屏实物开发板驱动接线和定义如下#define LCD_PORT_NUM 0 //LCD端口P0#define DATA_PORT_NUM 1 //数据端口P1#define CS1_PIN 23 //片选1低电平有效,控制左半屏#define CS2_PIN 24 //片选1低电平有效,控制右半屏#define RST_PIN 21 //复位信号低电平有效#define RW_PIN 20 //RW为1写;0读#define DI_PIN 19 //DI为0写指令或读状态;1数据#define EN_PIN 22 //使能端uchar DIN[8] = {24, 23, 20, 21, 28, 29, 19, 22};//8位数据线的接线方式P2.24, P2.23,…P2.22对于D0,D1,…D7,低位到高位涉及到的一些控制指令:0x3E关显示,0x3F开显示;总共有八页,一页占八行点阵点,页的首地址为0xB8;行的起始地址为0xC0,有规律的改变起始行号可以实现滚屏的效果;列的起始地址为0x40一直到0x7F共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 = 0; //选择命令RW = 0; //读操作LCD_databus = value;EN = 1; //EN由1—0锁存有效数据_nop_();_nop_();EN = 0;}void write_LCD_data(uint8 value) //写数据函数{Read_busy();DI = 1; //选择数据RW = 0;LCD_databus = value;EN = 1; //EN由1—0锁存有效数据_nop_();_nop_();EN = 0;}void Set_page(uint8 page) //设置显示起始页{page = 0xB8 | page; //页的首地址为0xB8wite_LCD_command(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 | 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;i<8;i++){Set_page(i);Set_column(0);for(j=0;j<64;j++){write_LCD_data(0x00); //写入0,地址指针自动加1}}}void 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 << EN_PIN));while (1){value = GPIO_ReadValue(DATA_PORT_NUM);//获取值为32位P2.0到P2.31 /*数据位最高位D7为1内部忙,为0空闲;对应接线为P2.22*/rvalue = value & 0x400000;if (0x0 == rvalue){break;}}GPIO_ClearValue(LCD_PORT_NUM, (1 << EN_PIN));GPIO_SetDir(DATA_PORT_NUM, 0x31F80000L, 1);data_setpin(0);}其他的函数按照上面的进行设置,其中函数GPIO_SetValue将对应的位置1,;函数GPIO_ClearValue将对应的位置0;函数GPIO_ReadValue获取对应端口的数据,函数GPIO_SetDir设置相应端口的相应位的方向——输入输出。
字库原理及其制作在前面我们分析了如何点亮一个或者多个点阵,通过有意识的点亮一些点阵可以在液晶屏上看到数字、字母和汉字的显示。
那么一个字母或者汉字对应着那些位置的点阵呢,是否可以通过计算得到其字模数据?现在可以在网上下载到各种字模软件,对单个的字符取模,也可以对ASCII 码、汉字库取模生成字库bin文件。
在取模之前要对其进行相应的设置,以便能够正确的显示(当取模方式和液晶屏的设置不一样时会显示出乱码)。
需要注意的是横纵向取模的区别,字节正序和字节倒序的差别。
下面介绍字模的数据的获取,字节正序和倒序、横纵向取模的差别。
字模是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1 所示:8×16的ASCII码点阵,左边的为横行取模,字节正序(即高位在前),右边的为纵向取模,字节倒序(即高位在下)。
图1 “A”字模图而中文的“你”在字模中的记载却如图2 所示:下面的取模方式只介绍了横向取模、字节正序。