打印
[应用相关]

TFTLCD的图片以及汉字字符显示说明

[复制链接]
4877|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
做技术支持,有很多初学者不知道TFTLCD的汉字,字符以及图片的显示,以及汉字的字体大小怎么调整。在这里特别的说明一下。
首先要知道不管是汉字、字符或者图片都需要点阵数据,才能在TFTLCD上显示。字符和汉字是的点阵数据是一位代表一个点的数据,其实也就是0或者1。取模后的点阵数据是1的像素点,需要显示画笔颜色,也就是点亮,数据为0的像素点,则显示背景颜色就可以了。这样颜色的对比就能够显示出汉字或者字符。而图片则不一样,图片的一个像素点的数据,和你的取模有关,因为图片是需要彩色显示的,所以图片的数据是直接把点阵数据送给彩屏进行显示。而汉字或者字符是通过判断每一位是0或者1,从而显示背景颜色或者画笔颜色。
在LCD上显示一个图片或者字符,需要一个显示区域,首先我们要确定其显示起点,然后是接下来的数据是沿着X轴还是Y轴进行发送数据也就是X轴或者Y轴地址的增长顺序以及方向。下面这张图显示的是在一个显示区域内,八种不同情况的显示起点以及X轴和Y轴地址的增长顺序以及方向。当我们要显示对应的字符或者图片的时候,我们只需要保证LCD屏的显示起点以及X轴和Y轴的增长顺序以及方向,和我们对字符或者汉字的取模的点阵数据的顺序保持一致,才能够正常显示我们想要的效果。

一般LCD的显示有两种方法可供选择:
第一种:就是每发送一个像素点的数据,设置一次地址,来控制发送下一个像素点的位置。比如下图的程序编程方法。

在这段程序当中可以看到,我们通过两个for循环来发送数据,一个是控制行,一个控制列。横屏显示或者竖屏显示那就看你的for循环控制,是先发送X轴的数据,还是Y轴的数据,这全靠程序猿的算法。但是这种方法不好的地方就是每发送一个像素点的数据都要设置一次地址,显然导致屏幕的刷新很慢。但是好处是对于任意一种屏这种算法都适合。
第二种:利用LCD的驱动芯片的地址自增功能来显示字符或者图片(一般LCD驱动芯片都有这个功能)。使用这个功能,首先我们要设置一个显示窗口,使其只能在LCD屏的某一区域进行显示,比如你要显示一个16*16的汉字,那你就把显示区域设置成16*16的大小,然后设置显示起点,也就是光标的位置,然后发送LCD的写数据命令,接下来就只需要发送像素点的数据,而不需要再设置地址,接下来发送的数据,则会依次显示在你设置的显示区域当中。比如下面的这段程序。

要使用第二种显示方法,之前必须要设置好显示区域的显示起点,以及LCD驱动芯片的地址自增方向,下面我以SSD1963和SSD1298两款芯片说明寄存器的设置。
首先是SSD1963,查阅SSD1963芯片的数据手册,可以找到一个寄存器是控制地址的自增方向。如下图:

可以看到是通过0x36这个命令来设置这个顺序的,这八种顺序和我们上面提到的是一样的。所以只要设置好对应关系即可。
SSD1298是一样的道理,也是通过设置寄存器来控制这个顺序,在数据手册中可以查到,如下图:

这个是ox11寄存器来控制器顺序的。

另外需要注意的是:设置的窗口一定要和你要显示的图片或者汉字的显示区域一样,否则就会出现错位等现象。
还有就是显示汉字或者字符的时候,不同字体大小,每一行要显示的像素点数是不一样的,一个字节是8个位,代表的是8个像素点,所以在使用for循环的时候,需要注意一下。不要把高低位弄反了,显示错位。注意高位先发送还是低位先发送,这和你的取模以及显示都有关系,需要一一对应。

写了这么多,希望对初学者有帮助,路过的各位高手能够指点一二。


沙发
拿起书本| | 2014-7-8 21:05 | 只看该作者
**确实不错,这个的确得要字库支持的啊!学习了。

使用特权

评论回复
板凳
szopenmcu| | 2014-12-4 14:28 | 只看该作者
感谢楼主分享:)

使用特权

评论回复
地板
陈剑群| | 2015-4-24 16:26 | 只看该作者
请问楼主,显示汉字的时候是不是要用到SD卡和FAT32文件系统?因为我只要显示10几个汉字,能不能直接用字模点阵来显示?就是不用字库的方法。

使用特权

评论回复
5
21icszx| | 2015-4-24 20:40 | 只看该作者
请教楼主,不用FSMC是不是刷屏速度提不起来

使用特权

评论回复
6
www425531304| | 2015-5-30 15:29 | 只看该作者
学习了  谢谢分享

使用特权

评论回复
7
jaygeng| | 2015-7-27 17:18 | 只看该作者
写得不错!楼主你懂得怎样对相片进行缩放吗?还有如何提高刷屏速度列?

使用特权

评论回复
8
ljune| | 2015-7-29 10:22 | 只看该作者
//以下是放大4倍的字 程序
//
void ColourTo2(unsigned char bw,unsigned short WORD,unsigned short x,unsigned short y,unsigned long FrontColour,unsigned long BackgroundColour)
{
unsigned int j;
unsigned short xx,yy;
xx=x;yy=y;
for(j=0;j<bw;j++){
   if(WORD&(0x01<<(bw-1))){PutPixel(xx,yy,FrontColour);PutPixel(xx+1,yy,FrontColour);PutPixel(xx,yy+1,FrontColour);PutPixel(xx+1,yy+1,FrontColour);}
   else {PutPixel(xx,yy,BackgroundColour);PutPixel(xx+1,yy,BackgroundColour);PutPixel(xx,yy+1,BackgroundColour);PutPixel(xx+1,yy+1,BackgroundColour);}
   WORD=WORD<<1;
   xx=xx+2;
}
}
//

//
void WORD_writTo2(unsigned short WORD1,unsigned short x,unsigned short y,unsigned long FrontColour,unsigned long BackgroundColour)
{
unsigned char j;
unsigned short w,xx,yy;
xx=x;yy=y;
for(j=0;j<16;j++){
        w=word_816[WORD1*16+j];
        ColourTo2(8,w,xx,yy+j*2,FrontColour,BackgroundColour);
}//end for

}

//显示str的值,
//ok111111111111111111
void display_strTo2(char *str,unsigned short x,unsigned short y,unsigned long FrontColour,unsigned long BackgroundColour)
{
unsigned char i;
unsigned short xx,yy;
xx=x;yy=y;
for(i=0;str[i]!='\0';i++){
        //判断是否要换行
        if(xx+16>=HSIZE){
                 xx=0;
                 yy=yy+32;
                 ////判断是否要换页
                 if(yy+32>=VSIZE)yy=0;
                 }
        WORD_writTo2(str[i],xx,yy,FrontColour,BackgroundColour);
        xx=xx+16;
}
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:金龙107开发板http://shop36995246.taobao.com/

7

主题

65

帖子

1

粉丝