基于STM32的汉字显示系统Word文件下载.docx

上传人:b****2 文档编号:5325911 上传时间:2023-05-05 格式:DOCX 页数:23 大小:1.95MB
下载 相关 举报
基于STM32的汉字显示系统Word文件下载.docx_第1页
第1页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第2页
第2页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第3页
第3页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第4页
第4页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第5页
第5页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第6页
第6页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第7页
第7页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第8页
第8页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第9页
第9页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第10页
第10页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第11页
第11页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第12页
第12页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第13页
第13页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第14页
第14页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第15页
第15页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第16页
第16页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第17页
第17页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第18页
第18页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第19页
第19页 / 共23页
基于STM32的汉字显示系统Word文件下载.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于STM32的汉字显示系统Word文件下载.docx

《基于STM32的汉字显示系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于STM32的汉字显示系统Word文件下载.docx(23页珍藏版)》请在冰点文库上搜索。

基于STM32的汉字显示系统Word文件下载.docx

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...."

LED0=!

LED1=!

};

LCD_Clear(WHITE);

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;

SPI1->

CR1|=1<

9;

SPI1->

11;

1;

0;

CR1|=7<

3;

7;

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<

break;

caseSPI_SPEED_256:

break;

}

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

delay_ms(1000);

FONT12ADDR=FileTemp.F_Size+FONT16ADDR;

t=0XAA;

SPI_Flash_Write(&

t,24,1);

LCD_ShowString(20,90,"

FontUpdateSuccessed"

);

return0;

}#endif

u8Font_Init(void)

{u32tempsys[2];

u8fontok=0;

SPI_Flash_Read(&

fontok,24,1);

if(fontok!

=0XAA)return1;

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

UNI2GBKADDR=tempsys[0];

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

FONT16ADDR=tempsys[0];

SPI_Flash_Read((u8*)tempsys,16,8);

FONT12ADDR=tempsys[0];

return0;

}//获取字库资源信息

voidGet_HzMat(unsignedchar*code,unsignedchar*mat,u8size)

{unsignedcharqh,ql;

unsignedchari;

unsignedlongfoffset;

qh=*code;

ql=*(++code);

if(qh<

0x81||ql<

0x40||ql==0xff||qh==0xff)

{for(i=0;

(size*2);

i++)*mat++=0x00;

return;

}

if(ql<

0x7f)ql-=0x40;

elseql-=0x41;

qh-=0x81;

foffset=((unsignedlong)190*qh+ql)*(size*2);

if(size==16)SPI_Flash_Read(mat,foffset+FONT16ADDR,32);

elseSPI_Flash_Read(mat,foffset+FONT12ADDR,24);

voidShow_Font(u16x,u16y,u8*font,u8size,u8mode)

{u8temp,t,t1;

u16y0=y;

u8dzk[32];

u16tempcolor;

Get_HzMat(font,dzk,size);

if(mode==0)

{for(t=0;

t<

size*2;

t++)

{temp=dzk[t];

for(t1=0;

t1<

t1++)

{if(temp&

0x80)LCD_DrawPoint(x,y);

else{tempcolor=POINT_COLOR;

POINT_COLOR=BACK_COLOR;

LCD_DrawPo

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

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2