基于STM32的LCD操作.doc_第1页
基于STM32的LCD操作.doc_第2页
基于STM32的LCD操作.doc_第3页
基于STM32的LCD操作.doc_第4页
基于STM32的LCD操作.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统课程报告基于STM32的LCD操作姓 名 组长:曾昭智组员:邓宁、张小扬、牛洪澄学 院光电学院班 级电信2班、3班完成日期2014.05.29 目 录1、原理方案(功能框图介绍)12、电路连线及资源分配23、所用主要器件或模块说明34、程序流程图45、调试心得56、源代码6基于STM32的LCD操作1.TFT-LCD原理1.1 TFT-LCD简介TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。上一节介绍了OLED模块,这一节,我们给大家介绍ALIENTEK TFTLCD模块,该模块有如下特点: 1,2.4/2.8两种大小的屏幕可选。2,320240的分辨率。3,16位真彩显示。4,自带触摸屏,可以用来作为控制输入。5,通用的接口,除了ALIENTEK MiniSTM32开发板,该液晶模块还可以使用在优异特、STMSKY、红牛等开发板上。本节,我们以2.8寸的ALIENTEK TFTLCD模块为例介绍,该模块采用的是显尚光电的DST2001PH TFTLCD,DST2001PH的控制器为ILI9320,采用26万色的TFTLCD屏,分辨率为320240,采用16位的80并口。 1.2 80并口ALIENTEK TFTLCD模块采用80并口口方与外部链接,采用16位数据线(低了速度太慢,用彩色就没什么效果了)。该模块的80并口有如下一些信号线: CS:TFTLCD片选信号。 WR:向TFTLCD写入数据。 RD:从TFTLCD读取数据。 D15:0:16位双向数据线。 RST:硬复位TFTLCD。 RS:命令/数据标志(0,读写命令;1,读写数据)。TFTLCD模块的RST信号线和OLED模块一样,也是直接接到STM32的复位脚上,并不由软件控制,这样可以省下来一个IO口。另外我们还需要一个背光控制线来控制TFTLCD的背光。所以,我们总共需要的IO口数目为21个。1.3 ILI9320 模块的控制器为ILI9320,该控制器自带显存,其显存总大小为172820(240*320*18/8),即18位模式(26万色)下的显存量。模块的16位数据线与显寸的对应关系为565方式,如下图所示: 1.4 GRAM显示方向设置1.5 TFTLCD显示需要的相关设置步骤如下(1)设置STM32与TFTLCD模块相连接的IO。这一步,先将我们与TFTLCD模块相连的IO口设置为输出,具体使用哪些IO口,这里需要根据连接电路以及TFTLCD模块的设置来确定。(2)初始化TFTLCD模块。其实这里就是上和上面OLED模块的初始化过程差不多。通过向TFTLCD写入一系列的设置,来启动TFTLCD的显示。为后续显示字符和数字做准备。(3)通过函数将字符和数字显示到TFTLCD模块上。这里就是通过我们设计的程序,将要显示的字符送到TFTLCD模块就可以了,这些函数将在软件设计部分向大家介绍。通过以上三步,我们就可以使用ALIENTEK TFTLCD模块来显示字符和数字了, 并且可以显示各种颜色的背景。2. 电路连线及资源分配 MiniSTM32开发板底板的LCD接口和ALIENTEK TFTLCD模块直接可以对插,连接如下图: 图中绿色线圈出来的部分就是连接TFTLCD模块的接口,这里在硬件上,TFTLCD模块与MiniSTM32开发板的IO口对应关系如下: LCD_LED对应PC10; LCD_CS对应PC9; LCD _RS对应PC8; LCD _WR对应PC7; LCD _RD对应PC6; LCD _D17:1对应PB15:0; 这些线的连接,MiniSTM32的内部已经连接好了,我们只需要将TFTLCD模块插上去就好了。3.所用主要器件或模块说明3.1 TFT-LCD模块原理图3.2 TFT-LCD模块接口图4.程序流程图写入数据读取数据读取GRAM设置坐标画点显示5.调试心得调试之前需将MiniSTM32开发板连接至PC并且安装好相应的驱动程序;在调试程序的时候将错误程序下载到MiniSTM32中会导致LCD屏无法打开或者是白屏的现象,程序与开发板不兼容也会产生同样现象;并且在使用Keil调试的时候没有进行正确的设置也会导致下载程序无法顺利进行。所以在调试的时候要确保程序的正确及对Keil的正确的使用才能顺利完成实验。调试结果(到屏幕的背景是不停切换的):6.源代码6.1 LCD_WR_REG函数:通过80并口向LCD模块写入8位的寄存器命令#if LCD_FAST_IO=1 /快速IOvoid LCD_WR_REG(u8 data) LCD_RS_CLR;/写地址 LCD_CS_CLR; DATAOUT(data); LCD_WR_CLR; LCD_WR_SET; LCD_CS_SET; #else/正常IO/写寄存器函数void LCD_WR_REG(u8 data) LCD_RS=0;/写地址 LCD_CS=0; DATAOUT(data); LCD_WR=0; LCD_WR=1; LCD_CS=1; #endif6.2 LCD_READREG:用来读取某个寄存器的值/读寄存器u16 LCD_ReadReg(u8 LCD_Reg) u16 t;LCD_WR_REG(LCD_Reg); /写入要读的寄存器号 GPIOB-CRL=0X88888888; /PB0-7 上拉输入GPIOB-CRH=0X88888888; /PB8-15 上拉输入GPIOB-ODR=0XFFFF; /全部输出高#if LCD_FAST_IO=1 /快速IOLCD_RS_SET;LCD_CS_CLR;/读取数据(读寄存器时,并不需要读2次)LCD_RD_CLR;delay_us(5);/FOR 8989,延时5us LCD_RD_SET;t=DATAIN; LCD_CS_SET; #elseLCD_RS=1;LCD_CS=0;/读取数据(读寄存器时,并不需要读2次)LCD_RD=0; LCD_RD=1;t=DATAIN; LCD_CS=1; #endif GPIOB-CRL=0X33333333; /PB0-7 上拉输出GPIOB-CRH=0X33333333; /PB8-15 上拉输出GPIOB-ODR=0XFFFF; /全部输出高return t; 6.3 LCD_ReadRAM:用来读取GRAM的值/读取个某点的颜色值 /x:0239/y:0319/返回值:此点的颜色u16 LCD_ReadPoint(u16 x,u16 y)u16 t;if(x=LCD_W|y=LCD_H)return 0;/超过了范围,直接返回 LCD_SetCursor(x,y);LCD_WR_REG(R34); /选择GRAM地址 GPIOB-CRL=0X88888888; /PB0-7 上拉输入GPIOB-CRH=0X88888888; /PB8-15 上拉输入GPIOB-ODR=0XFFFF; /全部输出高#if LCD_FAST_IO=1 /快速IOLCD_RS_SET;LCD_CS_CLR;/读取数据(读GRAM时,需要读2次)LCD_RD_CLR; LCD_RD_SET;delay_us(2);/FOR 9320,延时2us /dummy READLCD_RD_CLR; delay_us(2);/FOR 8989,延时2us LCD_RD_SET;t=DATAIN; LCD_CS_SET;#elseLCD_RS=1;LCD_CS=0;/读取数据(读GRAM时,需要读2次)LCD_RD=0; LCD_RD=1; /dummy READLCD_RD=0; LCD_RD=1;t=DATAIN; LCD_CS=1; #endif GPIOB-CRL=0X33333333; /PB0-7 上拉输出GPIOB-CRH=0X33333333; /PB8-15 上拉输出GPIOB-ODR=0XFFFF; /全部输出高 if(DeviceCode=0X4531|DeviceCode=0X8989|DeviceCode=0XB505)return t;/这几种IC直接返回颜色值else return LCD_BGR2RGB(t);6.4 LCD_SetCursor:用于设置坐标void LCD_SetCursor(u16 Xpos, u16 Ypos)#if USE_HORIZONTAL=1 if(DeviceCode=0X8989)LCD_WriteReg(0X4E, Ypos);LCD_WriteReg(0X4F, 319-Xpos); elseLCD_WriteReg(R32, Ypos);LCD_WriteReg(R33, 319-Xpos); #elseif(DeviceCode=0X8989)LCD_WriteReg(0X4E, Xpos);LCD_WriteReg(0X4F, Ypos); elseLCD_WriteReg(R32, Xpos);LCD_WriteReg(R33, Ypos); #endif 6.5 POINT_COLOR:画点函数void LCD_DrawPoint(u16 x,u16 y)LCD_SetCursor(x,y);/设置光标位置 LCD_WR_REG(R34);/开始写入GRAMLCD_WR_DATA(POINT_COLOR); 6.6 LCD_ShowChar:显示字符/在指定位置显示一个字符/x:0234/y:0308/num:要显示的字符: -/size:字体大小 12/16/mode:叠加方式(1)还是非叠加方式(0)void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode) #if USE_HORIZONTAL=1#define MAX_CHAR_POSX 312#define MAX_CHAR_POSY 232 #else #define MAX_CHAR_POSX 232#define MAX_CHAR_POSY 312#endif u8 temp; u8 pos,t;u16 x0=x;u16 colortemp=POINT_COLOR; if(xMAX_CHAR_POSX|yMAX_CHAR_POSY)return; /设置窗口 num=num- ;/得到偏移后的值if(!mode) /非叠加方式for(pos=0;possize;pos+)if(size=12)temp=asc2_1206numpos;/调用1206字体else temp=asc2_1608numpos; /调用1608字体for(t=0;t=1; x+; x=x0;y+;else/叠加方式for(pos=0;possize;pos+)if(size=12)temp=asc2_1206numpos;/调用1206字体else temp=asc2_1608numpos; /调用1608字体for(t=0;t=1; POINT_COLOR=colortemp; 6.7 LCD_Init(简化):初始化模块void LCD_Init(void) u16 DeviceCode; RCC-APB2ENR|=1APB2ENR|=1APB2ENR|=1MAPR=0X04000000; /关闭JTAG /PORTC610复用推挽输出 GPIOC-CRH&=0XFFFFF000; GPIOC-CRH|=0X00000333; GPIOC-CRL&=0X00FFFFFF; GPIOC-CRL|=0X33000000; GPIOC-ODR|=0X07C0; /PORTB 推挽输出 GPIOB-CRH=0X33333333; GPIOB-CRL=0X33333333; GPIOB-ODR=0XFFFF; Delay(5); / delay 50 ms LCD_WriteReg(0x0000,0x0001); Delay(5); / delay 50 ms DeviceCode = LCD_ReadReg(0x0000); /printf(ID:%dn,DeviceCode); if(DeviceCode=0x9325|DeviceCode=0x9328)/ILI9325 /9325/9328初始化代码 else if(DeviceCode=0x9320|DeviceCode=0x9300) /9320/9300初始化代码 else if(DeviceCode=0x1505) /1505初始化代码 else if(DeviceCode=0x8989) /8989初始化代码 Delay(5000); LCD_Clear(WHITE); 6.8 输入以下代码(简化代码)来控制I/O口,当使用快速模式来控制的时候,就可以有效提升速度。另外这段代码对颜色和驱动器的寄存器进行了很多宏定义:#ifndef _LCD_H #define _LCD_H #include sys.h #include stdlib.h /TFTLCD部分外要调用的函数 extern u16 POINT_COLOR;/默认红色 extern u16 BACK_COLOR; /背景颜色.默认为白色/-LCD端口定义- #define LCD_LED PCout(10) /LCD背光 PC10 #define LCD_CS PCout(9) /片选端口 PC9 #define LCD_RS PCout(8) /数据/命令 PC8 #define LCD_WR PCout(7) /写数据 PC7 #define LCD_RD PCout(6) /读数据 PC6 /PB015,作为数据线#define DATAOUT(x) GPIOB-ODR=x; /数据输出#define DATAIN GPIOB-IDR; /数据输入 /画笔颜色#define WHITE 0xFFFF #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define MAGENTA 0xF81F #define GREEN 0x07E0 #define CYAN 0x7FFF #define YELLOW 0xFFE0 #define BROWN 0XBC40 /棕色#define BRRED 0XFC07 /棕红色#define GRAY 0X8430 /灰色#define LGRAY 0XC618 /浅灰色 extern u16 BACK_COLOR, POINT_COLOR ; void LCD_Init(void); void LCD_Clear(u16 Color); void LCD_SetCursor(u8 Xpos, u16 Ypos); void LCD_DrawPoint(u8 x,u16 y);/画点void Draw_Circle(u8 x0,u16 y0,u8 r); void LCD_DrawLine(u8 x1, u16 y1, u8 x2, u16 y2); void LCD_DrawRectangle(u8 x1, u16 y1, u8 x2, u16 y2); void LCD_Fill(u8 xsta,u16 ysta,u8 xend,u16 yend,u16 color); void LCD_ShowChar(u8 x,u16 y,u8 num,u8 size,u8 mode);/显示一个字符void LCD_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size); /显示一个数字void LCD_ShowString(u8 x,u16 y,const u8 *p); /显示一个字符串,16字体 void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue); u16 LCD_ReadReg(u8 LCD_Reg); void LCD_WriteRAM_Prepare(void); void LCD_WriteRAM(u16 RGB_Code); u16 LCD_ReadRAM(void); /9320/9325 LCD寄存器 #define R0 0x00 #define R1 0x01 #define R2 0x02 /寄存器定义区#define R192 0xC0 #define R193 0xC1 #define R229 0xE5 #endif 6.9 Test中的main函数:该部分代码将

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论