(5)用于复位的RESX信号线。
其中带X的表示低电平有效。除了控制信号,还有数据信号线,它的数目不定,可根据ILI9341框图中的IM[3:0]来设定,这部分一般由制作液晶屏的厂家完成。为便于传输像素点数据,野火使用的液晶屏设定为16条数据线D[15:0]。使用8080接口的写命令时序图见图2-9。
图2-9 使用18条数据线的8080接口写命令时序
由图可知,写命令时序由CSX信号线拉低开始,D/CX信号线也置低电平表示写入的是命令地址(可理解为命令编码,如软件复位命令:0x01),以WRX信号线为低,RDX信号为高表示数据传输方向为写入,同时,在数据线[17:0]输出命令地址,在第二个传输阶段
传送的为命令的参数,所以D/CX要置高电平,表示写入的是命令数据。 当我们需要向GRAM写入数据的时候,把CSX信号线拉低后,把D/CX信号线置为高电平,这时由D[17:0]传输的数据则会被ILI9341保存至它的GRAM中。
9
3 软件设计
3.1 字模提取方法 3.1.1 字模
液晶屏是一个由像素点组成的点阵,若要显示文字,则需要很多像素点的共同构成。见图 3-1,图中是两个由16*16的点阵显示的两个汉字。
图3-1 字模
如果规定:每个汉字都由这样16*16的点阵来显示,把笔迹经过的像素点以“1”表示,没有笔迹的点以“0”表示,每个像素点的状态以一个二进制位来记录,用16*16/8=32个字节就可以把这个字记录下来。这32个字节数据就称为该文字的字模,还有其它常用字模是24*24、32*32的。
在这样的字模中,以两个字节表示一行像素点,16行构成一个字模。如果使用LCD的画点函数,按位来扫描这些字模数据,把为1的位以黑色来显示(也可以使用其它颜色),即可把整个点阵还原出来,显示在液晶屏上。
3.1.2 制作字模
本文采用“字模Ⅲ-增强版 v3.91”字模软件来制作中文字库。步骤如下: 1、打开字模软件
2、点击“批量生成字库”按钮选项
3、点击选项“文本文件”,在打开的界面里选择“GB2132.txt”。如图3-5、图3-6所示。此时在“输入批量字符框”里会列出二级汉字的所有汉字,其中共收录了6768个汉字字符。
4、点击“字库智能生成”,弹出“字库批量参数确认”对话框。我们在“源字体”选项里面做如下设置,字模宽度和高度都选择16,因为要放在SD卡中,所以选择BIN文件格式。
10
5、点击“开始转换进程”,就会在软件安装目录下会生成Font.dat文件。将生成的汉字字库拷贝到SD卡根目录下并重命名为“HZLIB.bin”。把该文件保存到SD卡中,STM32芯片通过文件系统读取文件即可获得字库的数据。
3.2 显示中英文及BMP图片
系统的流程图如图3-3所示,先将LCD的引脚和寄存器初始化;再向ILI19431写入命令和数据;配置FSMC;再设置ILI9431的GRAM的扫描方向:左上角>右下角为显示中英文的采用的模式,右下角>左上角为显示摄像头图像,右上角>左下角为显示BMP图片;对ILI9431显示器进行设置,读取ILI9431的像素数据;在ILI9431显示器上画出一个矩形;在ILI9431显示器上显示英文、中文字符和BMP图片。
图3-3 系统流程图
11
3.2.1 配置工程环境
本实验需要制作字库,其文件名为:HZLIB.bin,三个BMP图片文件,文件名为:pic1.bmp、pic2.bmp、pic3.bmp,把这四个文件保存到SD卡中,再把该SD卡插入开发板的SD卡接口。
本实验中要把旧文件:systick.c、usart1.c、lcd.c、ff.c、sdio_sdcard.c、lcd_botton.c文件添加进新工程,新建Sd_bmp.c、sd_fs_app.c文件,分别用于编写BMP文件相关的函数和字模获取函数。
3.2.2 main文件
显示中英文字符和BMP图片用了两个函数,所以在这里放置了两个main函数。显示汉字的main函数它调用了很多函数,主要是将SD卡的读取接口和LCD初始化,再调用扫描和读取的函数,并设置了要显示的中英文。同样的,显示BMP图片的main函数也调用了一些函数用于显示BMP图。
//显示汉字的main函数 int main ( void )
{ Sd_fs_init(); //初始化SDIO LCD_Init (); //LCD初始化
ILI9341_GramScan(1); //设定(坐标轴)扫描方向 ILI9341_Clear ( 0, 0, 240, 320, macBLACK );
ILI9341_DispString_EN (5,5, \
ILI9341_DispString_EN (5,25,\ ILI9341_DispString_CH (50,57, \大学\
ILI9341_DispString_EN_CH (30, 90, \to use 野火 ISO Stm32 开发板
bigo------\
while ( 1 );
}
//显示图片的main函数 int main ( void )
{ Sd_fs_init(); //初始化SDIO LCD_Init (); //LCD 初始化 Lcd_show_bmp( 10,10,\ Lcd_show_bmp( 10,100,\
//显示BMP图片 while ( 1 );
12
}
3.2.3 显示中英文的主要代码
ILI9341_DispString_EN_CH()函数的作用主要为在ILI9341显示器上显示中英文字符串,在得到特定扫描方向下字符串的起始X、Y坐标后进行对像素数据的读取,然后设置字符串的背景色、前景色,将字符显示出来。
/**
* @brief 在ILI9341 显示器上显示中英文字符串 * @param usX :在特定扫描方向下字符串的起始X坐标 * @param usY :在特定扫描方向下字符串的起始Y坐标 * @param pStr :要显示的字符串的首地址
* @param usColor_Background :选择字符串的背景色 * @param usColor_Background :选择字符串的前景色 * @retval 无 */
void ILI9341_DispString_EN_CH ( uint16_t usX, uint16_t usY, const uint8_t * pStr, uint16_t usColor_Background, uint16_t usColor_Foreground ) { uint16_t usCh;
while( * pStr != '\\0' ) { if ( * pStr <= 126 )
//英文字符
{ if ( ( usX - macILI9341_DispWindow_X_Star + macWIDTH_EN_CHAR ) > } else
//汉字字符
{ if ( ( usX - macILI9341_DispWindow_X_Star + macWIDTH_CH_CHAR ) >
{ usX = macILI9341_DispWindow_X_Star;
usY += macHEIGHT_CH_CHAR; }
if ( ( usY - macILI9341_DispWindow_Y_Star + macHEIGHT_CH_CHAR ) >
13
macILI9341_DispWindow_COLUMN )
{ usX = macILI9341_DispWindow_X_Star;
usY += macHEIGHT_EN_CHAR; }
if ( ( usY - macILI9341_DispWindow_Y_Star + macHEIGHT_EN_CHAR ) > { usX = macILI9341_DispWindow_X_Star;
usY = macILI9341_DispWindow_Y_Star;
}
macILI9341_DispWindow_PAGE )
ILI9341_DispChar_EN(usX,usY,*pStr,usColor_Background, usColor_Foreground );
usX += macWIDTH_EN_CHAR; pStr ++;
macILI9341_DispWindow_COLUMN )