各位老铁们,大家好,今天由我来为大家分享flash源码分享下载网站,以及flash源代码怎么看的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
1)实验平台:正点原子水星STM32F4/F7开发板
2)摘自《STM32F7开发指南(HAL库版)》关注官方微信号公众号,获取更多资料:正点原子
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-13912-1-1.html
第四十六章汉字显示实验
汉字显示在很多单片机系统都需要用到,少则几个字,多则整个汉字库的支持,更有甚者
还要支持多国字库,那就更麻烦了。本章,我们将向大家介绍,如何用STM32F767控制LCD
显示汉字。在本章中,我们将使用外部SPIFLASH来存储字库,并可以通过SD卡更新字库。
STM32F767读取存在SPIFLASH里面的字库,然后将汉字显示在LCD上面。本章分为如下几
个部分:
46.1汉字显示原理简介
46.2硬件设计
46.3软件设计
46.4下载验证
46.1汉字显示原理简介
常用的汉字内码系统有GB2312,GB13000,GBK,BIG5(繁体)等几种,其中GB2312
支持的汉字仅有几千个,很多时候不够用,而GBK内码不仅完全兼容GB2312,还支持了繁体
字,总汉字数有2万多个,完全能满足我们一般应用的要求。
本实例我们将制作三个GBK字库,制作好的字库放在SD卡里面,然后通过SD卡,将字
库文件复制到外部FLASH芯片W25Q256里,这样,W25Q256就相当于一个汉字字库芯片了。
汉字在液晶上的显示原理与前面显示字符的是一样的。汉字在液晶上的显示其实就是一些
点的显示与不显示,这就相当于我们的笔一样,有笔经过的地方就画出来,没经过的地方就不
画,我们以12*12的汉字为例,假设其取模方向为从上到下,从左到右的方向取模,且高位在
前,那么其取模原理如图46.1.1所示:
图46.1.1从上到下,从左到右取模原理
图中,我们取模的时候,从最左上方的点开始取(从上到下,从左到右),且高位在前(bit7
在表示第一个位),那么第一个字节就是:0X11(1,表示浅蓝色的点,即要画出来的点,0
则表示不要画出来),第二个字节是:0X10,第三个字节(到第二列了,每列2个字节)是:
0X1E……,依次类推,一个12*12的汉字,总共有12列,每列2个字节,总共需要24个字节
来表示。
在显示的时候,我们只需要读取这个汉字的点阵数据(12*12字体,一个汉字的点阵数据
为24个字节),然后将这些数据,按取模方式,反向解析出来(坐标要处理好),每个字节,
是1的位,就画出来,不是1的位,就忽略,这样,就可以显示出这个汉字了。
所以要显示汉字,我们首先要知道汉字的点阵数据,这些数据可以由专门的软件来生成。
知道显示了一个汉字,就可以推及整个汉字库了。汉字在各种文件里面的存储不是以点阵数据
的形式存储的(否则那占用的空间就太大了),而是以内码的形式存储的,就是
GB2312/GBK/BIG5等这几种的一种,每个汉字对应着一个内码,在知道了内码之后再去字库
里面查找这个汉字的点阵数据,然后在液晶上显示出来。这个过程我们是看不到,但是计算机
是要去执行的。
单片机要显示汉字也与此类似:汉字内码(GBK/GB2312)→查找点阵库→解析→显示。
所以只要我们有了整个汉字库的点阵,就可以把电脑上的文本信息在单片机上显示出来了。
这里我们要解决的最大问题就是制作一个与汉字内码对得上号的汉字点阵库。而且要方便单片
机的查找。每个GBK码由2个字节组成,第一个字节为0X81~0XFE,第二个字节分为两部分,
一是0X40~0X7E,二是0X80~0XFE。其中与GB2312相同的区域,字完全相同。
我们把第一个字节代表的意义称为区,那么GBK里面总共有126个区(0XFE-0X81+1),
每个区内有190个汉字(0XFE-0X80+0X7E-0X40+2),总共就有126*190=23940个汉字。我
们的点阵库只要按照这个编码规则从0X8140开始,逐一建立,每个区的点阵大小为每个汉字
所用的字节数*190。这样,我们就可以得到在这个字库里面定位汉字的方法:
当GBKL<0X7F时:Hp=((GBKH-0x81)*190+GBKL-0X40)*(size*2);
当GBKL>0X80时:Hp=((GBKH-0x81)*190+GBKL-0X41)*(size*2);
其中GBKH、GBKL分别代表GBK的第一个字节和第二个字节(也就是高位和低位),size
代表汉字字体的大小(比如16字体,12字体等),Hp则为对应汉字点阵数据在字库里面的起
始地址(假设是从0开始存放)。
这样我们只要得到了汉字的GBK码,就可以显示这个汉字了。从而实现汉字在液晶上的
显示。
上一章,我们提到要用cc936.c,以支持长文件名,但是cc936.c文件里面的两个数组太大
了(172KB),直接刷在单片机里面,太占用flash了,所以我们必须把这两个数组存放在外部
flash。cc936里面包含的两个数组oem2uni和uni2oem存放unicode和gbk的互相转换对照表,
这两个数组很大,这里我们利用ALIENTEK提供的一个C语言数组转BIN(二进制)的软件:
C2B转换助手V1.1.exe,将这两个数组转为BIN文件,我们将这两个数组拷贝出来存放为一个
新的文本文件,假设为UNIGBK.TXT,然后用C2B转换助手打开这个文本文件,如图46.1.2
所示:
图46.1.2C2B转换助手
然后点击转换,就可以在当前目录下(文本文件所在目录下)得到一个UNIGBK.bin的文
件。这样就完成将C语言数组转换为.bin文件,然后只需要将UNIGBK.bin保存到外部FLASH
就实现了该数组的转移。
在cc936.c里面,主要是通过ff_convert调用这两个数组,实现UNICODE和GBK的互转,
该函数原代码如下:
WCHARff_convert(/*Convertedcode,0meansconversionerror*/\nWCHARsrc,/*Charactercodetobeconverted*/\nUINT\ndir\n/*0:UnicodetoOEMCP,1:OEMCPtoUnicode*/\n)\n{\nconstWCHAR*p;\nWCHARc;\ninti,n,li,hi;\nif(src<0x80){\n/*ASCII*/\nc=src;\n}else{\nif(dir){\n/*OEMCPtounicode*/\np=oem2uni;\nhi=sizeof(oem2uni)/4-1;\n}else{\n/*UnicodetoOEMCP*/\np=uni2oem;\nhi=sizeof(uni2oem)/4-1;\n}\nli=0;\nfor(n=16;n;n–){\ni=li+(hi-li)/2;\nif(src==p[i*2])break;\nif(src>p[i*2])li=i;\nelsehi=i;\n}\nc=n?p[i*2+1]:0;\n}\nreturnc;\n}
此段代码,通过二分法(16阶)在数组里面查找UNICODE(或GBK)码对应的GBK(或
UNICODE)码。当我们将数组存放在外部flash的时候,将该函数修改为:
WCHARff_convert(/*Convertedcode,0meansconversionerror*/\nWCHARsrc,\n/*Charactercodetobeconverted*/\nUINT\ndir\n/*0:UnicodetoOEMCP,1:OEMCPtoUnicode*/\n)\n{\nWCHARt[2];\nWCHARc;\nu32i,li,hi;\nu16n;\nu32gbk2uni_offset=0;\nif(src<0x80)c=src;//ASCII,直接不用转换.\nelse\n{\nif(dir)gbk2uni_offset=ftinfo.ugbksize/2;\n//GBK2UNICODE\nelsegbk2uni_offset=0;\n//UNICODE2GBK\n/*UnicodetoOEMCP*/\nhi=ftinfo.ugbksize/2;//对半开.\nhi=hi/4-1;\nli=0;\nfor(n=16;n;n–)\n{\ni=li+(hi-li)/2;\nW25QXX_Read((u8*)&t,ftinfo.ugbkaddr+i*4+gbk2uni_offset,4);//读出4个字节\nif(src==t[0])break;\nif(src>t[0])li=i;\nelsehi=i;\n}\nc=n?t[1]:0;\n}\nreturnc;\n}
代码中的ftinfo.ugbksize为我们刚刚生成的UNIGBK.bin的大小,而ftinfo.ugbkaddr是我们
存放UNIGBK.bin文件的首地址。这里同样采用的是二分法查找,关于cc936.c的修改,我们就
介绍到这。
字库的生成,我们要用到一款软件,由易木雨软件工作室设计的点阵字库生成器V3.8。该
软件可以在WINDOWS系统下生成任意点阵大小的ASCII,GB2312(简体中文)、GBK(简体中
文)、BIG5(繁体中文)、HANGUL(韩文)、SJIS(日文)、Unicode以及泰文,越南文、俄文、乌克
兰文,拉丁文,8859系列等共二十几种编码的字库,不但支持生成二进制文件格式的文件,也
可以生成BDF文件,还支持生成图片功能,并支持横向,纵向等多种扫描方式,且扫描方式
可以根据用户的需求进行增加。该软件的界面如图46.1.3所示:
图46.1.3点阵字库生成器默认界面
要生成16*16的GBK字库,则选择:936中文PRCGBK,字宽和高均选择16,字体大小
选择12,然后模式选择纵向取模方式二(从上到下,从左到右,且字节高位在前,低位在后),
最后点击创建,就可以开始生成我们需要的字库了(.DZK文件,在生成完以后,我们手动修改
后缀为.fon)。具体设置如图46.1.4所示:
图46.1.4生成GBK16*16字库的设置方法
注意:电脑端的字体大小与我们生成点阵大小的关系为:
fsize=dsize*6/8
其中,fsize是电脑端字体大小,dsize是点阵大小(12、16、24、32等)。所以16*16点阵
大小对应的是12字体。
生成完以后,我们把文件名和后缀改成:GBK16.FON(这里是手动修改后缀!!)。同样的
方法,生成12*12的点阵库(GBK12.FON)、24*24的点阵库(GBK24.FON)和32*32的点阵
库(GBK32.FON),总共制作4个字库。
另外,该软件还可以生成其他很多字库,字体也可选,大家可以根据自己的需要按照上面
的方法生成即可。该软件的详细介绍请看软件自带的《点阵字库生成器说明书》,关于汉字显示
原理,我们就介绍到这。
46.2硬件设计
本章实验功能简介:开机的时候先检测W25Q256中是否已经存在字库,如果存在,则按
次序显示汉字(四种字体都显示)。如果没有,则检测SD卡和文件系统,并查找SYSTEM文件
夹下的FONT文件夹,在该文件夹内查找UNIGBK.BIN、GBK12.FON、GBK16.FON、
GBK24.FON和GBK32.FON(这几个文件的由来,我们前面已经介绍了)。在检测到这些文
件之后,就开始更新字库,更新完毕才开始显示汉字。通过按按键KEY0,可以强制更新字库。
同样我们也是用DS0来指示程序正在运行。
所要用到的硬件资源如下:
1)指示灯DS0
2)KEY0按键
3)串口
4)LCD模块
5)SD卡
6)SPIFLASH
这几部分分,在之前的实例中都介绍过了,我们在此就不介绍了。
46.3软件设计
打开本章实验目录可以看到,首先在工程根目录文件夹下面新建了一个TEXT的文件夹。
在TEXT文件夹下新建fontupd.c、fontupd.h、text.c、text.h这4个文件。同时,我们在实验工
程中新建了TEXT分组,将新建的源文件加入到了分组之下,并将头文件包含路径加入到了工
程的PATH中。
打开fontupd.c,代码如下:
//字库区域占用的总扇区数大小(4个字库+unigbk表+字库信息=6302984字节,约占1539个\nW25QXX扇区,一个扇区4K字节)\ndefineFONTINFOADDR1024*1024*25//开发板是从25M地址以后开始存放字库\n//前面25M被fatfs占用了,25M以后紧跟4个字库+UNIGBK.BIN,总大\n//小6.01M,被字库占用了,不能动!31.01M以后,用户可以自由使用.\n//用来保存字库基本信息,地址,大小等\n_font_infoftinfo;\n//字库存放在磁盘中的路径\nu8*constGBK_PATH[5]=\n{\n&34;,\n//UNIGBK.BIN的存放位置\n&34;,//GBK12的存放位置\n&34;,//GBK16的存放位置\n&34;,//GBK24的存放位置\n&34;,//GBK32的存放位置\n};\n//更新时的提示信息\nu8*constUPDATE_REMIND_TBL[5]=\n{\n&34;,//提示正在更新UNIGBK.bin\n&34;,\n//提示正在更新GBK12\n&34;,\n//提示正在更新GBK16\n&34;,\n//提示正在更新GBK24\n&34;,\n//提示正在更新GBK32\n};\n//显示当前字体更新进度\n//x,y:坐标\n//size:字体大小\n//fsize:整个文件大小\n//pos:当前文件指针位置\nu32fupd_prog(u16x,u16y,u8size,u32fsize,u32pos)\n{\n…//此处省略部分代码\n}\n//更新某一个\n//x,y:坐标\n//size:字体大小\n//fxpath:路径\n//fx:更新的内容0,ungbk;1,gbk12;2,gbk16;3,gbk24;4,gbk32;\n//返回值:0,成功;其他,失败.\nu8updata_fontx(u16x,u16y,u8size,u8*fxpath,u8fx)\n{\nu32flashaddr=0;\nFIL*fftemp;\nu8*tempbuf;\nu8res;\nu16bread;\nu32offx=0;\nu8rval=0;\nfftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL));//分配内存\nif(fftemp==NULL)rval=1;\ntempbuf=mymalloc(SRAMIN,4096);\n//分配4096个字节空间\nif(tempbuf==NULL)rval=1;\nres=f_open(fftemp,(constTCHAR*)fxpath,FA_READ);\nif(res)rval=2;//打开文件失败\nif(rval==0)\n{\nswitch(fx)\n{\ncase0:\n//更新UNIGBK.BIN\nftinfo.ugbkaddr=FONTINFOADDR+sizeof(ftinfo);\n//信息头之后,紧跟UNIGBK转换码表\nftinfo.ugbksize=fftemp->fsize;\n//UNIGBK大小\nflashaddr=ftinfo.ugbkaddr;\nbreak;\ncase1:\nftinfo.f12addr=ftinfo.ugbkaddr+ftinfo.ugbksize;\n//UNIGBK之后,紧跟GBK12字库\nftinfo.gbk12size=fftemp->fsize;//GBK12字库大小\nflashaddr=ftinfo.f12addr;\n//GBK12的起始地址\nbreak;\ncase2:\nftinfo.f16addr=ftinfo.f12addr+ftinfo.gbk12size;\n//GBK12之后,紧跟GBK16字库\nftinfo.gbk16size=fftemp->fsize;//GBK16字库大小\nflashaddr=ftinfo.f16addr;\n//GBK16的起始地址\nbreak;\ncase3:\nftinfo.f24addr=ftinfo.f16addr+ftinfo.gbk16size;\n//GBK16之后,紧跟GBK24字库\nftinfo.gbk24size=fftemp->fsize;\n//GBK24字库大小\nflashaddr=ftinfo.f24addr;\n//GBK24的起始地址\nbreak;\ncase4:\nftinfo.f32addr=ftinfo.f24addr+ftinfo.gbk24size;\n//GBK24之后,紧跟GBK32字库\nftinfo.gbk32size=fftemp->fsize;\n//GBK32字库大小\nflashaddr=ftinfo.f32addr;\n//GBK32的起始地址\nbreak;\n}\nwhile(res==FR_OK)//死循环执行\n{\nres=f_read(fftemp,tempbuf,4096,(UINT*)&bread);\n//读取数据\nif(res!=FR_OK)break;\n//执行错误\nW25QXX_Write(tempbuf,offx+flashaddr,4096);//从0开始写入4096个数据\noffx+=bread;\nfupd_prog(x,y,size,fftemp->fsize,offx);\n//进度显示\nif(bread!=4096)break;\n//读完了.\n}\nf_close(fftemp);\n}\nmyfree(SRAMIN,fftemp);\n//释放内存\nmyfree(SRAMIN,tempbuf);//释放内存\nreturnres;\n}\n//更新字体文件,UNIGBK,GBK12,GBK16,GBK24,GBK32一起更新\n//x,y:提示信息的显示地址\n//size:字体大小\n//src:字库来源磁盘.&34;,SD卡;&34;,FLASH盘,&34;,U盘.\n//提示信息字体大小\n//返回值:0,更新成功;\n//\n其他,错误代码.\nu8update_font(u16x,u16y,u8size,u8*src)\n{\nu8*pname;\nu32*buf;\nu8res=0;\nu16i,j;\nFIL*fftemp;\nu8rval=0;\nres=0XFF;\nftinfo.fontok=0XFF;\npname=mymalloc(SRAMIN,100);//申请100字节内存\nbuf=mymalloc(SRAMIN,4096);//申请4K字节内存\nfftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL));//分配内存\nif(buf==NULL||pname==NULL||fftemp==NULL)\n{\nmyfree(SRAMIN,fftemp);\nmyfree(SRAMIN,pname);\nmyfree(SRAMIN,buf);\nreturn5;\n//内存申请失败\n}\nfor(i=0;i<5;i++)\n//先查找文件UNIGBK,GBK12,GBK16,GBK24,GBK32是否正常\n{\nstrcpy((char*)pname,(char*)src);\n//copysrc内容到pname\nstrcat((char*)pname,(char*)GBK_PATH[i]);\n//追加具体文件路径\nres=f_open(fftemp,(constTCHAR*)pname,FA_READ);\n//尝试打开\nif(res)\n{\nrval|=1<<7;//标记打开文件失败\nbreak;\n//出错了,直接退出\n}\n}\nmyfree(SRAMIN,fftemp);\n//释放内存\nif(rval==0)\n//字库文件都存在.\n{\nLCD_ShowString(x,y,240,320,size,&34;);//提示正在擦除扇区\nfor(i=0;i<FONTSECSIZE;i++)\n//先擦除字库区域,提高写入速度\n{\nfupd_prog(x+20*size/2,y,size,FONTSECSIZE,i);//进度显示\nW25QXX_Read((u8*)buf,((FONTINFOADDR/4096)+i)*4096,4096);\n//读出整个扇区的内容\nfor(j=0;j<1024;j++)//校验数据\n{\nif(buf[j]!=0XFFFFFFFF)break;//需要擦除\n}\nif(j!=1024)W25QXX_Erase_Sector((FONTINFOADDR/4096)+i);\n//需要擦除的扇区\n}\nfor(i=0;i<5;i++)\n//依次更新UNIGBK,GBK12,GBK16,GBK24,GBK32\n{\nLCD_ShowString(x,y,240,320,size,UPDATE_REMIND_TBL[i]);\nstrcpy((char*)pname,(char*)src);\n//copysrc内容到pname\nstrcat((char*)pname,(char*)GBK_PATH[i]);\n//追加具体文件路径\nres=updata_fontx(x+20*size/2,y,size,pname,i);//更新字库\nif(res)\n{\nmyfree(SRAMIN,buf);\nmyfree(SRAMIN,pname);\nreturn1+i;\n}\n}\n//全部更新好了\nftinfo.fontok=0XAA;\nW25QXX_Write((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo));\n//保存字库信息\n}\nmyfree(SRAMIN,pname);//释放内存\nmyfree(SRAMIN,buf);\nreturnrval;//无错误.\n}\n//初始化字体\n//返回值:0,字库完好.\n//\n其他,字库丢失\nu8font_init(void)\n{\nu8t=0;\nW25QXX_Init();\nwhile(t<10)//连续读取10次,都是错误,说明确实是有问题,得更新字库了\n{\nt++;\nW25QXX_Read((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo));\n//读出ftinfo结构体数据\nif(ftinfo.fontok==0XAA)break;\ndelay_ms(20);\n}\nif(ftinfo.fontok!=0XAA)return1;\nreturn0;\n}
此部分代码主要用于字库的更新操作(包含UNIGBK的转换码表更新),其中ftinfo是我
们在fontupd.h里面定义的一个结构体,用于记录字库首地址及字库大小等信息。因为我们将
W25Q256的前25M字节给FATFS管理(用做本地磁盘),随后,紧跟字库结构体、UNIGBK.bin、
和三个字库,这部分内容首地址是:(1024*12)*1024,大小约6.01M,最后W25Q256还剩下约
0.99M给用户自己用。
接下来我们打开fontupd.h文件代码如下:
externu32FONTINFOADDR;//字体信息保存地址,占41个字节,第1个字节用于标记字库
//是否存在.后续每8个字节一组,分别保存起始地址和文件大小\n//字库信息结构体定义\n//用来保存字库基本信息,地址,大小等\n__packedtypedefstruct\n{\nu8fontok;\n//字库存在标志,0XAA,字库正常;其他,字库不存在\nu32ugbkaddr;\n//unigbk的地址\nu32ugbksize;\n//unigbk的大小\nu32f12addr;\n//gbk12地址\nu32gbk12size;\n//gbk12的大小\nu32f16addr;\n//gbk16地址\nu32gbk16size;\n//gbk16的大小\nu32f24addr;\n//gbk24地址\nu32gbk24size;\n//gbk24的大小\nu32f32addr;\n//gbk32地址\nu32gbk32size;\n//gbk32的大小\n}_font_info;\nextern_font_infoftinfo;//字库信息结构体\nu32fupd_prog(u16x,u16y,u8size,u32fsize,u32pos);//显示更新进度\nu8updata_fontx(u16x,u16y,u8size,u8*fxpath,u8fx);\n//更新指定字库\nu8update_font(u16x,u16y,u8size,u8*src);\n//更新全部字库\nu8font_init(void);\n//初始化字库\n34;0:&34;1:&34;2:&34;ApolloSTM32F4/F7&34;SDCardFailed!&34;SDCardOK&34;FontUpdating…&34;0:&34;FontUpdateFailed!&34;FontUpdateSuccess!&34;水星STM32F4/F7开发板&34;GBK字库测试程序&34;正点原子@ALIENTEK&34;2016年7月15日&34;按KEY0,更新字库&34;内码高字节:&34;内码低字节:&34;汉字计数器:&34;对应汉字为:&34;对应汉字为:&34;对应汉字(16*16)为:&34;对应汉字(12*12)为:”,12,0);\nwhile(1)\n{\nfontcnt=0;\nfor(i=0x81;i<0xff;i++)\n{\nfontx[0]=i;\nLCD_ShowNum(118,150,i,3,16);\n//显示内码高字节\nfor(j=0x40;j<0xfe;j++)\n{\nif(j==0x7f)continue;\nfontcnt++;\nLCD_ShowNum(118,150,j,3,16);//显示内码低字节\nLCD_ShowNum(118,170,fontcnt,5,16);//汉字计数显示\nfontx[1]=j;\nShow_Font(30+176,200,fontx,32,0);\nShow_Font(30+132,232,fontx,24,0);\nShow_Font(30+144,256,fontx,16,0);\nShow_Font(30+108,272,fontx,12,0);\nt=200;\nwhile(t–)//延时,同时扫描按键\n{\ndelay_ms(1);\nkey=KEY_Scan(0);\nif(key==KEY0_PRES)gotoUPD;\n}\nLED0_Toggle;\n}\n}\n}\n}
此部分代码就实现了我们在硬件描述部分所描述的功能,至此整个软件设计就完成了。这
节有太多的代码,而且工程也增加了不少,我们来看看工程的截图吧,整个工程截图如图46.3.1
所示:
图46.3.1工程建成截图
46.4下载验证
在代码编译成功之后,我们通过下载代码到ALIENTEK水星STM32开发板上,可以看到
LCD开始显示汉字及汉字内码,如图46.4.1所示:
图46.4.1汉字显示实验显示效果
一开始就显示汉字,是因为ALIENTEK水星STM32F767开发板在出厂的时候都是测试过
的,里面刷了综合测试程序,已经把字库写入到了W25Q256里面,所以并不会提示更新字库。
如果你想要更新字库,那么则必须先找一张SD卡,把:光盘\\5,SD卡根目录文件文件夹下
面的SYSTEM文件夹拷贝到SD卡根目录下,插入开发板,并按复位,之后,在显示汉字的时
候,按下KEY0,就可以开始更新字库了。
字库更新界面如图46.4.2所示:
图46.4.2汉字字库更新界面
我们还可以通过USMART来测试该实验,将Show_Str函数加入USMART控制(方法前
面已经讲了很多次了),就可以通过串口调用该函数,在屏幕上显示任何你想要显示的汉字了,
有兴趣的朋友可以测试一下。
关于flash源码分享下载网站,flash源代码怎么看的介绍到此结束,希望对大家有所帮助。
