本科毕业设计基于arm的汉字显示系统设计Word下载.docx
- 文档编号:17198343
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:22
- 大小:1.91MB
本科毕业设计基于arm的汉字显示系统设计Word下载.docx
《本科毕业设计基于arm的汉字显示系统设计Word下载.docx》由会员分享,可在线阅读,更多相关《本科毕业设计基于arm的汉字显示系统设计Word下载.docx(22页珍藏版)》请在冰豆网上搜索。
本次课程设计主要以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中是否已经存在字库,如果存在,则按次序显示汉字。
每显示一个汉字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);
LED0=!
LED0;
LED1=!
LED1;
while(Update_Font()!
=0)
{LCD_ShowString(60,110,"
SYSTEMFILELOST"
LCD_ShowString(60,130,"
PleaseCheck...."
};
RESET:
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str(5,5,"
电子系统设计"
16,0);
Show_Str(140,5,"
汉字显示系统"
POINT_COLOR=BLUE;
Show_Str(10,40,"
内码:
高字节"
Show_Str(130,40,"
低字节"
Show_Str(10,60,"
对应汉字"
Show_Str(130,60,"
计数器"
Show_Str(60,270,"
张政马舒阳刘佳萍"
Show_Str(90,290,"
2015年7月9日"
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,"
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)
if(key==2)break;
break;
elseif(key==3)
{if(ts==600)ts=200;
elsets=600;
LED0=!
}}}}
3.2.3硬件部分程序
voidKEY_Init(void)//键盘相应程序
RCC->
APB2ENR|=1<
<
2;
GPIOA->
CRL&
=0XFFFFFFF0;
CRL|=0X00000008;
CRH&
=0X0F0FFFFF;
CRH|=0X80800000;
ODR|=1<
13;
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)
return3;
}elseif(KEY0==1&
KEY1==1&
KEY2==0)key_up=1;
JTAG_Set(SWD_ENABLE);
return0;
voidLED_Init(void)//led相应程序
{RCC->
5;
CRH|=0X00000003;
8;
GPIOD->
=0XFFFFF0FF;
CRL|=0X00000300;
voidSPIx_Init(void)//SD卡驱动程序
12;
=0X000FFFFF;
CRL|=0XBBB00000;
ODR|=0X7<
SPI1->
CR1|=0<
10;
CR1|=1<
9;
11;
1;
0;
SPI1->
CR1|=7<
3;
7;
SPI1->
6;
SPIx_ReadWriteByte(0xff);
voidSPIx_SetSpeed(u8SpeedSet)
{SPI1->
CR1&
=0XFFC7;
switch(SpeedSet)
{caseSPI_SPEED_2:
break;
caseSPI_SPEED_4:
caseSPI_SPEED_8:
CR1|=2<
caseSPI_SPEED_16:
CR1|=3<
caseSPI_SPEED_256:
}
u8SPIx_ReadWriteByte(u8TxData)
{u8retry=0;
while((SPI1->
SR&
1<
1)==0)
{retry++;
if(retry>
200)return0;
}
DR=TxData;
retry=0;
0)==0)
}
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<
FileTemp.F_Size)
{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(&
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!
{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);
FONT12ADDR=FileTemp.F_Size+FONT16ADDR;
t=0XAA;
SPI_Flash_Write(&
t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 本科 毕业设计 基于 arm 汉字 显示 系统 设计