分享

【青风带你学stm32f051系列教程】第17课 点亮LCD液晶屏 | 爱板网

 weikong66 2013-03-28
【青风带你学stm32f051系列教程】第17课 点亮LCD液晶屏
2013年03月25日 ? 教程 ? 评论数 1 ? 被围观 224+

在嵌入式开发中,目前对于人机交互比较流行使用TFT-LCD彩屏,这是由于触摸屏的大量普及,价格上已经到达比较低的程度。他的用户体验方面是要远远胜过之前的一些单色屏,并且加入触摸之后,可以省略按钮,用于人机交互。

TFT-LCD属于真彩显示屏,目前手机,掌上游戏机,平板电脑等都在使用TFT。

QF_STM32F051评估板使用的触摸屏的控制器为ILI9328,采用16BIT并口输入数据,分辨率达到:320X240.分辨率其实是屏幕所具有的点的个数。230x240=76800个点。而每个点都是由三原色“红 绿 蓝”RGB组成,也就是说每个点可以配置成不同的颜色了。那么配置驱动采用ILI9328驱动器。ILI9328一般存在四种总线接口控制:

1. I80接口配置

2. VSYNC接口配置

3. SPI接口配置

4. RGB接口配置

其实是采用串口和并口的不同配置启动方式。为了保证驱动速度,我们一般采用I80接口配置方式。本开发采用16位方式。

下面就是16位驱动RPG的寄存器配置方式:

R5_R0为红色,G5_G0为绿色,B5_B0配置为蓝色。

硬件准备:

端口配置:

硬件连接:PB0-PB7---DB0-DB7 低8位

PC0-PC7---DB8-DB7 高8位

PD2---WR PC12---RD PC11---CS PC10---RS PB11---CM

其中WR :写信号输入引脚,低电平时有效。

RD :读信号输入引脚,低电平时有效。

CS:TFT液晶屏的片选信号,低电平时有效。

RS:写数据和写命令选择引脚。取高写数据,取低写命令。

CM:选择8BIT和16BIT选择引脚。

软件准备:

对于软件配置我们采用分层的方式:

这种方式虽然较为复杂,但是对于最底层的硬件驱动不同而已,上次的图形层和控制则不需要变换,可以很方便的移植到其他的显示屏上。这一节就是来讲解Display Driver的编写问题。

硬件连接好后,底层TFT-LCD的驱动是和硬件密切相关的,TFT-LCD液晶屏实际上是一个16位/8位的并行的数据接口。开发板上通过CM管脚选择了16位输入。ILI9328的驱动简单的说包含两个重要的函数:第一:我们确定向那个寄存器写数据。第二:确定寄存器后,决定写什么样的数据。

这两个函数编写代码如下,由于直接操作IO寄存器比较简单,这里面我选择了直接写寄存器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void LCD_WR_DATA(uint16_t val)//写数据
{
 Set_Rs;//开寄存器选择,选择写数据
 Clr_Cs; //片选置低
 GPIOB->ODR &= 0xff00;
 GPIOC->ODR &= 0xff00; //把PB,PC数据端口全部置低
 GPIOB->ODR|=((val)&(0x00ff));//写入低8位
 GPIOC->ODR|=(val>>8);//写入高八位
 Clr_nWr; //开写使能
 Set_nWr; //关使能
 Set_Cs; //关片选
}
void LCD_WR_REG(uint16_t cmd)//写命令
{
 Clr_Rs;;//开寄存器选择,选择写命令
 Clr_Cs;
 GPIOB->ODR &= 0xff00;
 GPIOC->ODR &= 0xff00;
 GPIOB->ODR |=((cmd)&(0x00ff));
 GPIOC->ODR|=(cmd>>8);
Clr_nWr;
Set_nWr;
 Set_Cs;
}

下面来说明下上面两个函数:写命令和写数据进程大体相当,不同的在于最开始通过Rs置低或者置高来进行选择,取高写数据,取低写命令。GPIOB->ODR采用ODR寄存器,表示IO口输出值。

对ILI9328Q驱动器常用的命令如下表:

那么要向某个确定寄存器写入数据可以编写成如下,直接调用上面两个子函数:

1
2
3
4
5
void LCD_WR_REG_DATA(uint16_t reg, uint16_t data)
{
 LCD_WR_REG(reg);//确定要写入的寄存器
 LCD_WR_DATA(data);//确定写入寄存器的数据
 }

下面我们就可以开始对TFT-LCD进行初始化,主要是多ILI9328驱动器进行初始化,首先初始化IO端口,然后按照ILI9328数据手册上的要求进行开机设置,详细信息请查看PDF。那么我们设置LCD初始化函数为:

1
void LCD_init (void)

下面编写一个进入LCD刷屏子函数,要求在屏幕上显示8条不同的颜色条纹。不同颜色的数据值如下面所列,我们只需要选择在不同区域填充不同颜色就可以。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#define RED 0XF800 //红色
#define GREEN 0X07E0 //绿色
#define BLUE 0X001F //蓝色
#define WHITE 0XFFFF //白色
#define BLACK 0X0000 //黑色
#define YELLOW 0XFFE0 //黄色
#define ORANGE 0XFC08 //橙色
#define GRAY 0X8430 //灰色
#define LGRAY 0XC618 //浅灰色
#define DARKGRAY 0X8410 //深灰色
#define PORPO 0X801F //紫色
#define PINK 0XF81F //粉红色
#define GRAYBLUE 0X5458 //灰蓝色
#define LGRAYBLUE 0XA651 //浅灰蓝色
#define DARKBLUE 0X01CF //深灰蓝色
#define LIGHTBLUE 0X7D7C //浅蓝色
  
void GLCD_Test(void)
{
 uint16_t i,j;
 Clr_Cs; //TFT进行片选
 LCD_WR_REG_DATA(0x20, 0);//确定写入的X坐标
 LCD_WR_REG_DATA(0x21, 0);//确定其写入的Y坐标
 LCD_WR_REG(0x22);//开始写入GRAM
  
 for(i=0;i<320;i++)
 for(j=0;j<240;j++)//循环写颜色
 {
 if(i>279)LCD_WR_DATA(0x0000);
 else if(i>239)LCD_WR_DATA(0x001f);
 else if(i>199)LCD_WR_DATA(0x07e0);
 else if(i>159)LCD_WR_DATA(0x07ff);
 else if(i>119)LCD_WR_DATA(0xf800);
 else if(i>79)LCD_WR_DATA(0xf81f);
 else if(i>39)LCD_WR_DATA(0xffe0);
 else LCD_WR_DATA(0xffff);
 }
 Set_Cs;
}

那么上面一个简单的刷屏程序就出炉了,当然我们还可以写一些小的函数验证液晶屏的好坏。

主函数可以直接进行调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "stm32f0xx.h"
#include "ili9328.h"
  
void Delay() //延迟函数
{
 int i,j;
 for(i=0;i<5000;i++)
 {
 for(j=0;j<5000;j++);
 }
}
  
int main()
{
 SystemInit(); // 时钟配置
 LCD_init(); // 液晶显示器初始化
 GLCD_Test();
 Delay();
LCD_Clear(WHITE); // 全屏显示白色
 POINT_COLOR = BLACK; // 定义笔的颜色为黑色
 BACK_COLOR = WHITE; // 定义笔的背景色为白色
 LCD_DrawRectage(20, 20, 180, 210, DARKBLUE); // 画一个深蓝色边框的矩形
 LCD_Fill(60, 20, 179, 209, PINK); // 画填充矩形
 POINT_COLOR = LIGHTBLUE; // 定义笔的颜色为浅蓝色
 LCD_DrawCircle(100, 100, 25); // 画一个圆
 LCD_ShowChar(120,20,'A');
 LCD_ShowString(140,20,"hello");
 while(1)
 {}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多