学习液晶屏的一些体会.docx

上传人:b****3 文档编号:3861349 上传时间:2022-11-25 格式:DOCX 页数:25 大小:21.21KB
下载 相关 举报
学习液晶屏的一些体会.docx_第1页
第1页 / 共25页
学习液晶屏的一些体会.docx_第2页
第2页 / 共25页
学习液晶屏的一些体会.docx_第3页
第3页 / 共25页
学习液晶屏的一些体会.docx_第4页
第4页 / 共25页
学习液晶屏的一些体会.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

学习液晶屏的一些体会.docx

《学习液晶屏的一些体会.docx》由会员分享,可在线阅读,更多相关《学习液晶屏的一些体会.docx(25页珍藏版)》请在冰豆网上搜索。

学习液晶屏的一些体会.docx

学习液晶屏的一些体会

在这先深呼吸一口气先,学了两个星期的液晶屏,总算能把液晶屏当成一种显示来使用了。

算然说不是用的很牛,但是普通的显示数码、字母、图片,还是可以滴~~~

会了这些,后面的还难吗!

讲一下本人学习的经历吧!

毕竟这才是大家所关注的,因为我们可以通过别人的学习经验与自己的进行对比,学习别人更加好的经验。

和大家一样,初学液晶一般都是把配套的例程烧到ST中,然后看现象,然后就是在源程序中修改一些东西,看是否能够实现。

改到后面的时候,就觉得很没趣,因为东西

是别人的,总不能随心所欲的把自己想要显示的一些东西显示在液晶屏上,多多少少会受一些限制。

于是就萌生了自己写液晶驱动代码,但是看过液晶源驱动的朋友就发现

里面都是一大堆的16进制代码,怎么看也不懂!

于是就复制驱动源程序到自己的工程上!

毕竟液晶屏上显示一些东西自己才有成就嘛,但是当复制好,写好自己显示字符或者

汉字的程序时,才发现一大推错误!

于是一狠心就把整个源程序复制,这是它又能正常显示!

呵呵呵。

其实本人觉得这是一个过程,是初学者都要经历的一个过程。

好了!

废话了那么多,下面才是最关键的地方:

我们知道,商家的开发板一般都可以驱动很多种不同控制器的液晶,所以为了增强程序的移植性,他都会设置好几种芯片驱动程序(本人用的是红牛板),至少红牛是,最让人郁闷的

是他的程序代码中的函数名称都是用同一种驱动芯片的名字来命名,让初学者误认为就是这一种芯片控制器,但实际上却不是,看下面一段程序:

/****************************************************************************

*名称:

voidili9320_SetCursor(u16x,u16y)

*功能:

设置屏幕座标

*入口参数:

x行座标

*y列座标

*出口参数:

*说明:

*调用方法:

ili9320_SetCursor(10,10);

****************************************************************************/

__inlinevoidili9320_SetCursor(u16x,u16y)

{

if(DeviceCode==0x8989)

{

LCD_WriteReg(0x004e,y);//行

LCD_WriteReg(0x004f,0x13f-x);//列

}

elseif(DeviceCode==0x9919)

{

LCD_WriteReg(0x004e,x);//行

LCD_WriteReg(0x004f,y);//列

}

else

{

LCD_WriteReg(0x20,x);//行

LCD_WriteReg(0x21,y);//列

}

}

虽然函数__inlinevoidili9320_SetCursor(u16x,u16y)是以ILI9320驱动命名的,但是里面却是可以实现好几种不同的控制器的液晶显示

所以一定要小心,用之前一定要用仿真器仿真一下,看程序往哪里跑,来确定自己液晶屏是哪一种控制器驱动的。

到这会有朋友问,液晶屏

的外表一样,驱动也一样吧?

如果这样想你就错了,我就是曾经这样想,才白白浪费了我一个星期的时间,到后面才发现自己的控制芯片是另外

一种,想死的心都有了!

在这就不废话那么多了!

要学液晶就要配合手册来学,一个个寄存器的去配置,其实也不难,难的是你看不懂洋文,总想找中文资料却找不到。

教大家一个方法,就是用

有道词典,不懂哪里点哪里!

下面是本人写的程序,液晶控制芯片是SSD1298,尺寸:

320*240:

与大家分享一下,希望写得不好的地方,高手

点评一下,低手学习一下(包括本人):

#include"stm32f10x.h"

#include"SSD1289.h"

#include"Char8X16.h"

#include"Char12X24.h"

#include"Char20X40.h"

#include"Char24X48.h"

#include"ziku_X_.h"

#include"China32.h"

/***************************************************************************************************

*函数描述:

函数的声明或者宏定义

*参数输入:

*参数输出:

*函数说明:

((LCD_TypeDef*)LCD_BASE)表示将LCD_BASE看成是一个指针,然后对其强制类型转换

0x60000000指向内存的一个地址,从此地址开始赋值。

例如:

LCD.LCD_REG=0x202是指

将0x202存放在0x6C000000所指向的内存中,是给LCD_REG赋值,但不是什么偏移地址。

****************************************************************************************************/

//LCDisconnectedtotheFSMC_Bank1_NOR/SRAM4andNE4isusedasshipselectsignal

#defineLCD_BASE((u32)(0x60000000|0x0C000000))

#defineLCD((LCD_TypeDef*)LCD_BASE)

/***************************************************************************************************

*函数描述:

数据命令结构体的初始化

*参数输入:

*参数输出:

*函数说明:

****************************************************************************************************/

typedefstruct

{

vu16LCD_REG;//SSD1289写命令

vu16LCD_RAM;//SSD1289写数据

}LCD_TypeDef;

/****************************************************************************************************

*函数名称:

LCD_writeReg

*函数描述:

写寄存器函数

*参数输入:

u8LCD_Reg:

写寄存器地址

u16LCD_RegValue:

写数据

*参数输出:

*返回值:

*函数说明:

*函数的调用:

LCD_writeReg(0x0020,256)

*****************************************************************************************************/

voidLCD_WriteReg(u8LCD_Reg,u16LCD_RegValue)

{

/*Write16-bitIndex,thenWriteReg*/

LCD->LCD_REG=LCD_Reg;//0x60000000

/*Write16-bitReg*/

LCD->LCD_RAM=LCD_RegValue;

}

/****************************************************************************************************

*函数名称:

LCD_ReadReg

*函数描述:

读寄存器函数

*参数输入:

*参数输出:

u8LCD_Reg:

写寄存器地址

*返回值:

u16LCD_RegValue

*函数说明:

写寄存器地址,读回该地址的数据

*函数的调用:

Value=LCD_ReadReg()

*****************************************************************************************************/

u16LCD_ReadReg(u8LCD_Reg)

{

/*Write16-bitIndex(thenReadReg)*/

LCD->LCD_REG=LCD_Reg;

LCD->LCD_RAM;

/*Read16-bitReg*/

return(LCD->LCD_RAM);

}

/****************************************************************************************************

*函数名称:

LCD_WriteRAM_Prepare

*函数描述:

开始写GGRAM信号

*参数输入:

*参数输出:

*返回值:

*函数说明:

*函数的调用:

LCD_WriteRAM_Prepare()

*****************************************************************************************************/

voidLCD_WriteRAM_Prepare(void)

{

LCD->LCD_REG=R34;//0x22

}

/****************************************************************************************************

*函数名称:

LCD_WriteRAM

*函数描述:

写数据到GGRAM

*参数输入:

*参数输出:

*返回值:

*函数说明:

-RGB_Code:

thepixelcolorinRGBmode(5-6-5).

像素填充模式为:

5-6-5模式

*函数的调用:

*****************************************************************************************************/

voidLCD_WriteRAM(u16RGB_Code)

{

/*Write16-bitGRAMReg*/

LCD->LCD_RAM=RGB_Code;

}

/****************************************************************************************************

*函数名称:

LCD_ReadRAM

*函数描述:

从GGRAM读回数据

*参数输入:

*参数输出:

*返回值:

LCDRAMValue:

即使LCD中RAM的值

*函数说明:

*函数的调用:

*****************************************************************************************************/

u16LCD_ReadRAM(void)

{

vu16dummy;

/*Write16-bitIndex(thenReadReg)*/

LCD->LCD_REG=R34;/*SelectGRAMReg*/

/*Read16-bitReg*/

dummy=LCD->LCD_RAM;

returnLCD->LCD_RAM;

}

/****************************************************************************************************

*函数名称:

LCD_SetCurso

*函数描述:

设置光标

*参数输入:

u16Xpos:

x坐标轴。

u16Ypos:

Y坐标轴。

*参数输出:

*返回值:

*函数说明:

*函数的调用:

*****************************************************************************************************/

voidLCD_SetCursor(u16Xpos,u16Ypos)

{

LCD_WriteReg(0x004E,Xpos);//X坐标轴

LCD_WriteReg(0X004F,Ypos);//Y坐标轴

}

/****************************************************************************************************

*函数名称:

Delay

*函数描述:

延时函数

*参数输入:

u32nCount:

时间值

*参数输出:

*返回值:

*函数说明:

*函数的调用:

*****************************************************************************************************/

voidDelay(u32nCount)

{

u32TimingDelay;

while(nCount--)

{

for(TimingDelay=0;TimingDelay<10000;TimingDelay++);

}

}

/****************************************************************************************************

*函数名称:

voidSSD1289_SetCursor

*函数描述:

设置屏幕座标

*参数输入:

u16x:

行座标

*u16y列座标

*参数输出:

*返回值:

*函数说明:

*函数的调用:

SSD1289_SetCursor(0,0)

*****************************************************************************************************/

voidSSD1289_SetCursor(u16x,u16y)

{

LCD_WriteReg(0x004e,y);//行

LCD_WriteReg(0x004f,0x13f-x);//列

}

/****************************************************************************************************

*函数名称:

SSD1289_SetWindows

*函数描述:

设置窗口的区域

*参数输入:

u16StartX:

起始行坐标

*u16StartY:

起始列坐标

*u16Height:

窗口高

*u16Width:

窗口宽

*u16Color:

窗口的区域的颜色值

*参数输出:

*返回值:

*函数说明:

*函数的调用:

SSD1289_SetWindows(0,0,119,159,Blue);

*****************************************************************************************************/

voidSSD1289_SetWindows(u16StartX,u16StartY,u16Height,u16Width,u16Color)

{

u16i;

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

*参数输入:

u16Color:

填充颜色值

*参数输出:

*返回值:

*函数说明:

*函数的调用:

SSD1289_Clear(0,0,319,239,0xffff)

*****************************************************************************************************/

voidSSD1289_Clear(u16Color)

{

u32index=0;

LCD_SetCursor(0,0);//以原点为起始坐标对320*240像素屏幕清

LCD_WriteRAM_Prepare();//开始写GGRAM信号

for(index=0;index<76800;index++)//320*240=76800清屏像素

{

LCD->LCD_RAM=Color;

}

}

/****************************************************************************************************

*函数名称:

SSD1289_SetPoint

*函数描述:

指定坐标画点函数

*参数输入:

u16x:

X坐标轴

*u16x:

X坐标轴

*u16Color:

点颜色

*参数输出:

*返回值:

*函数说明:

*函数的调用:

SSD1289_SetPoint(10,10,Red)

*****************************************************************************************************/

voidSSD1289_SetPoint(u16x,u16y,u16Color)

{

if((x>320)||(y>240))return;//判断写的坐标值是否超出范围

SSD1289_SetCursor(x,y);

LCD_WriteRAM_Prepare();

LCD_WriteRAM(Color);

}

/****************************************************************************************************

*函数名称:

SSD1289_DrawPicture

*函数描述:

在指定座标范围显示一副图片

*参数输入:

StartX行起始座标

*StartY列起始座标

*u16Height:

窗口高

*u16Width:

窗口宽

*pic图片头指针

*参数输出:

*返回值:

*函数说明:

*函数的调用:

SSD1289_DrawPicture(0,0,140,140,gImage_tupian);

*****************************************************************************************************/

voidSSD1289_DrawPicture(u16StartX,u16StartY,u16Height,u16Width,u8*pic)

{

u32i;

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|239<<8);//设置窗口的X方向开始位置和结束位置

LCD_WriteReg(0x45,0);//设置窗口的Y方向的开始位置

LCD_WriteReg(0x46,319);//设置窗口的Y方向的结束位置

}

/****************************************************************************************************

*函数名称:

SSD1289_PutChar8X16

*函数描述:

在指定座标范围显示一个8X16ASCLL字符

*参数输入:

u16X:

横座标

*u16Y:

纵座标

*u8c:

字符

*u16charColor:

字符颜色

*u16bkColor:

字符背景颜色

*参数输出:

*返回值:

*函数说明:

高:

16位像素点。

宽:

8位像素点

*函数的调用:

voidSSD1289_PutChar8X16(0,0,52,Red,Black)

**************************************************************************************************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1