本科毕业设计基于arm的汉字显示系统设计.docx

上传人:b****6 文档编号:4280244 上传时间:2022-11-28 格式:DOCX 页数:22 大小:1.91MB
下载 相关 举报
本科毕业设计基于arm的汉字显示系统设计.docx_第1页
第1页 / 共22页
本科毕业设计基于arm的汉字显示系统设计.docx_第2页
第2页 / 共22页
本科毕业设计基于arm的汉字显示系统设计.docx_第3页
第3页 / 共22页
本科毕业设计基于arm的汉字显示系统设计.docx_第4页
第4页 / 共22页
本科毕业设计基于arm的汉字显示系统设计.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

本科毕业设计基于arm的汉字显示系统设计.docx

《本科毕业设计基于arm的汉字显示系统设计.docx》由会员分享,可在线阅读,更多相关《本科毕业设计基于arm的汉字显示系统设计.docx(22页珍藏版)》请在冰豆网上搜索。

本科毕业设计基于arm的汉字显示系统设计.docx

本科毕业设计基于arm的汉字显示系统设计

摘要

本文介绍了基于STM32的汉字显示系统设计。

现如今LCD显示屏的技术和产业都取得了长足的发展,作为重要的现代信息发布媒体之一,LCD显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。

基于STM32的LCD显示可以更好的满足各种需求,也更便于操作和实现。

通电后,复位到初始化状态可显示本次课程设计题目及成员等基本信息,可人为操作对显示信息的汉字进行自定义大小颜色及字体等等;通过字库制作软件制作相应的字库经过SD卡将自己所制作的字库中的汉字在屏幕中依次显示出来,同时可以通过按键控制实现显示汉字的速度、暂停、继续以及更新字库。

本系统是利用STM32开发板配合SD卡实现将已存入字库中的汉字完整的显示在LCD彩色显示屏上。

关键词:

STM32;LCD液晶显示;开关;汉字显示

目录

1引言1

2总体设计2

2.1汉字显示的基本原理2

2.2汉字显示设计分析2

2.3系统的结构框图3

3详细设计4

3.1硬件设计4

3.1.1ALIENTEKMiniSTM32开发板简介4

3.1.2功能简介4

3.2软件设计8

3.2.1录字软件8

3.2.2主函数部分9

3.2.3硬件部分程序12

3.2.4字库相关程序14

3.2.5FAT系统19

3.2.6程序流程图20

4实验结果及分析21

4.1硬件实验结果21

4.2结果分析21

5结论22

参考文献23

1引言

进入新世纪LCD显示屏的技术和产业都取得了长足的发展,作为重要的现代信息发布媒体之一,LCD显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。

伴随社会信息化进程的推进,LCD显示屏技术也在不断的推陈出新,应用领域愈加广阔。

基于STM32的LCD显示可以更好的满足各种需求,也更便于操作和实现。

现基于STM32在液晶显示屏幕上显示文本及图形。

目前,显示技术和显示工业的发展迅速。

显示技术是传递视觉的信息技术。

液晶显示器件LCD是当今最有发展前途的一种平板显示器件,它具有很多独到的优异特性。

它具有显示信息多、易于多彩化、体积小、重量轻、功耗低、寿命长、价格低、无辐射、无污染、接口控制方便等优点。

实际的LCD应用中要显示的汉字一般很有限,并不需要完整的汉字库,再加上完整字库在程序中要占用大量空间,因而非完整汉字库的研究就有了其自身的现实必要性。

本次课程设计主要以TFTLCD的LCD显示模块,完整的实现了汉字库的建立与显示。

2总体设计

2.1汉字显示的基本原理

制作一个GBK字库,制作好的字库放在SD卡里面,然后通过SD卡,将字库文件复制到W25X16里,这样,W25X16就相当于一款汉字字库芯片了。

汉字在液晶上的显示其实就是一些点的显示与不显示,这就相当于我们的笔一样,有笔经过的地方就画出来,没经过的地方就不画。

所以要显示汉字,我们首先要知道汉字的点阵数据,这些数据可以由专门的软件来生成。

只要知道了一个汉字点阵的生成方法,那么我们在程序里面就可以把这个点阵数据解析成一个汉字。

知道显示了一个汉字,就可以推及整个汉字库了。

汉字在电脑里面存储不是以点阵数据的形式存储的,而是以内码的形式存储的,每个汉字对应着一个内码,在知道了内码之后再去字库里面查找这个汉字的点阵数据,然后在液晶上显示出来。

这个过程我们是看不到,但是计算机是要去执行的。

嵌入式要显示汉字也与此类似:

汉字内码->查找点阵库->解析->显示。

所以只要我们有了整个汉字库的点阵,就可以把电脑上的文本信息在嵌入式上显示出来了。

2.2汉字显示设计分析

设计一个基于STM32系统,开机的时候先检测W25X16中是否已经存在字库,如果存在,则按次序显示汉字。

如果没有,则检测SD卡和文件系统,并查找SYSTEM文件夹下的FONT文件夹,在该文件夹内查找UNI2GBK.SYS和GBK16.FON。

在检测到这些文件之后,就开始更新字库,更新完毕才开始显示汉字。

具体要实现的目标如下:

1.更新字库,即文档可进行变换;

2.初始状态显示本次课设的基本信息;

3.可以将输出的文字进行字体、颜色、大小的变换;

4.可对显示过的汉字进行计数;

5.显示显每个汉字所对应的内存字节;

6.在运行过程中可实现暂停、继续、变速等功能。

7.每显示一个汉字后,LED0小灯会闪烁提示一下。

2.3系统的结构框图

暂停

继续

更新字库

显示调速

按键控制

 

图2.1系统结构框图

3详细设计

3.1硬件设计

3.1.1ALIENTEKMiniSTM32开发板简介

ALIENTEKMiniSTM32开发板是一款迷你型的开发板,小巧而不小气,简约而不简单。

它的外观尺寸只有8cm*10cm大小,板子的设计充分考虑了成本与功能这两个矛盾面,再结合实际使用的经验及STM32的特点,可有可无的选择性价比最高的留下,最终确定了这样的设计。

其资源丰富,设计灵活。

特点包括:

1)小巧。

整个板子尺寸为8cm*10cm*2cm。

2)灵活。

板上除晶振外的所有的IO口全部引出,特别还有GPIOA和GPIOB的IO口是按顺序引出的,可以极大的方便大家扩展及使用,另外板载独特的一键下载功能,避免了频繁设置B0、B1带来的麻烦,直接在电脑上一键下载。

3)资源丰富。

板载十多种外设及接口,可以充分挖掘STM32的潜质。

4)质量过硬。

沉金PCB+全新优质元器件+定制全铜镀金排针/排座+电源TVS保护,坚若磐石。

3.1.2功能简介

开机的时候先检测W25X16中是否已经存在字库,如果存在,则按次序显示汉字。

如果没有,则检测SD卡和文件系统,并查找SYSTEM文件夹下的FONT文件夹,在该文件夹内查找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卡。

1、STM32的简单介绍

图3.1STM32原理图

选择STM32F103RBT6作为MCU,原因是其性价比高,128KFLASH、20KSRAM、2个SPI、3个串口、1个USB、1个CAN、2个12位的ADC、RTC、51个可用IO脚…,所以我们选择了它作为我们的主芯片。

2、外部LED0

图3.2外部LED0原理图

其中PWR是系统电源指示灯,为蓝色。

LED0和LED1分别接在PA8和PD2上,PA8还可以通过TIM1的通道1的PWM输出来控制DS0的亮度。

3、TFTLCD液晶模块

图3.3TFTLCD液晶显示原理图

TFT_LCD是一个通用的液晶模块接口。

OLED是一个给OLED显示模块供电的接口,它和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的上拉电阻来提供上拉。

WK_UP按键连接到PA0(STM32的WKUP引脚),它除了可以用作普通输入按键外,还可以用作STM32的唤醒输入。

这个按键是高电平触发的。

5、W25X16

图3.525X16原理图

这是ALIENTEKMiniSTM32开发板板载的一颗FLASH芯片,型号为W25X16。

这颗芯片的容量为16Mbit,也就是2M字节,容量和AT45DB161一样。

适合存储不常修改的数据,比如字库等。

6、SD卡

图3.6SD卡部分原理图

插入SD卡可以外扩大容量存储设备,可以用来记录数据。

SD卡我们使用的是SPI模式通信,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卡中。

图3.7点阵字库生成器

图3.8创建字库

3.2.2主函数部分

intmain(void)

{

u32fontcnt;

u8i,j;

u16fx,fy;

u8fontx[2];

u8key;

u16t,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,50,"STM32");

LCD_ShowString(60,70,"FontUpdating...");

SD_Initialize();

while(FAT_Init())

{LCD_ShowString(60,90,"FATSYSERROR");

i=SD_Initialize();

if(i)

{LCD_ShowString(60,110,"SD_CARDERROR");}

delay_ms(500);

LCD_Fill(60,90,240,126,WHITE);

delay_ms(500);LED0=!

LED0;LED1=!

LED1;}

while(Update_Font()!

=0)

{LCD_ShowString(60,110,"SYSTEMFILELOST");

delay_ms(500);

LCD_ShowString(60,130,"PleaseCheck....");

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,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<0xp;i++)

{fontx[0]=i;LCD_ShowNum(100,40,i,3,16);

for(j=0x40;j<0xfe;j++)

{if(j==0x7f)continue;

fontcnt++;

LCD_ShowNum(210,40,j,3,16);

LCD_ShowNum(190,60,fontcnt,5,16);

fontx[1]=j;fx+=15;

if(fx>=220)

{fx=5;fy+=20;}

if(fy>130)

{POINT_COLOR=RED;

while

(1)

{key=KEY_Scan();

if(key==1)gotoUPD;

if(key==2)gotoRESET;

LCD_ShowString(60,190,"ShowOver");

delay_ms(500);

LCD_ShowString(60,210,"PleaseCheck....");

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)gotoUPD;

elseif(key==2)

{while

(1)

{key=KEY_Scan();

if(key==1)gotoUPD;

if(key==2)break;}

break;}

elseif(key==3)

{if(ts==600)ts=200;

elsets=600;}}

LED0=!

LED0;}}}}

3.2.3硬件部分程序

voidKEY_Init(void)//键盘相应程序

{

RCC->APB2ENR|=1<<2;

GPIOA->CRL&=0XFFFFFFF0;

GPIOA->CRL|=0X00000008;

GPIOA->CRH&=0X0F0FFFFF;

GPIOA->CRH|=0X80800000;

GPIOA->ODR|=1<<13;

GPIOA->ODR|=1<<15;}

u8KEY_Scan(void)

{staticu8key_up=1;

JTAG_Set(JTAG_SWD_DISABLE);

if(key_up&&(KEY0==0||KEY1==0||KEY2==1))

{delay_ms(10);key_up=0;

if(KEY0==0)

{JTAG_Set(SWD_ENABLE);

return1;}

elseif(KEY1==0)

{JTAG_Set(SWD_ENABLE);return2;}

elseif(KEY2==1)

{JTAG_Set(SWD_ENABLE);return3;}

}elseif(KEY0==1&&KEY1==1&&KEY2==0)key_up=1;

JTAG_Set(SWD_ENABLE);return0;}

voidLED_Init(void)//led相应程序

{RCC->APB2ENR|=1<<2;

RCC->APB2ENR|=1<<5;

GPIOA->CRH&=0XFFFFFFF0;

GPIOA->CRH|=0X00000003;

GPIOA->ODR|=1<<8;

GPIOD->CRL&=0XFFFFF0FF;

GPIOD->CRL|=0X00000300;GPIOD->ODR|=1<<2;}

voidSPIx_Init(void)//SD卡驱动程序

{RCC->APB2ENR|=1<<2;

RCC->APB2ENR|=1<<12;

GPIOA->CRL&=0X000FFFFF;

GPIOA->CRL|=0XBBB00000;

GPIOA->ODR|=0X7<<5;

SPI1->CR1|=0<<10;SPI1->CR1|=1<<9;

SPI1->CR1|=1<<8;SPI1->CR1|=1<<2;

SPI1->CR1|=0<<11;SPI1->CR1|=1<<1;

SPI1->CR1|=1<<0;SPI1->CR1|=7<<3;

SPI1->CR1|=0<<7;SPI1->CR1|=1<<6;

SPIx_ReadWriteByte(0xff);}

voidSPIx_SetSpeed(u8SpeedSet)

{SPI1->CR1&=0XFFC7;

switch(SpeedSet)

{caseSPI_SPEED_2:

SPI1->CR1|=0<<3;break;

caseSPI_SPEED_4:

SPI1->CR1|=1<<3;break;

caseSPI_SPEED_8:

SPI1->CR1|=2<<3;break;

caseSPI_SPEED_16:

SPI1->CR1|=3<<3;break;

caseSPI_SPEED_256:

SPI1->CR1|=7<<3;break;}

SPI1->CR1|=1<<6;}

u8SPIx_ReadWriteByte(u8TxData)

{u8retry=0;

while((SPI1->SR&1<<1)==0)

{retry++;if(retry>200)return0;}

SPI1->DR=TxData;retry=0;

while((SPI1->SR&1<<0)==0)

{retry++;if(retry>200)return0;}

returnSPI1->DR;}

3.2.4字库相关程序

u32FONT16ADDR;

u32FONT12ADDR;

u32UNI2GBKADDR;

#ifdefEN_UPDATE_FONT

u8temp[512];

u8Update_Font(void)

{u32fcluster=0;

u32i;

u32tempsys[2];

floatprog;

u8t;

FileInfoStructFileTemp;

if(FAT32_Enable)

fcluster=FirstDirClust;

elsefcluster=0;

FileTemp=F_Search(fcluster,(unsignedchar*)folder[0],T_FILE);

if(FileTemp.F_StartCluster==0)return1;

{FileTemp=F_Search(FileTemp.F_StartCluster,(unsignedchar*)folder[1],T_FILE);

if(FileTemp.F_StartCluster==0)return2;

fcluster=FileTemp.F_StartCluster;

FileTemp=F_Search(fcluster,(unsignedchar*)sysfile[2],T_SYS);if(FileTemp.F_StartCluster==0)return3;

LCD_ShowString(20,90,"WriteUNI2GBKtoFLASH...");

LCD_ShowString(108,110,"%");

F_Open(&FileTemp);i=0;

while(F_Read(&FileTemp,temp))

{if(i

{SPI_Flash_Write(temp,i+100000,512);i+=512;}

prog=(float)i/FileTemp.F_Size;

prog*=100;

if(t!

=prog)

{t=prog;if(t>100)t=100;

LCD_ShowNum(84,110,t,3,16);}}

UNI2GBKADDR=100000;

tempsys[0]=UNI2GBKADDR;

tempsys[1]=FileTemp.F_Size;

SPI_Flash_Write((u8*)tempsys,0,8);

delay_ms(1000);

FONT16ADDR=FileTemp.F_Size+UNI2GBKADDR;

FileTemp=F_Search(fcluster,(unsignedchar*)sysfile[0],T_FON);

if(FileTemp.F_StartCluster==0)return4;

LCD_ShowString(20,90,"WriteFONT16toFLASH...");

F_Open(&FileTemp);i=0;

while(F_Read(&FileTemp,temp))

{if(i

{SPI_Flash_Write(temp,i+FONT16ADDR,512);i+=512;}

prog=(float)i/FileTemp.F_Size;

prog*=100;if(t!

=prog)

{t=prog;if(t>100)t=100;

LCD_ShowNum(84,110,t,3,16);}}

tempsys[0]=FONT16ADDR;

tempsys[1]=FileTemp.F_Size;

SPI_Flash_Write((u8*)tempsys,8,8);

delay_ms(1000);

FONT12ADDR=FileTemp.F_Size+FONT16ADDR;}

t=0XAA;SPI_Flash_Write(&t

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1