主机环境:Windows 7 SP1
开发环境:MDK5.14
目标板:ST NUCLEO-F303RE
TFT型号:2.4英寸,带触摸,SD卡,240*320分辨率,26万色
驱动IC:ILI9325
ST库版本:STM32Cube_FW_F3_V1.1.0
刷完图片之后,很自然就想进行刷字符实验,该刷字符实验其实跟刷12864液晶屏字符是一样的,因为都是点阵型液晶屏,需要我们把字符转换成点阵数据,这里就需要借助取字模工具了,这个网上有很多,这里使用的是PCtoLCD2002
这里需要注意的是取模方式,需要和你的ILI9325驱动相配合,这里我使用逐行式扫描,高位在前,阴码格式。如下:
刷字符和刷图片其实是一样的,唯一不同的是,对于字符来说在一块区域中不是每个点都是有值的(即不为0),因此要想在LCD上显示该字符需要设置两种颜色,前景色和背景色,当刷字符时如果当前bit为1则刷入前景色,当前bit为0时则刷入背景色,针对字符大小不同就需要设置不同的window area这样才能显示正确的字符,上图中字符点阵是16*16,因此需要调用LCD_SetDisplayWindow(0x0000,0x0000,16,16);来设置当前字符的区域地址以及宽度和高度,刷字符代码如下
for(i = 0; i < 32; i++) { for(j = 0; j < 8; j++) { if(abc[i]&0x80) { ILI9325_Write_Value(LCD_BLACK); } else { ILI9325_Write_Value(LCD_WHITE); } abc[i]<<=1; } }abc即为用软件生成的字库代码,效果如下:
在完善LCD的过程中发现一个很有用的代码,原来在F3Cube的库里面有一个很好的LCD代码以及驱动代码供我们参考,在库里面的Drivers文件夹下的BSP目录里面,如图
里面有个stm32303e_evel_lcd.c/h文件,打开
可以看到左侧提供了很多函数,我们完全可以拿来借用,有巨人的肩膀让我们站,为啥不占呢?哈哈,同时在components目录下有个ili9328驱动文件,如图
同时库代码使用的结构也很好,lcd里面提供统一的接口由具体的驱动ic代码来实现各自具体的代码,很方便对代码进行扩展,我们只需要编辑对应ili9325代码即可,大家可以借鉴一哈。本来想借机研究以下FMC驱动LCD的可是看完相应的文档后发现NUCLEO-F303RE没有FMC引脚,只有100pin以上的芯片才有FMC引脚,没搞头了。。。FMC的学习推荐大家看官方的AN2790应用笔记——TFT LCD与FSMC的硬件连接 大容量STM32F10xxx FSMC接口,讲的就是如用使用FSMC来驱动TFT LCD。
临了看到刷字符的白色背景色很突兀特别影响美观,然后就想能不能去掉背景色,如果背景是单一颜色的纯色,那我们刷字符时只需要设置字符的背景色为底部的纯色就可以了,如果我们的底部是一副图片呢,就像之前的图,字符的背景色白色很不和谐,怎么实现呢?RGB565是没有透明度属性的,而且GRAM的AC是自动控制,因此我们只需要在刷字符背景色时重新计算游标就可以了,而不是刷入背景色,代码如下
for(i = 0; i < 32; i++) { for(j = 0; j < 8; j++) { if(abc[i]&0x80) { ILI9325_Write_Value(LCD_BLACK); } else { //ILI9325_Write_Value(LCD_WHITE); //重新计算游标地址 LCD_SetCursor(((i%2)*8 + (j + 1))%16,i/2 + ((j+1)/8)*(i%2)); ILI9325_Write_Address(0x22); } abc[i]<<=1; } }需要注意的是这个代码是有问题的,我这里的起始地址为(0,0),对于任意地址而言LCD_SetCursor里面的值是需要重新计算的,跟你的起始地址是有关系的,这里只是看效果所以没考虑那么多,效果图如下
可以看到左上角的白色背景色没有了,"中"字就像是在图片上的水印一样。然而这并没有什么卵用。。。