学习液晶屏的一些体会_第1页
学习液晶屏的一些体会_第2页
学习液晶屏的一些体会_第3页
学习液晶屏的一些体会_第4页
学习液晶屏的一些体会_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

在这先深呼吸一口气先,学了两个星期的液晶屏,总算能把液晶屏当成一种显示来使用了。算然说不是用的很牛,但是普通的显示数码、字母、图片,还是可以滴会了这些,后面的还难吗!讲一下本人学习的经历吧!毕竟这才是大家所关注的,因为我们可以通过别人的学习经验与自己的进行对比,学习别人更加好的经验。和大家一样,初学液晶一般都是把配套的例程烧到ST中,然后看现象,然后就是在源程序中修改一些东西,看是否能够实现。改到后面的时候,就觉得很没趣,因为东西是别人的,总不能随心所欲的把自己想要显示的一些东西显示在液晶屏上,多多少少会受一些限制。于是就萌生了自己写液晶驱动代码,但是看过液晶源驱动的朋友就发现里面都是一大堆的16进制代码,怎么看也不懂!于是就复制驱动源程序到自己的工程上!毕竟液晶屏上显示一些东西自己才有成就嘛,但是当复制好,写好自己显示字符或者汉字的程序时,才发现一大推错误!于是一狠心就把整个源程序复制,这是它又能正常显示!呵呵呵。其实本人觉得这是一个过程,是初学者都要经历的一个过程。好了!废话了那么多,下面才是最关键的地方:我们知道,商家的开发板一般都可以驱动很多种不同控制器的液晶,所以为了增强程序的移植性,他都会设置好几种芯片驱动程序(本人用的是红牛板),至少红牛是,最让人郁闷的是他的程序代码中的函数名称都是用同一种驱动芯片的名字来命名,让初学者误认为就是这一种芯片控制器,但实际上却不是,看下面一段程序:/* 名 称:void ili9320_SetCursor(u16 x,u16 y)* 功 能:设置屏幕座标* 入口参数:x 行座标* y 列座标* 出口参数:无* 说 明:* 调用方法:ili9320_SetCursor(10,10);*/_inline void ili9320_SetCursor(u16 x,u16 y) if(DeviceCode=0x8989) LCD_WriteReg(0x004e,y); /行 LCD_WriteReg(0x004f,0x13f-x); /列 else if(DeviceCode=0x9919) LCD_WriteReg(0x004e,x); /行 LCD_WriteReg(0x004f,y); /列 else LCD_WriteReg(0x20,x); /行 LCD_WriteReg(0x21,y); /列 虽然函数_inline void ili9320_SetCursor(u16 x,u16 y)是以ILI9320驱动命名的,但是里面却是可以实现好几种不同的控制器的液晶显示所以一定要小心,用之前一定要用仿真器仿真一下,看程序往哪里跑,来确定自己液晶屏是哪一种控制器驱动的。到这会有朋友问,液晶屏的外表一样,驱动也一样吧?如果这样想你就错了,我就是曾经这样想,才白白浪费了我一个星期的时间,到后面才发现自己的控制芯片是另外一种,想死的心都有了!在这就不废话那么多了!要学液晶就要配合手册来学,一个个寄存器的去配置,其实也不难,难的是你看不懂洋文,总想找中文资料却找不到。教大家一个方法,就是用有道词典,不懂哪里点哪里!下面是本人写的程序,液晶控制芯片是SSD1298,尺寸:320*240:。与大家分享一下,希望写得不好的地方,高手点评一下,低手学习一下(包括本人):#includestm32f10x.h#includeSSD1289.h#includeChar8X16.h#includeChar12X24.h#includeChar20X40.h#includeChar24X48.h#includeziku_X_.h#includeChina32.h/*函数描述:函数的声明或者宏定义*参数输入:无*参数输出:无*函数说明:(LCD_TypeDef *) LCD_BASE)表示将LCD_BASE看成是一个指针,然后对其强制类型转换 0x指向内存的一个地址,从此地址开始赋值。例如:LCD.LCD_REG=0x202是指 将0x202存放在0x6C所指向的内存中,是给LCD_REG赋值,但不是什么偏移地址。*/ LCD is connected to the FSMC_Bank1_NOR/SRAM4 and NE4 is used as ship select signal#define LCD_BASE (u32)(0x | 0x0C)#define LCD (LCD_TypeDef *) LCD_BASE)/*函数描述:数据命令结构体的初始化*参数输入:无*参数输出:无*函数说明:*/typedef struct vu16 LCD_REG; /SSD1289写命令 vu16 LCD_RAM; /SSD1289写数据 LCD_TypeDef;/*函数名称: LCD_writeReg *函数描述: 写寄存器函数 *参数输入: u8 LCD_Reg:写寄存器地址 u16 LCD_RegValue:写数据 *参数输出: 无*返回值: 无*函数说明:*函数的调用:LCD_writeReg(0x0020,256)*/void LCD_WriteReg(u8 LCD_Reg,u16 LCD_RegValue) /* Write 16-bit Index, then Write Reg */ LCD-LCD_REG = LCD_Reg; /0x /* Write 16-bit Reg */ LCD-LCD_RAM = LCD_RegValue;/*函数名称: LCD_ReadReg *函数描述: 读寄存器函数 *参数输入: 无 *参数输出: u8 LCD_Reg:写寄存器地址*返回值: u16 LCD_RegValue*函数说明: 写寄存器地址,读回该地址的数据*函数的调用:Value=LCD_ReadReg()*/u16 LCD_ReadReg(u8 LCD_Reg) /* Write 16-bit Index (then Read Reg) */ LCD-LCD_REG = LCD_Reg; LCD-LCD_RAM; /* Read 16-bit Reg */ return (LCD-LCD_RAM);/*函数名称: LCD_WriteRAM_Prepare *函数描述: 开始写GGRAM信号 *参数输入: 无*参数输出: 无*返回值: 无*函数说明: *函数的调用: LCD_WriteRAM_Prepare()*/void LCD_WriteRAM_Prepare(void) LCD-LCD_REG = R34; /0x22/*函数名称: LCD_WriteRAM *函数描述: 写数据到GGRAM*参数输入: 无*参数输出: 无*返回值: 无*函数说明: - RGB_Code: the pixel color in RGB mode (5-6-5). 像素填充模式为:5-6-5模式*函数的调用:*/void LCD_WriteRAM(u16 RGB_Code) /* Write 16-bit GRAM Reg */ LCD-LCD_RAM = RGB_Code;/*函数名称: LCD_ReadRAM *函数描述: 从GGRAM读回数据*参数输入: 无*参数输出: 无*返回值: LCD RAM Value:即使LCD中RAM的值*函数说明: *函数的调用:*/u16 LCD_ReadRAM(void) vu16 dummy; /* Write 16-bit Index (then Read Reg) */ LCD-LCD_REG = R34; /* Select GRAM Reg */ /* Read 16-bit Reg */ dummy = LCD-LCD_RAM; return LCD-LCD_RAM;/*函数名称: LCD_SetCurso *函数描述: 设置光标 *参数输入: u16 Xpos:x坐标轴 。 u16 Ypos:Y坐标轴。*参数输出: *返回值: *函数说明: *函数的调用:*/void LCD_SetCursor(u16 Xpos, u16 Ypos) LCD_WriteReg(0x004E,Xpos ); /X坐标轴 LCD_WriteReg(0X004F,Ypos ); /Y坐标轴 /*函数名称: Delay *函数描述: 延时函数 *参数输入: u32 nCount:时间值 *参数输出: *返回值: *函数说明: *函数的调用:*/void Delay(u32 nCount) u32 TimingDelay; while(nCount-) for(TimingDelay=0;TimingDelay10000;TimingDelay+); /*函数名称: void SSD1289_SetCursor *函数描述: 设置屏幕座标 *参数输入: u16 x: 行座标* u16 y 列座标 *参数输出: 无 *返回值: *函数说明: *函数的调用:SSD1289_SetCursor(0,0)*/void SSD1289_SetCursor(u16 x,u16 y) LCD_WriteReg(0x004e,y); /行 LCD_WriteReg(0x004f,0x13f-x); /列/*函数名称: SSD1289_SetWindows *函数描述: 设置窗口的区域 *参数输入: u16 StartX:起始行坐标* u16 StartY:起始列坐标* u16 Height:窗口高* u16 Width :窗口宽* u16 Color : 窗口的区域的颜色值*参数输出: 无 *返回值: *函数说明: *函数的调用:SSD1289_SetWindows(0,0,119,159,Blue);*/void SSD1289_SetWindows(u16 StartX,u16 StartY,u16 Height,u16 Width,u16 Color) u16 i; LCD_WriteReg(0x44,StartX|(StartX+Width-1)8); /设置水平方向GRAM起始地址(低字节为起始地址,高字节为结束地址) LCD_WriteReg(0x45,StartY); /设置窗口的Y方向的开始位置 LCD_WriteReg(0x46,StartY+Height-1); /设置窗口的Y方向的结束位置 SSD1289_SetCursor(StartX,StartY); LCD_WriteRAM_Prepare(); /开始写GGRAM信号 for (i=0;i(Height*Width);i+) /对区域进行颜色打点 LCD_WriteRAM(Color); /*函数名称: SSD1289_Clear *函数描述: 将指定大小屏幕填充指定成的颜色,如清屏,则填0xffff *参数输入: u16 Color:填充颜色值 *参数输出: 无 *返回值: *函数说明: *函数的调用:SSD1289_Clear(0,0,319,239,0xffff)*/void SSD1289_Clear(u16 Color) u32 index=0; LCD_SetCursor(0,0); /以原点为起始坐标对320*240像素屏幕清 LCD_WriteRAM_Prepare(); /开始写GGRAM信号 for(index=0;indexLCD_RAM=Color; /*函数名称: SSD1289_SetPoint *函数描述: 指定坐标画点函数 *参数输入: u16 x: X坐标轴* u16 x: X坐标轴* u16 Color:点颜色*参数输出: 无 *返回值: 无 *函数说明: *函数的调用:SSD1289_SetPoint(10,10,Red)*/void SSD1289_SetPoint(u16 x,u16 y,u16 Color) if ( (x320)|(y240) ) return; /判断写的坐标值是否超出范围 SSD1289_SetCursor(x,y); LCD_WriteRAM_Prepare(); LCD_WriteRAM(Color);/*函数名称: SSD1289_DrawPicture *函数描述: 在指定座标范围显示一副图片*参数输入: StartX 行起始座标* StartY 列起始座标* u16 Height:窗口高* u16 Width: 窗口宽* pic 图片头指针*参数输出: 无 *返回值: 无 *函数说明: *函数的调用:SSD1289_DrawPicture(0,0,140,140,gImage_tupian);*/void SSD1289_DrawPicture(u16 StartX,u16 StartY,u16 Height,u16 Width,u8 *pic) u32 i; u16 *bitmap = (u16 *)pic; LCD_WriteReg(0x44,StartX|(StartX+Width-1)8); /设置水平方向GRAM起始地址(低字节为起始地址,高字节为结束地址) LCD_WriteReg(0x45,StartY); /设置窗口的Y方向的开始位置 LCD_WriteReg(0x46,StartY+Height-1); /设置窗口的Y方向的结束位置 LCD_SetCursor(StartX,StartY ); /设置光标 LCD_WriteRAM_Prepare(); /开始写GGRAM信号 for (i=0;i(Height*Width);i+) /读取图片信息 LCD_WriteRAM(*bitmap+); LCD_WriteReg(0x44,0|2398); /设置窗口的X方向开始位置和结束位置 LCD_WriteReg(0x45,0); /设置窗口的Y方向的开始位置 LCD_WriteReg(0x46,319); /设置窗口的Y方向的结束位置/*函数名称: SSD1289_PutChar8X16 *函数描述: 在指定座标范围显示一个8X16 ASCLL字符*参数输入: u16 X :横座标* u16 Y :纵座标* u8 c :字符* u16 charColor: 字符颜色* u16 bkColor : 字符背景颜色 *参数输出: 无 *返回值: 无 *函数说明: 高:16位像素点。宽:8位像素点 *函数的调用:void SSD1289_PutChar8X16(0,0,52,Red,Black)*/void SSD1289_PutChar8X16(u16 x,u16 y,u8 c,u16 charColor,u16 bkColor) u16 i=0,j=0,k=0,map=0; u8 tmp_char=0; for(i=0;i16;i+) /可理解为字符高 map=0; for(k=0;k1;k+) /行的字节数,例如:像素8X16,即横8个点(一个字节),竖直16个点 tmp_char=nAsciiDot_8X16c-0x20i*1+k; /0x20为ASCLL的内码,读取ASCLL码的字符模值 for(j=0;jj) & 0x01=0x01) /如果读回的值为高电平则打charColor点 LCD_SetCursor(x+j+map),(y+i); LCD_WriteRAM_Prepare(); LCD_WriteRAM(charColor); else /否则打charColor点 LCD_SetCursor(x+j+map),(y+i); LCD_WriteRAM_Prepare(); LCD_WriteRAM(bkColor); /*函数名称: SSD1289_PutChar12X24 *函数描述: 在指定座标范围显示一个12X24 ASCLL字符*参数输入: u16 X :横座标* u16 Y :纵座标* u8 c :字符* u16 charColor: 字符颜色* u16 bkColor : 字符背景颜色 *参数输出: 无 *返回值: 无 *函数说明: 高:24位像素点。宽:16位像素点 *函数的调用:void SSD1289_PutChar12X24(0,0,52,Red,Black)*/void SSD1289_PutChar12X24(u16 x,u16 y,u8 c,u16 charColor,u16 bkColor) u16 i=0,j=0,k=0,map=0; u8 tmp_char=0; for(i=0;i24;i+) /可理解为字符高 map=0; /行位地址偏移量 for(k=0;k2;k+) /行的字节数,例如:像素8X16,即横8个点(一个字节),竖直16个点 tmp_char=nAsciiDot_12X24c-0x20i*2+k; /C-0x20为ASCLL的内码字符偏移量,i*2+k可以理解为数组行个数 for(j=0;jj) & 0x01=0x01) /如果读回的值为高电平则打charColor点 LCD_SetCursor(x+j+map),(y+i); LCD_WriteRAM_Prepare(); LCD_WriteRAM(charColor); else /否则打charColor点 LCD_SetCursor(x+j+map),(y+i); LCD_WriteRAM_Prepare(); LCD_WriteRAM(bkColor); map+=8; /每循环一次偏移8位 /*函数名称: SSD1289_PutChar20X40*函数描述: 在指定座标范围显示一个20X40 ASCLL字符*参数输入: u16 X :横座标* u16 Y :纵座标* u8 c :字符* u16 charColor: 字符颜色* u16 bkColor : 字符背景颜色 *参数输出: 无 *返回值: 无 *函数说明: 高:40位像素点。宽:24位像素点 *函数的调用:void SSD1289_PutChar20X40(0,0,52,Red,Black)*/void SSD1289_PutChar20X40(u16 x,u16 y,u8 c,u16 charColor,u16 bkColor) u16 i=0,j=0,k=0,map=0; u8 tmp_char=0; for(i=0;i40;i+) /可理解为字符高 map=0; /行位地址偏移量 for(k=0;k3;k+) /行的字节数,例如:像素8X16,即横8个点(一个字节),竖直16个点 tmp_char=nAsciiDot_20X40c-0x20i*3+k; /C-0x20为ASCLL的内码字符偏移量,i*2+k可以理解为数组行个数 for(j=0;jj) & 0x01=0x01) /如果读回的值为高电平则打charColor点 LCD_SetCursor(x+j+map),(y+i); LCD_WriteRAM_Prepare(); LCD_WriteRAM(charColor); else /否则打charColor点 LCD_SetCursor(x+j+map),(y+i); LCD_WriteRAM_Prepare(); LCD_WriteRAM(bkColor); map+=8; /每循环一次偏移8位 /*函数名称: SSD1289_PutChar24X48*函数描述: 在指定座标范围显示一个20X40 ASCLL字符*参数输入: u16 X :横座标 (0X240)* u16 Y :纵座标 (0Y320)* u8 c :字符* u16 charColor: 字符颜色* u16 bkColor : 字符背景颜色 *参数输出: 无 *返回值: 无 *函数说明: 高:48位像素点。宽:24位像素点 *函数的调用:void SSD1289_PutChar24X48(0,0,52,Red,Black)*/void SSD1289_PutChar24X48(u16 x,u16 y,u8 c,u16 charColor,u16 bkColor) u16 i=0,j=0,k=0,map=0; u8 tmp_char=0; for(i=0;i48;i+) /可理解为字符高 map=0; /行位地址偏移量 for(k=0;k3;k+) /行的字节数,例如:像素8X16,即横8个点(一个字节),竖直16个点 t

温馨提示

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

评论

0/150

提交评论