ILI93xx屏幕坐标系及扫描方式配置(LCD学习笔记1)

发布者:hylh2008最新更新时间:2021-11-26 来源: eefocus 手机看文章 扫描二维码
随时随地手机看文章

前言

博文基于STM32F103ZET6,MDK和3.5.0标准库开发

如有不足之处,多指教

屏幕坐标系(呵呵,我自己给取的名字)

在这里插入图片描述在这里插入图片描述在这里插入图片描述

R50h~R53h:水平垂直RAM地址位置;用来设定整个屏幕上的显示区域;

R50h(HSA[7:0]):水平起始地址寄存器

R51h(HEA[7:0]):水平结束地址寄存器

R52h(VSA[7:0]):垂直起始地址寄存器;

R53h(VEA[7:0]):垂直结束地址寄存器;


坐标系参数: 从上面的图片中和英文中可以了解,LCD屏幕上的每个像素点所对应GRAM显存单元是不能改变的,LCD屏幕默认为以人们习惯的竖屏方式的模板,以左上角点为坐标系原点,有方向为水平方向,下方向为垂直方向;如下图:

在这里插入图片描述

特点:


每个像素点对应的坐标是确定的,不会随竖屏/横屏模式的改变而改变,也不会随屏幕像素点扫描方式的改变而改变;

在程序的开始需要对以上四个寄存器进行配置,一般情况下都是全屏使用;当然后期如果需要更改显示区域大小,那就必须修改这四个寄存器的值了;比如开窗函数就是用来配置这四个寄存器;

8种扫描方式

8中扫描方式

在这里插入图片描述

配置用的寄存器

在这里插入图片描述

AM: GRAM更新方向控制位;可以理解为可以决定我们平时说的横屏还是竖屏;

0:地址水平更新扫描;(横屏模式)

1:地址垂直更新扫描;(竖屏模式)

当屏幕上所要打开的窗口被R50h~R53h寄存器配置结束后,GRAM范围根据I/D[1:0]和AM的配置更新扫描;

I/D: 地址计数器自增自减控制位;


值得注意的是: 上面截图中的扫描图片水平方向比垂直方向要宽,这很容易让人产生误解;


部分代码例程

/*lcd.h*/

/*屏幕扫描方向配置*/

typedef enum 

{

/*竖屏模式*/

L2R_U2D = 0, //从左到右,从上到下

L2R_D2U = 1, //从左到右,从下到上

R2L_U2D = 2, //从右到左,从上到下

R2L_D2U = 3, //从右到左,从下到上

/*横屏模式*/

U2D_L2R = 4, //从上到下,从左到右

U2D_R2L = 5, //从上到下,从右到左

D2U_L2R = 6, //从下到上,从左到右

D2U_R2L = 7, //从下到上,从右到左  

}LCD_Scan_Direction;


/*lcd.c*/

//开窗(LCD全屏)

LCD_WR_REG_Data(Horizontal_Address_Start_Position,0x0000);

LCD_WR_REG_Data(Horizontal_Address_End_Position,0x00EF);

  LCD_WR_REG_Data(Vertical_Address_Start_Position,0x0000);

LCD_WR_REG_Data(Vertical_Address_End_Position,0x013F);


/*设置屏幕扫描方向*/

void LCD_Scan_Dir_Config(uint8_t Scan_Direction)

{

uint16_t Reg_Value;

switch(Scan_Direction)

{

case L2R_U2D://从左到右,从上到下

Reg_Value|=(1<<5)|(1<<4)|(0<<3); 

break;

case L2R_D2U://从左到右,从下到上

Reg_Value|=(0<<5)|(1<<4)|(0<<3); 

break;

case R2L_U2D://从右到左,从上到下

Reg_Value|=(1<<5)|(0<<4)|(0<<3);

break;

case R2L_D2U://从右到左,从下到上

Reg_Value|=(0<<5)|(0<<4)|(0<<3); 

break;  

case U2D_L2R://从上到下,从左到右

Reg_Value|=(1<<5)|(1<<4)|(1<<3); 

break;

case U2D_R2L://从上到下,从右到左

Reg_Value|=(1<<5)|(0<<4)|(1<<3); 

break;

case D2U_L2R://从下到上,从左到右

Reg_Value|=(0<<5)|(1<<4)|(1<<3); 

break;

case D2U_R2L://从下到上,从右到左

Reg_Value|=(0<<5)|(0<<4)|(1<<3); 

break;  

}


Reg_Value |= 1<<12; //Entry_Mode寄存器中的AM和I/D[1:0]共同控制扫描方向

LCD_WR_REG_Data(Entry_Mode,Reg_Value); //写入ILI93xx寄存器;

}


注意: 每一种扫描方式的起始坐标都不同,这个一点在转换扫描方式的时候一定要注意,如果不注意会引起屏幕边缘显示错行或者缺失;

引用地址:ILI93xx屏幕坐标系及扫描方式配置(LCD学习笔记1)

上一篇:错误:error: #70: incomplete type is not allowed
下一篇:STM32中断挂起和RTOS任务挂起的区别

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved