- 打卡等级:以坛为家II
- 打卡总天数:501
- 最近打卡:2025-05-09 08:51:43
荣誉版主
- 积分
- 3541
|
发表于 2024-5-7 21:16:33
|
显示全部楼层
本帖最后由 浦江一水 于 2024-5-7 22:26 编辑
2,关于LCD显示屏的横竖屏切换;
显示屏横竖屏切换. 主要看初始化的代码了...
大凡显示屏的初始化代码, 一般都由厂家提供, 如果厂家不提供, 任何人, 再聪明, 两辈子也猜不出来的.
要根据资料说明,研究清楚初始化中的代码: 对相关寄存器, 写入不同的数据, 就可以了实现切换了.
比如这款显示屏, 无论带不带键盘, 屏都是ST7735驱动, 因此驱动初始化是一样的.
我自己整理了一下是这样的:
//========================================================
// ST7735 显示屏初始化
//========================================================
void LCD_Init(void)
{
P1M0 = 0x80; P1M1 = 0x00;
CS=0; //片选中
BL=0; //背光灭
//--ST7735R Reset Sequence-- 复位
RES =0; delay(120); //Delay 120ms
RES =1; delay(100); //Delay 100ms
//--End ST7735S Reset Sequence--
LCD_WR_CMD(0x11); //Sleep out
delay(120); //Delay 120ms
//--ST7735S Frame Rate--
LCD_WR_CMD(0xB1); LCD_WR_DAT(0x01); LCD_WR_DAT(0x2C); LCD_WR_DAT(0x2D);
LCD_WR_CMD(0xB2); LCD_WR_DAT(0x01); LCD_WR_DAT(0x2C); LCD_WR_DAT(0x2D);
LCD_WR_CMD(0xB3); LCD_WR_DAT(0x01); LCD_WR_DAT(0x2C); LCD_WR_DAT(0x2D);
LCD_WR_DAT(0x01); LCD_WR_DAT(0x2C); LCD_WR_DAT(0x2D);
//--End ST7735S Frame Rate--
LCD_WR_CMD(0xB4); LCD_WR_DAT(0x07); //Dot inversion
//--ST7735S Power Sequence--
LCD_WR_CMD(0xC0); LCD_WR_DAT(0xA2); LCD_WR_DAT(0x02); LCD_WR_DAT(0x84);
LCD_WR_CMD(0xC1); LCD_WR_DAT(0xC5);
LCD_WR_CMD(0xC2); LCD_WR_DAT(0x0A); LCD_WR_DAT(0x00);
LCD_WR_CMD(0xC3); LCD_WR_DAT(0x8A); LCD_WR_DAT(0x2A);
LCD_WR_CMD(0xC4); LCD_WR_DAT(0x8A); LCD_WR_DAT(0xEE);
//--End ST7735S Power Sequence--
LCD_WR_CMD(0xC5); LCD_WR_DAT(0x0E); //VCOM //1a
LCD_WR_CMD(0x36); LCD_WR_DAT(0xC0); //LCD_WR_DAT(0xC0);竖屏 // LCD_WR_DAT(0xA8); 横屏 //MX, MY, RGB mode
//--ST7735S Gamma Sequence--
LCD_WR_CMD(0xE0); LCD_WR_DAT(0x0F); LCD_WR_DAT(0x1A); LCD_WR_DAT(0x0F); LCD_WR_DAT(0x18);
LCD_WR_DAT(0x2F); LCD_WR_DAT(0x28); LCD_WR_DAT(0x20); LCD_WR_DAT(0x22);
LCD_WR_DAT(0x1F); LCD_WR_DAT(0x1B); LCD_WR_DAT(0x23); LCD_WR_DAT(0x37);
LCD_WR_DAT(0x00); LCD_WR_DAT(0x07); LCD_WR_DAT(0x02); LCD_WR_DAT(0x10);
LCD_WR_CMD(0xE1); LCD_WR_DAT(0x0F); LCD_WR_DAT(0x1B); LCD_WR_DAT(0x0F); LCD_WR_DAT(0x17);
LCD_WR_DAT(0x33); LCD_WR_DAT(0x2C); LCD_WR_DAT(0x29); LCD_WR_DAT(0x2E);
LCD_WR_DAT(0x30); LCD_WR_DAT(0x30); LCD_WR_DAT(0x39); LCD_WR_DAT(0x3F);
LCD_WR_DAT(0x00); LCD_WR_DAT(0x07); LCD_WR_DAT(0x03); LCD_WR_DAT(0x10);
LCD_WR_CMD(0x2A); LCD_WR_DAT(0x00); LCD_WR_DAT(0x00); LCD_WR_DAT(0x00); LCD_WR_DAT(0x80); //宽度128
LCD_WR_CMD(0x2B); LCD_WR_DAT(0x00); LCD_WR_DAT(0x00); LCD_WR_DAT(0x00); LCD_WR_DAT(0xA0); //高度160
LCD_WR_CMD(0xF0); LCD_WR_DAT(0x01); //Enable test command
LCD_WR_CMD(0xF6); LCD_WR_DAT(0x00); //Disable ram power save mode
//LCD_WR_CMD(0x2C);
//--End ST7735S Gamma Sequence--
LCD_WR_CMD(0x3A); LCD_WR_DAT(0x05); //65k mode
LCD_WR_CMD(0x29); //Display on
BL=1; //背光亮
}
简单说明一下:
上述函数中,
LCD_WR_CMD() 是写命令函数,
LCD_WR_DAT() 是写数据函数,
有关屏方向的, 绿色字体是目前竖屏模式, 如果要切换成横屏, 用后面的蓝色字语句替代绿色字即可; 红色字体是保存备忘的.
另外注意, 红色字体宽度和高度那两行, 如果切换成横屏; 那么终点数据要作相应修改. 最后的数据 宽度0xA0, 高度0x80.
各函数的X,Y坐标的范围, 相应调整即可, 其它都不需要改动的.
另外, 你说 " #define USE_LANDSCAPE 横竖屏切换,实际不起作用,..."
这是条件编译, 有正确的配套一般也应该是可以的, 并不是简单一句话就行的.
要先定义.... 再根据不同的定义, 在上述的几个地方加相应变化语句, 最后实现改变定义一个值, 就方便切换了... 原理是一样的....
|
|