
讲座(外设之液晶显示器lcd).ppt
40页2012年大学生电子竞赛 培训讲座五,外设之液晶显示器,南京师范大学电气与自动化工程学院 高翔,讲座内容,LCD的应用LCD的原理LCD的使用(MSP430如何与12864交换数据),LCD的应用一——数据显示,应用二——图形显示,应用三——菜单,应用三补充——子菜单,LCD的原理,LCD——液晶显示器 12864:128*64个点(分辨率) LCD的分类 字符型 内部含有字库,字符、汉字的显示依赖字库实现 点阵型 内部没有字库,所有显示数据依赖用户自己写入点阵型12864,在点阵型LCD上显示一幅图片或是字符,如上图所示,只需黑色的部分点亮,空白的点置0即可可以将LCD看成128*64个LED灯来帮助理解1)无显示的12864,(2) 显示一幅图片,LCD12864,LCD显示推理过程 一幅画面 128*64个点 内部128*64 bit的DDRAM(显示数据RAM) 并行通信 程序 本质 单片机通过并行通信向LCD内部的DDRAM中写入想要显示的数据 LCD实时根据DDRAM中的数据更新显示,DDRAM地址,图片显示,简单来说,主要分为两步: 1)将一幅图片转化为一系列二进制数据 2)将数据按字节(8位)写入液晶对应的DDRAM,12864的DDRAM有128*8=1024个地址,只需将图片转化的数据按字节写入这其对应的DDRAM地址即可。
字符显示,同图片一样,汉字、字符也是由一个个点组成上图中,汉字为16*16点阵,ASCII码为8*16点阵,字体大小可以根据需要改变 每8个点组成1个字节,所以一个汉字(ASCII)由16*2(8*2)个字节数据组成,字符显示原理与图片一致,只需将字符代码写入相应DDRAM地址LCD的使用(硬件),1)使能E 2)片选CS1(左半屏)、CS2(右)高有效 3)命令/数据选择RS(0——命令,1——数据) 4)读/写选择R/W(0——写,1——读) 5)数据总线DB0~DB7 6)负压产生和负压输入(对比度)调整 7)复位RST 8)电源与地和背景光电源,硬件接线图,LCD的使用(软件),初始化 字符的显示 Ascii(1字节)、汉字(2字节) 图片的显示 大小不超过128*64(1024字节) 实时数据的显示 一般每采集N个数据显示一次,N<128,LCD的初始化,初始化的工作主要有: 打开显示 确定起始行(DDRAM与LCD的对应关系) 确定DDRAM的指针起始位置 页地址0-7 列地址0-127,命令寄存器一,命令寄存器二,字符显示过程,准备工作 (1)使用取模软件获得汉字或ascii码的字模; (2)明确该汉字在LCD上显示位置 页地址0-7 列地址0-15 软件流程 (3)将页、列地址写入LCD的命令寄存器,以确定指针位置 (4)将字符对应的字模数据写入对应的DDRAM,图片的显示,准备工作 (1)使用取模软件获得图片的数据; (2)明确该图片在LCD上显示位置 起始位置(x,y) 图片大小(x1,y1) 软件流程 (3)图片显示顺序为从左到右,从上到下,每次显示一页(8行) (4)每次换行、换屏都需通过写入页、列地址重新定义指针位置,每次写完指针自动加1 (5)将数据写入对应的DDRAM,N个实时数据显示,准备工作 (1)写一函数实现对DDRAM中任一页、任一列写入一个字节数据 软件 (2)作N次循环,每次显示一个数据 (3)根据数据,确定其在DDRAM中的地址页地址列地址 (4)将该数据写入DDRAM对应地址空间,总结,无论是显示字符、图片还是显示实时采集数据,其实质都是一样: 确定它们在DDRAM中的位置 将它们对应的字模数据写入DDRAM中,实例分析,底层程序(涉及硬件) (1)查忙 (2)写数据 ( )读数据(不常用,一般不需) (3)写命令 软件对外接口程序(属于顶层,不涉及硬件) (4)初始化 (5)清屏 (6)连续显示汉字或ASCII码 (7)显示图片 (8)显示实时数据曲线 (9)折线图,预定义(硬件接口),#define Port_IO; P10SEL = 0x00; P9SEL #define Lcd_Data P10OUT //P1.0~P1.7 #define Lcd_Data_IN P10IN //P1.0~P1.7 #define SetE P9OUT |= BIT0 // E=1,---P3.0 #define ClrE P9OUT &=~ BIT0 // E=0, #define SetRW P9OUT |= BIT1 // RW=1,---P3.1 #define ClrRW P9OUT &=~ BIT1 // RW=0, #define SetDI P9OUT |= BIT2 // DI=1,---P3.2 #define ClrDI P9OUT &=~ BIT2 // DI=0, #define SetCS1 P9OUT |= BIT3 //CS1=1,---P3.3 #define ClrCS1 P9OUT &=~ BIT3 //CS1=0, #define SetCS2 P9OUT |= BIT4 //CS2=1,---P3.4 #define ClrCS2 P9OUT &=~ BIT4 //CS2=0, #define Data_IN P10DIR = 0x00 #define Data_OUT P10DIR = 0xFF #define Ctrl_OUT P9DIR |= 0x2F #define Left 0 #define Right 1,点阵型12864指令表,(1)查忙,void CheckBusy(uchar side) {uchar buf=0xFF;Data_IN;_Nop();ClrE; SetRW; //1_read,0_writeClrDI; //1_data,0_cmdwhile(buf){if(side == 0){ SetCS1;ClrCS2; //enable CS1_Nop();_Nop(); //delay 1us befor and after setE SetE;_Nop();buf=Lcd_Data_IN;},Else{ ClrCS1;SetCS2; //enable CS2_Nop();_Nop(); //delay 1us befor and after setE SetE;_Nop();buf=Lcd_Data_IN;} buf },(2)写数据,void WriteData(uchar dat,uchar side) {CheckBusy(side);ClrE;ClrRW;SetDI; Lcd_Data=dat;if(side==Left){SetCS1; ClrCS2; }else{ClrCS1; SetCS2;}_Nop(); //delay 1us befor and after setE SetE;_Nop(); ClrE; },(3)写命令,void WriteCmd(uchar cmd,uchar side) {CheckBusy(side);ClrE;ClrRW; //1_read,0_writeClrDI;//1_data,0_cmdLcd_Data=cmd;if(side==Left){SetCS1; //leftClrCS2; }else{ClrCS1; //rightSetCS2;}_Nop(); //delay 1us befor and after setE SetE;_Nop();ClrE; },(4)初始化,void Lcd_Init() {Port_Init(); //显示开WriteCmd(0x3F,Left); WriteCmd(0x3F,Right); //起始行WriteCmd(0xC0,Left);WriteCmd(0xC0,Right); //起始x,y坐标(0,0)WriteCmd(0xB8,Left);WriteCmd(0xB8,Right);WriteCmd(0x40,Left);WriteCmd(0x40,Right); },void Port_Init(void) {Port_IO;Ctrl_OUT;Data_OUT; },(5)清屏,void Lcd_Clear(void) {uchar i,j;for(i=0;i<8;i++){WriteCmd(0xB8+i,Left);WriteCmd(0xB8+i,Right);WriteCmd(0x40,Left);WriteCmd(0x40,Right);for(j=0;j<64;j++){WriteData(0,Left);WriteData(0,Right);}} },(6)连续显示字符,关键在于区分ASCII码和汉字 ASCII都小于0xA0 汉字的第一个字节必然大于或等于0xA0 Ascii码注意其字库数组里数据的顺序 汉字的字模应定义为一结构体 结构体包含两部分 汉字的内码(2字节) 汉字的字模数据(32字节)16*16大小 显示步骤分2步 根据汉字内码在字库中查找汉字的位置(数组编号) 根据该编码得到汉字的字模,并将这些字模写入LCD的DDRAM,小结,液晶显示器的重要特点 使用之前必须初始化! 当要显示新的数据时,应考虑是否需要清屏,合理使用清屏程序很重要。
LCD显示内容与DDRAM中的数据一一对应,你不清屏,LCD上面就会一直显示,字模软件的作用,将要显示的图片、汉字、ASCII码转化为12864可以辨认的二进制数据 举例: “南”的字模为: 0x04,0xE4,0x24,0x24,0x64,0xA4,0x24,0x3F, 0x24,0xA4,0x64,0x24,0x24,0xF6,0x24,0x00, 0x00,0xFF,0x00,0x09,0x09,0x09,0x09,0x7F, 0x09,0x09,0x09,0x49,0x80,0x7F,0x00,0x00,取模软件的使用,一、参数设置 1.LCD显示方式 XY地址计数器 从左到右、从上到下 单字节数据格式 纵向8点下高位 2.字体格式 汉字 or ASCII码 字体类型和大小 宋体16点阵 Asc8X16E,参数设置如下图所示,点击参数确认,取模软件的使用(续),二、输入所要转化的数据 (1)汉字 直接在对话框中输入汉字 点击“输入字串”按钮即可(2)ASCII码 直接点击右边的蓝色ASCII码按钮,就可生成所有ASCII码字模,取模软件的使用(续2),(3)图片 保证图片像素小于128 64 Bmp格式 点击载入图片按钮 选择图片 点击数据保存,总结与任务,理解12864是如何显示字符和图形的; 知晓单片机与12864的硬件连接; 明白如何通过总线操作实现单片机与12864之间数据与命令的交换; 参考12864的命令字进行软件编程; 学会如何使用取字模软件;,作业,又见作业,结合zlg7290,要求 按下“A”显示你组所在三人的姓名,学号 按下“B”显示一副图片(任意) 按下“C”显示2个周期的正弦波 “lcd.c”写一显示128个数据的函数 无返回值、形参为数据(0-4095)的首地址 Void Data_Display(unsigned int *dat) “main.c”定义大小为128的UINT型数组,并初始化 Unsigned int display_data[128]; 初始化为2个周期的正弦波数据(0~4095) “main.c”以该数组为实参,调用该函数显示波形 Data_Display(display_data);,。
