1、沈阳理工大学课程设计报告I摘 要随着社会经济的迅速发展,如今汉字显示系统应用于各个领域中。LCD 显示屏的技术和产业都取得了长足的发展,作为重要的现代信息发布媒体之一,LCD 显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。基于 STM32 的 LCD 显示可以更好的满足各种需求,也更便于操作和实现。汉字显示系统主要由 STM32 芯片作为 LCD彩色显示屏的主要核心控制器,并且通过字库制作软件制作相应的字库经过 SD 卡将自己所制作的字库中的汉字在屏幕中依次显示出来,同时可以通过按键控制,来控制现实的汉字的暂停,继续,更新字库。本系统是利用 STM32 开发板配合 SD 卡实现将
2、已存入字库中的汉字完整的显示在 LCD 彩色显示屏上。关键词: STM32 开发板;LCD 彩色显示屏;开关沈阳理工大学课程设计报告II目 录1 引言 .12 总体设计 .22.1 汉字显示设计分析 22.2 汉字显示的基本原理 22.3 系统的结构框图 33 详细设计 .43.1 硬件设计 43.1.1 芯片介绍 .43.1.2 功能简介 .43.2 软件设计 83.2.1 录字软件 .83.2.2 主函数部分 .93.2.3 硬件部分程序 .123.2.4 字库相关程序 .143.2.5 FAT 系 统 183.2.6 程序流程图 .194 实验结果及分析 .204.1 硬件实验结果 20
3、4.2 结果分析 205 结论 .21参考文献 .22沈阳理工大学课程设计报告11 引言随着嵌入式技术的迅猛发展,人机交互界面也越来越显示出它的重要性。实际的LCD 应用中要显示的汉字一般很有限,并不需要完整的汉字库,再加上完整字库在程序中要占用大量空间,因而非完整汉字库的研究就有了其自身的现实必要性。本次课程设计主要以 TFTLCD 的 LCD 显示模块,完整的实现了汉字库的建立与显示。TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD 与无源 TN-LCD、STN-LCD 的简单矩阵不同
4、,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。目前,显示技术和显示工业的发展迅速。显示技术是传递视觉的信息技术。液晶显示器件 LCD 是当今最有发展前途的一种平板显示器件,它具有很多独到的优异特性。它具有显示信息多、易于多彩化、体积小、重量轻、功耗低、寿命长、价格低、无辐射、无污染、接口控制方便等优点。沈阳理工大学课程设计报告22 总体设计2.1 汉字显示设计分析首先,要通过字库制作软件建立一个小的自己设计的汉字字库;其次需要将创建好的字库文件复制到 SD 卡中并将其插入到 STM32
5、的开发板上;最后就是编写程序,下载程序反复调试得出想要的结果。具体要实现的目标如下:1.更新字库,即文档可进行变换;2. 初始状态显示本次课设的基本信息;3.可以将输出的文字进行字体、颜色、大小的变换;4. 可对显示过的汉字进行计数;5. 显示显每个汉字所对应的内存字节;6. 在运行过程中可实现暂停、继续、变速等功能。7. 每显示一个汉字后,LED0 小灯会闪烁提示一下。2.2 汉字显示的基本原理汉字在液晶上的显示其实就是一些点的显示与不显示,这就相当于我们的笔一样,有笔经过的地方就画出来,没经过的地方就不画,所以只要知道了一个汉字点阵的生成方法,那么我们在程序里面就可以把这个点阵数据解析成一
6、个汉字。首先需要用字库制作软件制作一个 GBK 字库,将制作好的字库放在 SD 卡里面,然后通过 SD 卡,将字库文件复制到 W25X16 里,这样,W25X16 就相当于一款汉字字库芯片了,从而使STM32 芯片读取其中的数据显示到 LCD 显示屏上。沈阳理工大学课程设计报告32.3 系统的结构框图按键控制图 2.1 系统结构框图暂停继续更新字库显示调速STM32F103RB芯片SD 卡创建字库 在 LCD 上显示汉字沈阳理工大学课程设计报告43 详细设计3.1 硬件设计3.1.1 芯片介绍STM32 开发板主要采用 STM32F103RBT6 作为 MCU,STM32F103 的型号众多,
7、我们选择这款的原因是看重其性价比,作为一款低端开发板,选择 STM32F103RBT6是最佳的选择。128K FLASH、20K SRAM、2 个 SPI、3 个串口、1 个 USB、1 个CAN、 2 个 12 位的 ADC、RTC、51 个可用 IO 脚,这样的配置无论放到哪里都是很不错的了,更重要的是其价格,不到 13 元的批量价,足以秒杀很多其他芯片了,所以我们选择了它作为我们的主芯片。3.1.2 功能简介开机的时候先检测 W25X16 中是否已经存在字库,如果存在,则按次序显示汉字。如果没有,则检测 SD 卡和文件系统,并查找 SYSTEM 文件夹下的 FONT 文件夹,在该文件夹内
8、查找 UNI2GBK.SYS 和 GBK16.FON。在检测到这些文件之后,就开始更新字库,更新完毕才开始显示汉字。每显示一个汉字 LED0 小灯会闪烁一下。WK_UP 按键调整显示汉字的速度;key1 控制继续和暂停;key0 更新 SD 卡。所要用到的硬件资源如下: 1)STM32F103RBT6。 2)外部 LED0。 3)TFTLCD 液晶模块。 4)按键 WK_UP、key1、key0。5)W25X16。 6) SD 卡。沈阳理工大学课程设计报告51、 STM32 的简单介绍图 3.1 STM32原理图选择 STM32F103RBT6 作为 MCU,原因是其性价比高,128K FLA
9、SH、20K SRAM、2 个 SPI、3 个串口、 1 个 USB、1 个 CAN、2 个 12 位的 ADC、RTC、51 个可用 IO 脚,所以我们选择了它作为我们的主芯片。2、 外部 LED0图 3.2 外部 LED0原理图沈阳理工大学课程设计报告6其中 PWR 是系统电源指示灯,为蓝色。LED0 和 LED1 分别接在 PA8 和 PD2 上,PA8 还可以通过 TIM1 的通道 1 的 PWM 输出来控制 DS0 的亮度。3、 TFTLCD 液晶模块图 3.3 TFTLCD 液晶显示原理图TFT_LCD 是一个通用的液晶模块接口。OLED 是一个给 OLED 显示模块供电的接口,它
10、和 TFT_LCD 拼接在一起。当使用 2.4/2.8的 LCD 时,我们接到 TFT_LCD 上就可以了,而当我们使用 ALIENTEK 的 OLED 模块时,则接 OLED 排阵做电源,同时会连接到 TFT_LCD 上的部分管脚,从而实现 OLED 与 MCU 的连接。4、 按键图 3.4 按键输入原理图KEY0 和 KEY1 用作普通按键输入,分别连接在 PA13 和 PA15 上,他们都连接在了JTAG 相关的引脚上(KEY0 还连接在 SWDIO 上),KEY0 和 KEY1 还和 PS/2 的 DAT 和CLK 线共用,他们都通过 JTAG 的上拉电阻来提供上拉。 沈阳理工大学课程
11、设计报告7WK_UP 按键连接到 PA0(STM32 的 WKUP 引脚),它除了可以用作普通输入按键外,还可以用作 STM32 的唤醒输入。这个按键是高电平触发的。5、 W25X16图 3.5 25X16原理图这是 ALIENTEK MiniSTM32 开发板板载的一颗 FLASH 芯片,型号为 W25X16。这颗芯片的容量为 16M bit,也就是 2M 字节,容量和 AT45DB161 一样。适合存储不常修改的数据,比如字库等。6、 SD 卡图 3.6 SD卡部分原理图沈阳理工大学课程设计报告8插入 SD 卡可以外扩大容量存储设备,可以用来记录数据。SD 卡我们使用的是SPI 模式通信,
12、SD 卡的 SPI 接口连接到 STM32 的 SPI1 上,SD_CS 接在 PA3 上。3.2 软件设计汉字显示系统需要有 STM32 开发板配合 SD 卡使用,因此其程序需要分为以下几个文件夹,用来读取 SD 卡上的字库和 UNICODE 到 GBK 的转换码表的 FAT 系统文件,硬件组成文件 HARDWARE 系统文,汉字字库存储,及读取相应的文件 TEXT 文件,以及存放主程序文件 USER 文件件,和 STM32 的系统文件。3.2.1 录字软件双击如图所示的软件 ,进入主界面,如图 3.7。选择中文小字库开始输入文本创建确定,如图 3.8。完成后,将生成的文件拷入 SD 卡中。
13、图 3.7 点阵字库生成器沈阳理工大学课程设计报告9图 3.8 创建字库3.2.2 主函数部分int main(void)u32 fontcnt; u8 i,j; u16 fx,fy;u8 fontx2; u8 key; u16 t,ts;Stm32_Clock_Init(9); delay_init(72);uart_init(72,9600); LCD_Init(); KEY_Init(); LED_Init();SPI_Flash_Init();if(Font_Init() UPD:POINT_COLOR=BLACK;LCD_Clear(WHITE);LCD_ShowString(60,
14、50,“ STM32 “);LCD_ShowString(60,70,“Font Updating.“);SD_Initialize();while(FAT_Init() LCD_ShowString(60,90,“FAT SYS ERROR“); 沈阳理工大学课程设计报告10i= SD_Initialize();if(i) LCD_ShowString(60,110,“SD_CARD ERROR“); delay_ms(500);LCD_Fill(60,90,240,126,WHITE);delay_ms(500); LED0=!LED0; LED1=!LED1; while(Update_
15、Font()!=0) LCD_ShowString(60,110,“SYSTEM FILE LOST“);delay_ms(500);LCD_ShowString(60,130,“Please Check“);delay_ms(500);LED0=!LED0; LED1=!LED1; ; LCD_Clear(WHITE); RESET:LCD_Clear(WHITE); POINT_COLOR=RED;Show_Str(5,5,“电子系统设计“,16,0);Show_Str(140,5,“汉字显示系统“,16,0);POINT_COLOR=BLUE; Show_Str(10,40,“内码:高字
16、节 “,16,0);Show_Str(130,40,“低字节“,16,0);Show_Str(10,60,“对应汉字“,16,0);Show_Str(130,60,“计数器“,16,0);Show_Str(60,270,“ 张政 马舒阳 刘佳萍 “,16,0);Show_Str(90,290,“ 2015 年 7 月 9 日“,16,0);POINT_COLOR=BLACK;fx=15; fy=80; ts=600;while(1) fontcnt=0;for(i=0x81;i=220) fx=5;fy+=20; if(fy130) POINT_COLOR=RED;while(1) key=K
17、EY_Scan();if(key=1)goto UPD;if(key=2)goto RESET;LCD_ShowString(60,190,“Show Over“);delay_ms(500);LCD_ShowString(60,210,“Please Check“);delay_ms(500);LCD_Fill(60,210,220,230,WHITE); Show_Font(100,60,fontx,16,0);Show_Font(fx,fy,fontx,16,0); t=ts;while(t-) delay_ms(1);key=KEY_Scan();if(key=1)goto UPD;e
18、lse if(key=2) while(1) key=KEY_Scan();if(key=1)goto UPD;if(key=2) break; 沈阳理工大学课程设计报告12break; else if(key=3) if(ts=600) ts=200;else ts=600; LED0=!LED0; 3.2.3 硬件部分程序void KEY_Init(void) / 键盘相应程序RCC-APB2ENR|=1CRL GPIOA-CRL|=0X00000008; GPIOA-CRH GPIOA-CRH|=0X80800000; GPIOA-ODR|=1ODR|=1APB2ENR|=1APB2EN
19、R|=1CRH GPIOA-CRH|=0X00000003; GPIOA-ODR|=1CRLGPIOD-CRL|=0X00000300;GPIOD-ODR|=1APB2ENR|=1APB2ENR|=1CRL GPIOA-CRL|=0XBBB00000; GPIOA-ODR|=0X7CR1|=0CR1|=1CR1|=1CR1|=1CR1|=0CR1|=1CR1|=1CR1|=7CR1|=0CR1|=1CR1switch(SpeedSet) case SPI_SPEED_2: SPI1-CR1|=0CR1|=1CR1|=2CR1|=3CR1|=7CR1|=1SR SPI1-DR=TxData; r
20、etry=0;while(SPI1-SR return SPI1-DR; 3.2.4 字库相关程序u32 FONT16ADDR ; u32 FONT12ADDR ;u32 UNI2GBKADDR; #ifdef EN_UPDATE_FONTu8 temp512; u8 Update_Font(void) u32 fcluster=0; u32 i; u32 tempsys2; float prog; u8 t; FileInfoStruct FileTemp; if(FAT32_Enable) fcluster=FirstDirClust;else fcluster=0; FileTemp=F
21、_Search (fcluster, (unsigned char *) folder0, T_FILE);if(FileTemp.F_StartCluster=0) return 1; FileTemp=F_Search(FileTemp.F_StartCluster, (unsigned char*)folder1, T_FILE);if(FileTemp.F_StartCluster=0) return 2;fcluster=FileTemp.F_StartCluster; FileTemp=F_Search (fcluster, (unsigned char *) sysfile2,
22、T_SYS); if(FileTemp.F_StartCluster=0) return 3; LCD_ShowString (20,90,“Write UNI2GBK to FLASH.“);LCD_ShowString (108,110,“%“);F_Open(i=0; while (F_Read (LCD_ShowNum(84,110,t,3,16); UNI2GBKADDR = 100000;tempsys0 = UNI2GBKADDR;tempsys1 = FileTemp.F_Size; SPI_Flash_Write(u8*)tempsys,0,8);delay_ms(1000)
23、; FONT16ADDR = FileTemp.F_Size+UNI2GBKADDR;FileTemp = F_Search(fcluster, (unsigned char*)sysfile0 , T_FON); if (FileTemp.F_StartCluste r= 0) return 4;LCD_ShowString (20,90,“Write FONT16 to FLASH. “);F_Open( i=0; while(F_Read(LCD_ShowNum(84,110,t,3,16); tempsys0=FONT16ADDR;tempsys1=FileTemp.F_Size;SP
24、I_Flash_Write(u8*)tempsys,8,8);delay_ms(1000);FONT12ADDR = FileTemp.F_Size+FONT16ADDR; t=0XAA; SPI_Flash_Write(LCD_ShowString (20, 90,“ Font Update Successed “) ; return 0; #endif 沈阳理工大学课程设计报告16u8 Font_Init(void) u32 tempsys2; u8 fontok=0 ;SPI_Flash_Read(if(fontok!=0XAA) return 1;SPI_Flash_Read(u8*)
25、tempsys,0,8) ; UNI2GBKADDR=tempsys0; SPI_Flash_Read(u8*)tempsys,8,8) ; FONT16ADDR=tempsys0;SPI_Flash_Read(u8*)tempsys,16,8) ; FONT12ADDR=tempsys0;return 0; /获取字库资源信息void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size) unsigned char qh,ql; unsigned char i; unsigned long foffset; qh=*code;ql
26、=*(+code);if(qh0x80)bHz=1;else if(x(LCD_W-size/2) y+=size; x=0 ; if (y(LCD_H-size) break; if (*str=13) y+=size;x=0;str+; else LCD_ShowChar(x,y,*str,size,mode);str+; x+=size/2; else bHz=0; if(x(LCD_W-size) y+=size;x=0; if(y(LCD_H-size)break; Show_Font(x,y,str,size,mode); str+=2; x+=size; u16 my_strle
27、n(u8*str) u16 len=0; while(*str!=0) str+; len+; return len; void my_stradd( u8*str1, u8*str2 ) while(*str1!=0)str1+; while(*str2!=0) *str1=*str2;str2+;str1+;*str1=0; void Show_Str_Mid(u16 x,u16 y,u8*str,u8 size,u8 len) u16 strlenth=0; strlenth=my_strlen(str);strlenth*=size/2;沈阳理工大学课程设计报告18if(strlent
28、hlen)Show_Str(x,y,str,size,1);else strlenth=(len-strlenth)/2;Show_Str(strlenth+x,y,str,size,1); 3.2.5 FAT 系统/用来读取 SD 卡上的字库 FAT 系统相关程序:DWORD FirstDirClust; DWORD FirstDataSector;WORD BytesPerSector; DWORD FATsectors;WORD SectorsPerClust; DWORD FirstFATSector;DWORD FirstDirSector; fat32DWORD RootDirSe
29、ctors;DWORD RootDirCount;BYTE FAT32_Enable;DWORD Cur_Dir_Cluster; FAT_TABLE FAT_TAB; FileInfoStruct F_Info3; u8 fat_buffer512;u8 LongNameBuffer MAX_LONG_NAME_SIZE; BOOL LongNameFlag = 0;const unsigned char *filetype23= “MP1“,“MP2“,“MP3“,“MP4“,“M4A“,“3GP“,“3G2“,“OGG“,“ACC“,“WMA“,“WAV“,“MID“,“FLA“,“LR
30、C“,“TXT“,“C “,“H “,“ “,“FON“,“SYS“,“BMP“,“JPG“,“JPE“ ;沈阳理工大学课程设计报告193.2.6 程序流程图结束复制 SD 卡创建字库开始SD 卡插入开发板在 LCD 中显示相应汉字按键暂停/继续更新字库按键变速否Key1 Key0 WK_UP图 3.9 程序流程图沈阳理工大学课程设计报告204 实验结果及分析4.1 硬件实验结果图 4.1 实验结果4.2 结果分析开机的时候先检测 W25X16 中是否已经存在字库,如果存在,则按次序显示汉字。如果没有,则检测 SD 卡和文件系统,并查找 SYSTEM 文件夹下的 FONT 文件夹,在该文件夹内
31、查找 UNI2GBK.SYS 和 GBK16.FON。在检测到这些文件之后,就开始更新字库,更新完毕才开始显示汉字。初始状态显示本次课设的基本信息;LCD 显示屏上显示课题名称及成员信息,显示每个汉字所对应的内存字节还有对显示过的汉字进行计数;每显示一个汉字后,LED0 小灯会闪烁提示一下;在运行过程中按 WK_UP 键可加快汉字显示的速度,再次按下速度恢复慢速;key1 控制继续和暂停;key0 更新字库,即文档可进行变换。沈阳理工大学课程设计报告215 结论本次基于 ARM 的汉字显示系统耗时很久,最后做出的来的功能也是经过反复多次调试才全部达标,是一次很有意义的学习和动手经历。从懵懂嵌入
32、式到在 STM 开发板上成功编写出相应的程序,下载程序,调试成功的那一刻我们的喜悦,是无法用任何语言来加以形容的!通过本次课程设计我们的感受到看再多的课本可能效果也不如实际编程的学习效率高。调试程序比编程本身枯燥的多,但是在某种意义上更加重要。但是实际结果能不能达到还要看调试,要考虑算法逻辑、语法、内存地址等诸多方面。这一点在对硬件编程上体现的尤为明显。本实验最后完成了汉字显示的诸多功能,但并没有向其他领域拓展的功能,是比较遗憾的地方。希望在以后能得到很好的弥补!沈阳理工大学课程设计报告22参考文献1 徐英慧.ARM9 嵌入式系统设计.第二版.北京航空航天大学出版社, 2014:238-245.2 龚跃玲, 汪玲彦.基于 STM32 的汉字显示的实现 .第 3 版. 北京航空航天大学出版社, 2011:32-34.3 王磊.STM32 不完全手册 V2.3.第二版.机械工业出版社, 2014:382-418.4 马忠梅.基于 STM32 的显示系统设计.第三版.电子工业出版社, 2013:128-134.5 韦东山. Linux 应用开发完全手册.第二版.北京时代华都印刷有限公司, 2010:197221.