OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12460|回复: 14

原子老大还有论坛里其他兄弟,3.5液晶屏继续求助

[复制链接]

11

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2012-11-16
在线时间
44 小时
发表于 2013-1-10 10:30:06 | 显示全部楼层 |阅读模式

原子老大,上次买了你的几块3.5液晶屏(RM68042),现在正在调试。因为我的需求是横屏显示,上次问了你,说是通过该坐标的方式,现在问题如下:


通过改变void LCD_DrawPoint(u16 x,u16 y)
{
 LCD_SetCursor(y,x);  //设置光标位置
}     把 LCD_SetCursor(y,x);  x,y互换,LCD_SetCursor(u16 Xpos, u16 Ypos)函数里加上Xpos=lcddev.width-1-Xpos; 实现了上面的效果,但是问题是:看到图片下面的201,我本

想显示的是"2013/1/9",现在的情况是横坐标超过320(横屏)就不能显示了,函数void LCD_Display_Dir(u8 dir)里 lcddev.width=480;       lcddev.height=320; 或者 lcddev.width=320; lcddev.height=480; 都是出着这样的问题,原子哥,这个坐标到底要不要改成lcddev.width=480; lcddev.height=320;

是不是还有其他地方没有改到?????

if(lcddev.id==0X9341||lcddev.id==0X6804)
  {
   lcddev.wramcmd=0X2C;
    lcddev.setxcmd=0X2A;
   lcddev.setycmd=0X2B;   
   if(lcddev.id==0X6804)
   {
    lcddev.width=480;      
    lcddev.height=320;
   }

__inline void LCD_SetCursor(u16 Xpos, u16 Ypos)
{
  if(lcddev.id==0X9341||lcddev.id==0X6804)
 {     
  LCD_WR_REG(lcddev.setxcmd);
  Xpos=lcddev.width-1-Xpos;          //加上这一句,不然是“镜像”
  LCD_WR_DATA(Xpos>>8);
  LCD_WR_DATA(Xpos&0XFF); 
  LCD_WR_REG(lcddev.setycmd);
  LCD_WR_DATA(Ypos>>8);
  LCD_WR_DATA(Ypos&0XFF);
 }else

 问题2:背景清屏,我是通过改void LCD_Clear(u16 color)这个函数,结果是能够达到效果,但不知道有没有问题????

void LCD_Clear(u16 color)
{
 u32 index=0;     
 u32 totalpoint=lcddev.width;
 totalpoint*=lcddev.height;  //得到总点数
 LCD_Scan_Dir(U2D_R2L);   //  先改变扫描方向,
 LCD_SetCursor2(0x00,0x0000); //设置光标位置
 LCD_WriteRAM_Prepare();     //开始写入GRAM    
 for(index=0;index<totalpoint;index++)LCD_WR_DATA(color); 
 LCD_Scan_Dir(DFT_SCAN_DIR); //清屏之后再改回默认扫描方向
}   

问题3:把 LCD_SetCursor(y,x); x,y互换,就能换方向显示,这个是什么原理呢,我一直没想明白????

各位大神,小弟急,在线等,先谢谢大家

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2012-11-16
在线时间
44 小时
 楼主| 发表于 2013-1-10 10:36:12 | 显示全部楼层
补充一个问题:
//显示字符串
//x,y:起点坐标
//width,height:区域大小  
//size:字体大小 width
//*p:字符串起始地址   
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)
{         
u8 x0=x;
width+=x;
height+=y;
    while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
    {       
        if(x>=width){x=x0;y+=size;}
        if(y>=height)break;//退出
        LCD_ShowChar(x,y,*p,size,0);
        x+=size/2;
        p++;
    }  
}
原子哥://width,height:区域大小 width+=x;height+=y;这个是什么意思呢? 有了这一句width+=x;
 if(x>=width){x=x0;y+=size;}这个怎么也不会执行呀?  其它几句我看明白了的
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-10 12:05:57 | 显示全部楼层
改横屏,lcd尺寸必须改为:lcddev.width=480; lcddev.height=320;
你的超过320就没法显示,怀疑是你设置坐标范围的问题,你的LCD_ShowString,是怎么样的?
通过仿真跟踪,比较容易解决你这个超过320不能显示的问题。
至于LCD 清屏,这个横竖都没关系,关键是在lcd部分清屏的时候,这就麻烦了,因为RM68042,不是很好处理,除非用最蠢的办法:单个点慢慢清除。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2012-11-16
在线时间
44 小时
 楼主| 发表于 2013-1-10 12:36:11 | 显示全部楼层
回复【3楼】正点原子:
------------------------
我的LCD_ShowString 是这样的,
LCD_ShowString(300,290,200,16,16,"2013/1/9");   函数体没有变动,传的参数应该没有超范围
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)
{         
u8 x0=x;
width+=x;
height+=y;
    while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
    {       
        if(x>=width){x=x0;y+=size;}
        if(y>=height)break;//退出
        LCD_ShowChar(x,y,*p,size,0);
        x+=size/2;
        p++;
    }  
}
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-1-9
在线时间
0 小时
发表于 2013-1-10 14:07:10 | 显示全部楼层
之前改程序也遇到类似问题,你的液晶屏驱动需要改一下...你将驱动发上来看一下呗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-10 14:14:06 | 显示全部楼层
LCD_ShowString没问题,你有jtag么?
跟踪进去,看看是哪里的问题导致的不显示320以后的内容。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2012-11-16
在线时间
44 小时
 楼主| 发表于 2013-1-10 15:26:08 | 显示全部楼层

原子哥与tonly0212:
      现在问题好像基本解决了,驱动程序就是原子哥提供的,现在更改的有下面几个地方:
   1:void LCD_Display_Dir(u8 dir) 函数里, lcddev.width=480;  lcddev.height=320;

 if(lcddev.id==0X6804)
   {
    lcddev.width=480;
    lcddev.height=320;
   }

 2:我认为这里是关键地方:函数 void LCD_Scan_Dir(u8 dir),  原子哥原始的是 if(lcddev.id==0X6804) regval|=0x02;现在改成 if(lcddev.id==0X6804) regval|=0x32;

  dirreg=0X36;
   regval|=0X08;//BGR      //这个设置是重点!!!!!
  if(lcddev.id==0X6804) regval|=0x32;//6804 需要设置   
  LCD_WriteReg(dirreg,regval);
3:CD_SetCursor(x,y); 函数,现在我并没有把x,y互换。 但任然加了一句Ypos=lcddev.height-1-Ypos;  ,(这样也可以// Xpos=lcddev.width-1-Xpos; //当 regval|=0x31; 用这一句)

__inline void LCD_SetCursor(u16 Xpos, u16 Ypos)
{
  if(lcddev.id==0X9341||lcddev.id==0X6804)
 {     
  LCD_WR_REG(lcddev.setxcmd);
  Ypos=lcddev.height-1-Ypos;  //????
 // Xpos=lcddev.width-1-Xpos;  //当 regval|=0x31;  用这一句
  LCD_WR_DATA(Xpos>>8);
  LCD_WR_DATA(Xpos&0XFF); 
  LCD_WR_REG(lcddev.setycmd);
  LCD_WR_DATA(Ypos>>8);
  LCD_WR_DATA(Ypos&0XFF);
 }else

4:经测试,寄存器36H的B1,B0位影响很大,应该是屏幕显示翻转的意思。

请原子哥再测试下,最后总结下是不是这样的。


 


 

回复 支持 反对

使用道具 举报

11

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2012-11-16
在线时间
44 小时
 楼主| 发表于 2013-1-10 15:33:47 | 显示全部楼层
现在把有改动的地方贴出来,其他的与原子哥的一样,没改动
//设置LCD显示方向(6804不支持横屏显示)
//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.wramcmd=0X2C;
  lcddev.setxcmd=0X2A;
lcddev.setycmd=0X2B;    
if(lcddev.id==0X6804)
{
lcddev.width=480;
lcddev.height=320;
}
}else if(lcddev.id==0X8989)
{
lcddev.wramcmd=R34;
  lcddev.setxcmd=0X4E;
lcddev.setycmd=0X4F;  
}else
{
lcddev.wramcmd=R34;
  lcddev.setxcmd=R32;
lcddev.setycmd=R33;  
}
}else if(lcddev.id!=0X6804)//6804不支持横屏显示
{   
lcddev.dir=1;//横屏
lcddev.width=320;
lcddev.height=240;
if(lcddev.id==0X9341)
{
lcddev.wramcmd=0X2C;
  lcddev.setxcmd=0X2A;
lcddev.setycmd=0X2B;    
}else if(lcddev.id==0X8989)
{
lcddev.wramcmd=R34;
  lcddev.setxcmd=0X4F;
lcddev.setycmd=0X4E;  
}else
{
lcddev.wramcmd=R34;
  lcddev.setxcmd=R33;
lcddev.setycmd=R32;  
}

LCD_Scan_Dir(DFT_SCAN_DIR); //默认扫描方向
}


void LCD_Scan_Dir(u8 dir)
{
u16 regval=0;
u8 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)//9341/6804,很特殊
{
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;  
}
dirreg=0X36;
  regval|=0X08;//BGR      //这个设置是重点!!!!!
if(lcddev.id==0X6804) regval|=0x32;//6804 需要设置    
LCD_WriteReg(dirreg,regval);
  if(regval&0X20)   //B5位, page/column
{
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;
  }
}  
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);
}
}


__inline void LCD_SetCursor(u16 Xpos, u16 Ypos)
{
  if(lcddev.id==0X9341||lcddev.id==0X6804)
{     
LCD_WR_REG(lcddev.setxcmd); 
Ypos=lcddev.height-1-Ypos;  //????这里没有互换x,y
// Xpos=lcddev.width-1-Xpos;  //当 regval|=0x31;  用这一句
LCD_WR_DATA(Xpos>>8); 
LCD_WR_DATA(Xpos&0XFF);  
LCD_WR_REG(lcddev.setycmd); 
LCD_WR_DATA(Ypos>>8); 
LCD_WR_DATA(Ypos&0XFF);
}else
{
if(lcddev.dir==1)Xpos=lcddev.width-1-Xpos;//横屏其实就是调转x,y坐标
LCD_WriteReg(lcddev.setxcmd, Xpos);
LCD_WriteReg(lcddev.setycmd, Ypos);
}    
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-10 22:18:39 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

11

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2012-11-16
在线时间
44 小时
 楼主| 发表于 2013-1-11 08:50:59 | 显示全部楼层
原子哥,你自己写的GUI有没有相应的教程呀,在论坛上的资料里还没有找到GUI的教程??
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-11 10:55:03 | 显示全部楼层
暂时还没哦
回复 支持 反对

使用道具 举报

头像被屏蔽

52

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2013-1-9
在线时间
151 小时
发表于 2013-1-25 13:46:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2013-1-17
在线时间
7 小时
发表于 2013-1-29 21:14:27 | 显示全部楼层
mark 这个要顶
回复 支持 反对

使用道具 举报

7

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-4-6
在线时间
0 小时
发表于 2013-9-2 23:00:48 | 显示全部楼层
回复【12楼】hexboot:
---------------------------------
只该这个地方,我的就不行。。
回复 支持 反对

使用道具 举报

头像被屏蔽

52

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2013-1-9
在线时间
151 小时
发表于 2013-9-3 00:47:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-14 01:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表