少废话,上代码
1、这个是我改后用的
[mw_shl_code=c,true]/**
*****************************************************************************
* @Name : lcd刷屏模式
*
* @Brief : none
*
* @Input : mode: 模式设置
*
* @Output : none
*
* @Return : none
*****************************************************************************
**/
void LCD_Entry_Mode(u8 mode)
{
u8 temp=0;
u16 dirreg=0;
if((lcd_dev._lcdobj.lcdid == 0x9341) || (lcd_dev._lcdobj.lcdid == 0x5510))
{
switch(mode)
{// MY MX MV
case LCD_Entry_HorDEF2: //常用竖屏2
temp |= (1 << 7) | (1 << 6) | (0 << 5); //向左向上 ←↖ --> 常用(竖屏2)竖屏180°旋转后【镜像Y,镜像X】
break;
case LCD_Entry_HorMIRY:
temp |= (1 << 7) | (0 << 6) | (0 << 5); //向右向上 →↗ --> 竖屏180°旋转再镜像【镜像Y】
break;
case LCD_Entry_HorMIRX:
temp |= (0 << 7) | (1 << 6) | (0 << 5); //向左向下 ←↙ --> 镜像竖屏【镜像X】
break;
case LCD_Entry_HorDEF1: //常用竖屏1
temp |= (0 << 7) | (0 << 6) | (0 << 5); //向右向下 →↘ --> 常用(竖屏1)
break;
case LCD_Entry_VERMIRX:
temp |= (1 << 7) | (1 << 6) | (1 << 5); //向上向左 ↑↖ --> 竖屏顺时针90°再镜像【旋转竖屏,镜像X】
break;
case LCD_Entry_VERDEF2: //常用横屏2
temp |= (1 << 7) | (0 << 6) | (1 << 5); //向上向右 ↑↗ --> 常用(横屏2)(相对竖屏逆时针90°)【旋转竖屏,镜像X,镜像Y】
break;
case LCD_Entry_VERDEF1: //常用横屏1
temp |= (0 << 7) | (1 << 6) | (1 << 5); //向下向左 ↓↙ --> 常用(横屏1)(相对竖屏顺时针90°)【旋转竖屏】
break;
case LCD_Entry_VERMIRY:
temp |= (0 << 7) | (0 << 6) | (1 << 5); //向下向右 ↓↘ --> 竖屏逆时针90°再镜像【旋转竖屏,镜像Y】
break;
default: break;
}
if(lcd_dev._lcdobj.lcdid == 0x5510) dirreg = 0x3600;
else dirreg = 0x36;
temp |= 0x08;
_LCD_WriteRegisterData(dirreg, temp); //设置寄存器值
if((temp & 0x20) || (lcd_dev._lcdobj.dir == 1))
{
if(lcd_dev._lcdobj.width < lcd_dev._lcdobj.height) //交换x,y
{
dirreg = lcd_dev._lcdobj.width;
lcd_dev._lcdobj.width = lcd_dev._lcdobj.height;
lcd_dev._lcdobj.height = dirreg;
}
}
else
{
if(lcd_dev._lcdobj.width > lcd_dev._lcdobj.height) //交换x,y
{
dirreg = lcd_dev._lcdobj.width;
lcd_dev._lcdobj.width = lcd_dev._lcdobj.height;
lcd_dev._lcdobj.height = dirreg;
}
}
if(lcd_dev._lcdobj.lcdid == 0x5510)
{
_LCD_Write_Register(lcd_dev._lcdobj.setxcmd); _LCD_Write_Data(0);
_LCD_Write_Register(lcd_dev._lcdobj.setxcmd+1); _LCD_Write_Data(0);
_LCD_Write_Register(lcd_dev._lcdobj.setxcmd+2); _LCD_Write_Data((lcd_dev._lcdobj.width - 1) >> 8);
_LCD_Write_Register(lcd_dev._lcdobj.setxcmd+3); _LCD_Write_Data((lcd_dev._lcdobj.width - 1) & 0xff);
_LCD_Write_Register(lcd_dev._lcdobj.setycmd); _LCD_Write_Data(0);
_LCD_Write_Register(lcd_dev._lcdobj.setycmd+1); _LCD_Write_Data(0);
_LCD_Write_Register(lcd_dev._lcdobj.setycmd+2); _LCD_Write_Data((lcd_dev._lcdobj.height - 1) >> 8);
_LCD_Write_Register(lcd_dev._lcdobj.setycmd+3); _LCD_Write_Data((lcd_dev._lcdobj.height - 1) & 0xff);
}
else //9341
{
_LCD_Write_Register(lcd_dev._lcdobj.setxcmd);
_LCD_Write_Data(0);_LCD_Write_Data(0); //横坐标起点
_LCD_Write_Data((lcd_dev._lcdobj.width - 1) >> 8);
_LCD_Write_Data((lcd_dev._lcdobj.width - 1) & 0xff);
_LCD_Write_Register(lcd_dev._lcdobj.setycmd);
_LCD_Write_Data(0);_LCD_Write_Data(0); //纵坐标起点
_LCD_Write_Data((lcd_dev._lcdobj.height - 1) >> 8);
_LCD_Write_Data((lcd_dev._lcdobj.height - 1) & 0xff);
}
}
else if((lcd_dev._lcdobj.lcdid == 0x9320) || (lcd_dev._lcdobj.lcdid == 0x9325) || (lcd_dev._lcdobj.lcdid == 0x9328))
{
switch(mode)
{// [I/D1 : I/D0] AM
case LCD_Entry_HorDEF2: //常用竖屏2
temp |= (0 << 5) | (0 << 4) | (0 << 3); //向左向上 ←↖ --> 常用(竖屏2)竖屏180°旋转后【镜像Y,镜像X】
break;
case LCD_Entry_HorMIRY:
temp |= (0 << 5) | (1 << 4) | (0 << 3); //向右向上 →↗ --> 竖屏180°旋转再镜像【镜像Y】
break;
case LCD_Entry_HorMIRX:
temp |= (1 << 5) | (0 << 4) | (0 << 3); //向左向下 ←↙ --> 镜像竖屏【镜像X】
break;
case LCD_Entry_HorDEF1: //常用竖屏1
temp |= (1 << 5) | (1 << 4) | (0 << 3); //向右向下 →↘ --> 常用(竖屏1)
break;
case LCD_Entry_VERMIRX:
temp |= (0 << 5) | (0 << 4) | (1 << 3); //向上向左 ↑↖ --> 竖屏顺时针90°再镜像【旋转竖屏,镜像X】
break;
case LCD_Entry_VERDEF2: //常用横屏2
temp |= (0 << 5) | (1 << 4) | (1 << 3); //向上向右 ↑↗ --> 常用(横屏2)(相对竖屏逆时针90°)【旋转竖屏,镜像X,镜像Y】
break;
case LCD_Entry_VERDEF1: //常用横屏1
temp |= (1 << 5) | (0 << 4) | (1 << 3); //向下向左 ↓↙ --> 常用(横屏1)(相对竖屏顺时针90°)【旋转竖屏】
break;
case LCD_Entry_VERMIRY:
temp |= (1 << 5) | (1 << 4) | (1 << 3); //向下向右 ↓↘ --> 竖屏逆时针90°再镜像【旋转竖屏,镜像Y】
break;
default: break;
}
_LCD_WriteRegisterData(Entry_Mode, temp|0x1000); //设置寄存器值
}
}
/**
*****************************************************************************
* @Name : 设定lcd显示方向
*
* @Brief : none
*
* @Input : dir:横竖屏设置。[7:7]: 0: 竖屏;1: 横屏
* [6:4]: 保留
* [3:0]: 0: 保留
* 1: 常用竖屏2,竖屏180°旋转后【镜像Y,镜像X】
* 2: 竖屏180°旋转再镜像【镜像Y】
* 3: 镜像竖屏【镜像X】
* 4: 常用(竖屏1)
* 5: 竖屏顺时针90°再镜像【旋转竖屏,镜像X】
* 6: 常用(横屏2)(相对竖屏逆时针90°)【旋转竖屏,镜像X,镜像Y】
* 7: 常用(横屏1)(相对竖屏顺时针90°)【旋转竖屏】
* 8: 竖屏逆时针90°再镜像【旋转竖屏,镜像Y】
*
* @Output : none
*
* @Return : none
*****************************************************************************
**/
void LCD_Display_DIR(u8 dir)
{
//设置相关操作命令
if(lcd_dev._lcdobj.lcdid == 0x9341)
{
lcd_dev._lcdobj.wgramcmd = 0x2c; //GRAM开始写指令
lcd_dev._lcdobj.setxcmd = 0x2a; //设置x坐标
lcd_dev._lcdobj.setycmd = 0x2b; //设置y坐标
}
else if(lcd_dev._lcdobj.lcdid == 0x5510) //横竖屏测试不通过
{
lcd_dev._lcdobj.wgramcmd = 0x2c00;
lcd_dev._lcdobj.setxcmd = 0x2a00;
lcd_dev._lcdobj.setycmd = 0x2b00;
}
else //9320、9325、9328
{
lcd_dev._lcdobj.wgramcmd = ILI9328_WriteDatatoGRAM; //写数据到GRAM
lcd_dev._lcdobj.setxcmd = ILI9328_HorizontalGRAMAddressSet; //水平方向
lcd_dev._lcdobj.setycmd = ILI9328_VerticalGRAMAddressSet; //垂直方向
}
//设置显示方向
if(dir & 0x80) lcd_dev._lcdobj.dir = 1; //横屏显示
else lcd_dev._lcdobj.dir = 0; //竖屏显示
LCD_Entry_Mode(dir&0x0f); //设置刷屏模式
}[/mw_shl_code]
2、下面这个是原子哥的最新的http://www.openedv.com/posts/list/34751.htm
[mw_shl_code=c,true]//设置LCD的自动扫描方向
//注意:其他函数可能会受到此函数设置的影响(尤其是9341/6804这两个奇葩),
//所以,一般设置为L2R_U2D即可,如果设置为其他扫描方式,可能导致显示不正常.
//dir:0~7,代表8个方向(具体定义见lcd.h)
//9320/9325/9328/4531/4535/1505/b505/8989/5408/9341/5310/5510等IC已经实际测试
void LCD_Scan_Dir(u8 dir)
{
u16 regval=0;
u16 dirreg=0;
u16 temp;
if(lcddev.dir==1&&lcddev.id!=0X6804)//横屏时,对6804不改变扫描方向!
{
switch(dir)//方向转换
{
case 0:dir=6;break;
case 1:dir=7;break;
case 2:dir=4;break;
case 3:dir=5;break;
case 4:dir=1;break;
case 5:dir=0;break;
case 6:dir=3;break;
case 7:dir=2;break;
}
}
if(lcddev.id==0x9341||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X5510)//9341/6804/5310/5510,很特殊
{
switch(dir)
{
case L2R_U2D://从左到右,从上到下
regval|=(0<<7)|(0<<6)|(0<<5);
break;
case L2R_D2U://从左到右,从下到上
regval|=(1<<7)|(0<<6)|(0<<5);
break;
case R2L_U2D://从右到左,从上到下
regval|=(0<<7)|(1<<6)|(0<<5);
break;
case R2L_D2U://从右到左,从下到上
regval|=(1<<7)|(1<<6)|(0<<5);
break;
case U2D_L2R://从上到下,从左到右
regval|=(0<<7)|(0<<6)|(1<<5);
break;
case U2D_R2L://从上到下,从右到左
regval|=(0<<7)|(1<<6)|(1<<5);
break;
case D2U_L2R://从下到上,从左到右
regval|=(1<<7)|(0<<6)|(1<<5);
break;
case D2U_R2L://从下到上,从右到左
regval|=(1<<7)|(1<<6)|(1<<5);
break;
}
if(lcddev.id==0X5510)dirreg=0X3600;
else dirreg=0X36;
if((lcddev.id!=0X5310)&&(lcddev.id!=0X5510))regval|=0X08;//5310/5510不需要BGR
if(lcddev.id==0X6804)regval|=0x02;//6804的BIT6和9341的反了
LCD_WriteReg(dirreg,regval);
if((regval&0X20)||lcddev.dir==1)
{
if(lcddev.width<lcddev.height)//交换X,Y
{
temp=lcddev.width;
lcddev.width=lcddev.height;
lcddev.height=temp;
}
}else
{
if(lcddev.width>lcddev.height)//交换X,Y
{
temp=lcddev.width;
lcddev.width=lcddev.height;
lcddev.height=temp;
}
}
if(lcddev.id==0X5510)
{
LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(0);
LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(0);
LCD_WR_REG(lcddev.setxcmd+2);LCD_WR_DATA((lcddev.width-1)>>8);
LCD_WR_REG(lcddev.setxcmd+3);LCD_WR_DATA((lcddev.width-1)&0XFF);
LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(0);
LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(0);
LCD_WR_REG(lcddev.setycmd+2);LCD_WR_DATA((lcddev.height-1)>>8);
LCD_WR_REG(lcddev.setycmd+3);LCD_WR_DATA((lcddev.height-1)&0XFF);
}else
{
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(0);LCD_WR_DATA(0);
LCD_WR_DATA((lcddev.width-1)>>8);LCD_WR_DATA((lcddev.width-1)&0XFF);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(0);LCD_WR_DATA(0);
LCD_WR_DATA((lcddev.height-1)>>8);LCD_WR_DATA((lcddev.height-1)&0XFF);
}
}else
{
switch(dir)
{
case L2R_U2D://从左到右,从上到下
regval|=(1<<5)|(1<<4)|(0<<3);
break;
case L2R_D2U://从左到右,从下到上
regval|=(0<<5)|(1<<4)|(0<<3);
break;
case R2L_U2D://从右到左,从上到下
regval|=(1<<5)|(0<<4)|(0<<3);
break;
case R2L_D2U://从右到左,从下到上
regval|=(0<<5)|(0<<4)|(0<<3);
break;
case U2D_L2R://从上到下,从左到右
regval|=(1<<5)|(1<<4)|(1<<3);
break;
case U2D_R2L://从上到下,从右到左
regval|=(1<<5)|(0<<4)|(1<<3);
break;
case D2U_L2R://从下到上,从左到右
regval|=(0<<5)|(1<<4)|(1<<3);
break;
case D2U_R2L://从下到上,从右到左
regval|=(0<<5)|(0<<4)|(1<<3);
break;
}
if(lcddev.id==0x8989)//8989 IC
{
dirreg=0X11;
regval|=0X6040; //65K
}else//其他驱动IC
{
dirreg=0X03;
regval|=1<<12;
}
LCD_WriteReg(dirreg,regval);
}
}
//设置LCD显示方向
//dir:0,竖屏;1,横屏
void LCD_Display_Dir(u8 dir)
{
if(dir==0) //竖屏
{
lcddev.dir=0; //竖屏
lcddev.width=240;
lcddev.height=320;
if(lcddev.id==0X9341||lcddev.id==0X6804||lcddev.id==0X5310)
{
lcddev.wramcmd=0X2C;
lcddev.setxcmd=0X2A;
lcddev.setycmd=0X2B;
if(lcddev.id==0X6804||lcddev.id==0X5310)
{
lcddev.width=320;
lcddev.height=480;
}
}else if(lcddev.id==0X8989)
{
lcddev.wramcmd=R34;
lcddev.setxcmd=0X4E;
lcddev.setycmd=0X4F;
}else if(lcddev.id==0x5510)
{
lcddev.wramcmd=0X2C00;
lcddev.setxcmd=0X2A00;
lcddev.setycmd=0X2B00;
lcddev.width=480;
lcddev.height=800;
}else
{
lcddev.wramcmd=R34;
lcddev.setxcmd=R32;
lcddev.setycmd=R33;
}
}else //横屏
{
lcddev.dir=1; //横屏
lcddev.width=320;
lcddev.height=240;
if(lcddev.id==0X9341||lcddev.id==0X5310)
{
lcddev.wramcmd=0X2C;
lcddev.setxcmd=0X2A;
lcddev.setycmd=0X2B;
}else if(lcddev.id==0X6804)
{
lcddev.wramcmd=0X2C;
lcddev.setxcmd=0X2B;
lcddev.setycmd=0X2A;
}else if(lcddev.id==0X8989)
{
lcddev.wramcmd=R34;
lcddev.setxcmd=0X4F;
lcddev.setycmd=0X4E;
}else if(lcddev.id==0x5510)
{
lcddev.wramcmd=0X2C00;
lcddev.setxcmd=0X2A00;
lcddev.setycmd=0X2B00;
lcddev.width=800;
lcddev.height=480;
}else
{
lcddev.wramcmd=R34;
lcddev.setxcmd=R33;
lcddev.setycmd=R32;
}
if(lcddev.id==0X6804||lcddev.id==0X5310)
{
lcddev.width=480;
lcddev.height=320;
}
}
LCD_Scan_Dir(DFT_SCAN_DIR); //默认扫描方向
}[/mw_shl_code]
3、看数据手册有这么个说明
A、原子4.3寸屏幕
B、ILI9328
4、原子哥4.3寸屏幕的8个显示方向的测试谍照,用USMART调试组件测试的,途中红色框框显示的就是不同方向的效果
再次向原子哥说声感谢,购买的时候一如既往的支持和热情帮助解决战舰的小bug(小抱怨一下下,原子哥,你的0603封装焊接0805还真是有点难度,嘿嘿,别放心里喔。。。),如果有战舰板子或者mini板子的盘友们,发现插上原子哥的4.3寸屏幕使用一键下载电路下载不了程序的,可以将BOOT0和BOOT1接地的那两个100K电阻换成10K的即可,这样也不会影响2.8寸屏幕的使用。
|