OpenEdv-开源电子网

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

关于TFT的两个问题~希望大手解决下~呵呵~

[复制链接]

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
发表于 2014-2-19 16:38:50 | 显示全部楼层 |阅读模式
这个窗口设置函数怎么使用?大手具体指导下~谢谢!!!
/******************************问题1*********************************************
*函数名CD_SetDisplayWindow
*函数说明:设置LCD显示窗口
*输入参数:
* Xpos:X坐标
* Ypos  Y坐标
* Height:窗口高度
* Width:窗口宽度
*返回值:无   50h和52h是起点,51h和53h是终点
**************************************************************************************/
void LCD_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint8_t Height, uint16_t Width)
{
  if(Xpos >= Height)       LCD_WriteReg(0x50, (Xpos - Height + 1));
  else   LCD_WriteReg(0x50, 0);
  LCD_WriteReg(0x51, Xpos);

  if(Ypos >= Width)   LCD_WriteReg(0x52, (Ypos - Width + 1));
  else   LCD_WriteReg(0x52, 0);
  LCD_WriteReg(0x53, Ypos);
  LCD_SetCursor(Xpos, Ypos);
}


************************问题2**********************************
void Logo(uint16_t x,uint16_t y)
{
int i,j,k;
uint16_t color;
LCD_SetCursor(x,y);
for (i = 0; i < 50; i++)   //高
{
for(j=0;j<100;j++) //宽
{
k = i*100+j; //50*100的区域     
#if logo_x
color = gImage_logo[k*2];
//#else 
// color = gImage_logo[k*2+1]<<8; 
#else 
color = gImage_logo[k*2] | (gImage_logo[k*2+1]<<8);
#endif                    
LCD_WriteRAM_Prepare();
LCD_WriteRAM(color); //颜色代码 写显存,显存地址自动增加
y++;
LCD_SetCursor(x, y);
}
}
经过试验发现,color = gImage_logo[k*2] | (gImage_logo[k*2+1]<<8);(标准的,和我取模的logo一样~),color = gImage_logo[k*2];和color = gImage_logo[k*2+1]<<8; 也有图像,只是颜色不一样~不知道怎么解释这个现象

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

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-19 16:40:11 | 显示全部楼层
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-2-19 17:23:50 | 显示全部楼层
开窗函数能在LCD任意起始坐标开启一个限定长宽的矩形,在其显示图像或字符
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-19 17:33:03 | 显示全部楼层
开窗函数  就是表示你下面要操作的显示区域。
e.g.1 你要显示一副20*20的图标,那么就在你需要的位置开一个20*20的窗把然后直接把图片点阵数据按照屏幕扫描方向直接送进去就行,而不用考虑换行点阵移位等步骤,屏幕的自增指针会自动帮你完成这个步骤。
e.g.2 画长度为n像素的直线,窗口设置为直线起点和终点就好,然后直接填入n个颜色数据即可,不需要人工进行+1扫点。
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-19 17:34:21 | 显示全部楼层
回复【3楼】hechao3225:
---------------------------------
我在程序里这样写,可以实现么?函数功能我理解~呵呵~
while(1)
{
   LCD_SetDisplayWindow(100,100,50,50);
   LCD_DisplayStringHZ(110,110,“龙”);
}
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-19 17:48:24 | 显示全部楼层
回复【4楼】ricefat:
--------------------------------
方才我试了一下,我觉得是我没有理解这个函数的含义~导致使用不到~
LCD_SetDisplayWindow(10,10,50,50);
LCD_WriteBMP((const uint16_t *)gImage_snoopy);
Delay_ms(20000);
我的一个理解是加入我规定了这个区域,那么其他的地方都显示不出来了?只有哪一个区域可以显示我的东西。就像切豆腐那样。。。是不是。。。
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-19 18:10:35 | 显示全部楼层
回复【6楼】正点电子01:
---------------------------------
不是 只是不会操作窗口以外的区域
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-19 19:00:19 | 显示全部楼层
回复【7楼】ricefat:
---------------------------------
我试了试,但是现在的话,比如下面的
LCD_SetDisplayWindow(50,50,50,50);
LCD_DisplayStringHZ(10,10,"轮:");
那么这个 轮 字在选定的区域写么?
我试了,不是的。。。我还是对程序不理解?
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-19 21:42:57 | 显示全部楼层
回复【8楼】正点电子01:
---------------------------------
你代码理解错了,LCD_SetDisplayWindow属于更为底层的代码,用于屏幕驱动,进行屏幕绘图,而LCD_DisplayStringHZ已经是基于上述驱动的高级应用,在这个过程中会调用到LCD_SetDisplayWindow去在屏幕指定位置绘制汉字。
你应该把汉字显示实现过程的代码看完全
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-19 23:17:35 | 显示全部楼层
回复【9楼】ricefat:
---------------------------------
哦~我明白了~谢谢~
不过如果我要是使用在它高一级的代码上的话,我想的是放在LCD_WriteReg这些地方,但是到时候如何退出呢?写成全屏的?
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-19 23:48:06 | 显示全部楼层
回复【10楼】正点电子01:
---------------------------------
看不懂你表达的意思
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-20 01:02:03 | 显示全部楼层
回复【4楼】ricefat:
---------------------------------
我对TFT还是不是很熟悉,所以不理解你的意思~嘿嘿~不过我先记下吧~你说的那个显示小图片和画线的程序如果有的话,可以给我发一下么?我看看吧~
是关于窗口的哦~嘿嘿~不是一般的显示!!!嘿嘿~谢谢
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-20 08:30:34 | 显示全部楼层
回复【12楼】正点电子01:
---------------------------------
具体代码在ILI9325的驱动上有很多,自己找下吧。
所谓开窗,是给屏幕发送颜色数据前必须的步骤,比如你要单色刷320*240屏,那你就需要先开一个320*240的窗,然后接着写入320*240个颜色数据。如果你需要设置(100,100)这个像素点颜色,那需要把开窗函数坐标写为(100,100,1,1)然后再写入颜色数据。
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-20 09:13:50 | 显示全部楼层
回复【13楼】ricefat:
---------------------------------
void LCD_district(uint16_t Xpos,uint16_t Ypos,uint8_t Height, uint8_t Width, uint16_t Color)  
{
uint32_t index = 0;
LCD_SetDisplayWindow(Xpos, Ypos, Height, Width);

LCD_WriteRAM_Prepare();  /* 准备写显存 */
for (index = 0; index <(Height * Width) ; index++)
{
delay_ms(1);  
LCD->LCD_RAM = Color;
}
还是理解不够?
其实我觉得这个函数本身也没有什么的,关键是我的一些函数(像你说的高级函数),只是把光标又重新覆盖了一下,所以会产生问题~

还有就是你说的(100,100,1,1)是不是写错了,你第一次回我的时候写了两个例子,我上面的程序就是按照那个意思写的,但是它受区域的影响,依旧和原来的一样~
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-20 14:29:08 | 显示全部楼层
回复【14楼】正点电子01:
---------------------------------
LCD_SetDisplayWindow(100,100,1,1)就是表明下面将会对(100,100)这个像素进行操作。
写汉字部分的代码在绘制汉字每一个像素的时候已经自行调用了LCD_SetDisplayWindow这个函数。你前面开窗和后面写汉字的部分没有关系。
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-20 16:47:52 | 显示全部楼层
回复【15楼】ricefat:
---------------------------------
但是我的写汉字程序里没有调用这个显示窗口函数啊。。。
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-20 17:34:20 | 显示全部楼层
回复【15楼】ricefat:
---------------------------------
对不起~问题解决了、、、我盲目的移植程序,却没有注意到在SSD1289的所有函数里,窗口设置函数竟然是9325的,虽然作者有点坑,但是还是自己太菜了,不会自己写程序。。。谢谢你这么多天的指导。谢谢!!!
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-20 19:05:22 | 显示全部楼层
除了那个问题外,我现在的现象和你在5楼说的不太一致,
假如我要是写的超过了范围,那是不是不会自动换行?
直接上图吧~


照反了。。。。


回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-20 19:37:40 | 显示全部楼层
回复【16楼】正点电子01:
---------------------------------
应该在汉字的画点函数中,你要一层一层往下找
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-20 19:39:35 | 显示全部楼层
回复【18楼】正点电子01:
---------------------------------
这里面的自动换行都是像素的换行,文字换行那是软件编程实现的
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-20 19:56:00 | 显示全部楼层
回复【20楼】ricefat:
---------------------------------
如果是图片的话,是不是就可以不用编程控制换行~
还有就是那个换行程序大概怎么写?图上的那些竖杠怎么解释?没有换行导致的?
还有一个就是看了点E问手册,不知道怎么写退出全屏函数。。。不知道哪一个寄存器(tell 我名字就ok)控制~
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-20 20:06:39 | 显示全部楼层
回复【21楼】正点电子01:
---------------------------------
图片会自动换行,但前提是你开窗和图片尺寸一致。
竖杠大概是因为你没算好文字尺寸或是程序编写问题。。
不懂什么叫退出全屏函数
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-20 20:09:42 | 显示全部楼层
回复【22楼】ricefat:
---------------------------------
哦~是的,我的文字写的超了一行,程序里没有写换行操作~ 但是不知道这个咋写?感觉不是很好写。。。关键是我我对AC不是很了解~
我打错了、、是退出显示窗口。。。
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-20 20:21:53 | 显示全部楼层
回复【22楼】ricefat:
---------------------------------
是的,即使我不开窗口,多打了字也不会换行~哎。。。不知道咋写啊
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-20 20:23:57 | 显示全部楼层
回复【23楼】正点电子01:
---------------------------------
不需要退出,直接重新设置新窗口就可以了。
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-20 20:26:44 | 显示全部楼层
回复【24楼】正点电子01:
---------------------------------
换行就是你要算好什么时候到了屏幕边界,然后重新把显示坐标定义到横坐标0,纵坐标向Y轴方向增加一个文字高度
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-20 20:26:52 | 显示全部楼层
回复【25楼】ricefat:
---------------------------------
这个再说。。。关键是如何换行。。。
回复 支持 反对

使用道具 举报

22

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-12-29
在线时间
0 小时
发表于 2014-2-20 23:55:03 | 显示全部楼层
啦啦啦
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2014-2-21 00:00:23 | 显示全部楼层
回复【26楼】 ricefat :
---------------------------------
我试了一个晚上,这个东西我还是做不出来。。。先吐槽下自己:菜啊。。。。还请大师给写一下吧~sorry

void LCD_DisplayStringHZ(uint16_t Xpos, uint16_t Ypos, uint8_t *ptr)
{
uint32_t i = 0;
uint16_t j=0;
uint8_t code1=0;
uint8_t code2=0;
uint32_t address=0;
uint32_t k=0;
while ((*ptr != 0) & (i < 40)) //  "---40
{
code1 = *ptr; /* ascii代码 */
if (code1 < 0x80) //0-127
{
if(Xpos>320)   {Xpos=j-320;Ypos=10;}      //这一段是我写的,可以实现换行。。。(未完。。。
LCD_DrawCharHZ(Xpos, Ypos, &Ascii16[code1 * 16], 8); /* 16 表示1个字符字模的字节数 */
Xpos += 8;   /* 列地址+8 */
j=j+8;
}
else /* 汉字内码 */
{
code2 = *(++ptr);
if(code2 == 0)   break;
for(k = 0; k < HZ_COUNT; k++)
{
address=k*34;
if ((code1 == g_Hz16[address + 0]) && (code2 == g_Hz16[address + 1]))
{
address += 2;
break;
}
}
address = (uint32_t)&g_Hz16[address];
LCD_DrawCharHZ(Xpos, Ypos, (const uint8_t *)address, 16);
Xpos += 16; /* 列地址+16 */
}
ptr++; /* 指向下一个字符 */
i++;
}
i = 0;code1=0;code2=0;address=0;k=0;
}
先就实现全屏的换行吧~窗口的再议~
我的换行是这个:就是说只可以将一行的字符进行换行,或是说截断吧~不知道能不能理解。。。
LCD_DisplayStringHZ(0,0,"abcdefghijklmnopqrstuvwxyzaotykangxiaolongjiayou");
也就是说我的字符只可以显示到。。lo这里,后面的无法显示出来,哎。。。求大师解决下~                                   









回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-21 10:15:30 | 显示全部楼层
void LCD_DisplayStringHZ(uint16_t Xpos, uint16_t Ypos, uint8_t *ptr)
{
uint32_t i = 0;
uint16_t j=0;
uint8_t code1=0;
uint8_t code2=0;
uint32_t address=0;
uint32_t k=0;
while ((*ptr != 0) & (i < 40)) //  "---40
{
code1 = *ptr; /* ascii代码 */
if (code1 < 0x80) //0-127
{
if(Xpos>320)   {Xpos=j-320;Ypos=10;}      //这一段是我写的,可以实现换行。。。(未完。。。
                        //Ypos是不是应该用Ypos+=16?看你下面Xpos横向加8,那应该是8*16英文字符
LCD_DrawCharHZ(Xpos, Ypos, &Ascii16[code1 * 16], 8); /* 16 表示1个字符字模的字节数 */
Xpos += 8;    /* 列地址+8 */
j=j+8;
}
else /* 汉字内码 */
{
code2 = *(++ptr);
if(code2 == 0)    break;
for(k = 0; k < HZ_COUNT; k++)
{
address=k*34;
if ((code1 == g_Hz16[address + 0]) && (code2 == g_Hz16[address + 1]))
{
address += 2;
break;
}
}
address = (uint32_t)&g_Hz16[address];
LCD_DrawCharHZ(Xpos, Ypos, (const uint8_t *)address, 16);
Xpos += 16; /* 列地址+16 */
}
ptr++; /* 指向下一个字符 */
i++;
}
i = 0;code1=0;code2=0;address=0;k=0;
}
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 00:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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