学习液晶屏的一些体会.docx
- 文档编号:13062934
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:30
- 大小:20.27KB
学习液晶屏的一些体会.docx
《学习液晶屏的一些体会.docx》由会员分享,可在线阅读,更多相关《学习液晶屏的一些体会.docx(30页珍藏版)》请在冰豆网上搜索。
学习液晶屏的一些体会
在这先深呼吸一口气先,学了两个星期的液晶屏,总算能把液晶屏当成一种显示来使用了。
算然说不是用的很牛,但是普通的显示数码、字母、图片,还是可以滴~~~
会了这些,后面的还难吗!
讲一下本人学习的经历吧!
毕竟这才是大家所关注的,因为我们可以通过别人的学习经验与自己的进行对比,学习别人更加好的经验。
和大家一样,初学液晶一般都是把配套的例程烧到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)
**************************************************************************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学习 液晶屏 一些 体会