|
振南的znFAT具有不错的文件操作功能,用它可对SDHC卡上的文件进行读写操作,如将SDHC卡中的BMP文件读取出来再还原成可视的图像。 利用手头的Nucleo-F411RE开发板和TFT2.4寸显示屏,决定将这一想法变为现实。 1)实现TFT屏的显示 为了实现TFT屏的显示,首先要进行GPIO资源的分配。由于手头的2.4寸TFT屏是以8位模式传送数据的,因此用PC0~PC7来传送数据,而使用以下引脚来进行控制: PC8---WR PC10---RS PC11---CS VDD---RST VDD---RD 目前多数的TFT屏是采用16位数据传送模式,而对于8位数据模式其对显示屏写入字节数据的函数如下: - void ILI9325_WriteData(unsigned short Data)
: J/ k/ t- X- m# o: I - {
+ _) R7 m$ x4 F6 u( Q3 u - ILI9325_RS_HIGH(); // 写入寄存器时用ILI9325_RS_LOW();
2 h9 i( I2 `* f/ t f - ILI9325_CS_LOW();1 f/ z8 Y x. j& ^. h
- GPIOC->ODR &= 0xff00;9 [. m1 _3 L2 e$ }4 j2 `* m8 m) E
- GPIOC->ODR |=(Data>>8);
' L" ^5 T3 l# {8 e1 @ - ILI9325_WR_LOW();
* F) E3 u r6 Y9 S) c9 J0 p: m - ILI9325_WR_HIGH();! O a+ r" ^% a# m! L
- GPIOC->ODR &= 0xff00; 5 M* K7 e; Y. P
- GPIOC->ODR |=((Data)&(0x00ff));7 D, ^% P C9 I
- ILI9325_WR_LOW();
: O& g0 M7 j' L; e8 F+ _- T - ILI9325_WR_HIGH();# B4 v4 K0 c* N4 {
- ILI9325_CS_HIGH();
3 t) @+ j1 p0 ?, I+ Q4 [ - }
复制代码其它修改变动不大,在主函数调用函数ILI9325_Clear() 即可进行验证,该该函数内容如下: - void ILI9325_Clear(unsigned short COLOR)
8 x( ]* G0 ]/ y* C - {
4 x* `8 {, T; m1 W - u16 i=0,j=0;
( H( \4 w8 q$ n& ]$ L0 p - ILI9325_SetCursor(0, 0);4 x) T3 B& O5 Z2 T& E
- for(i=0;i<320;i++)
! E, D1 k! m# {' A* L - {- |3 f+ [ V3 j3 B
- for(j=0;j<240;j++)
6 S% r: o) E" ~- Z - {4 A. A$ m& J- S1 B
- ILI9325_WriteReg(0x22,COLOR);
6 N/ ^& ^+ c% C& R2 c6 ` - }, h. x' B; m0 T* C4 K# ?
- }
( c0 p" p- ~4 ^9 E+ Z& ~0 H2 } - }
复制代码2)显示SDHC卡信息读取 为了读写SDHC卡,是采用SPI的方式,其引脚分配是: PA12---SD_SCL PA13---SD_CS PA14---SD_DI PA15---SD_DO 由于程序中配备相应的字符库,因此可显示英文的提示信息。 显示SDHC卡信息的程序如下: - GPIO_Configuration();1 s4 E# d( g0 j9 _% @( l+ ~3 W
- znFAT_Device_Init(); // 存储设备初始化( D: }6 N: h3 l* S
- ILI9325_DisplayString_At(10,20,"SD OK ",Yellow,Red);
8 o7 K% }' H9 A3 l( I - znFAT_Select_Device(0,&Init_Args); //选择设备
! S$ c. ~! S$ _- [3 Q - res=znFAT_Init(); // 文件系统初始化 ) ^# @3 p2 o0 r9 K9 a& h
- ILI9325_DisplayString_At(10,40,"FAT OK ",Yellow,Red);. G" ` G- O) Y9 F$ U4 I: l7 ]
- if(!res) // 文件系统初始化成功
/ @1 `9 b4 b; S! q - {
& `. U9 ~" E! I2 E2 f( C, X) |6 V - ILI9325_DisplayString_At(10,60,"Suc. to init FS ",Yellow,Red);
; g9 B$ k9 u5 d2 T# n- ? - ILI9325_DisplayString_At(10,80,"BPB_Sector_No:",Yellow,Red); ! y h* i, U' ? s
- u32tostr(Init_Args.BPB_Sector_No, &buf[0]);
, e9 F. `: G7 }1 f' D9 T; s, b: P - ILI9325_DisplayString_At(10,100,&buf[0],Yellow,Red);
D; `! ?& X0 \& a9 o' i3 V0 h - ILI9325_DisplayString_At(10,120,"Total_SizeKB:",Yellow,Red);! L6 u2 A& d$ q6 L* @
- u32tostr(Init_Args.Total_SizeKB, &buf[0]);
1 ]; J# t9 ]6 t9 f4 k7 z. v% u - ILI9325_DisplayString_At(10,140,&buf[0],Yellow,Red);
Y6 F/ w4 h1 Q" a - ILI9325_DisplayString_At(10,160,"BytesPerSector:",Yellow,Red);
) k) ]; @, `( k" k5 L3 f& j - u32tostr(Init_Args.BytesPerSector, &buf[0]);
' E$ e' z& e2 Z' Y' _/ M3 @, J9 Z - ILI9325_DisplayString_At(10,180,&buf[0],Yellow,Red);
* i; F" v# I/ m - ILI9325_DisplayString_At(10,200,"FATsectors:",Yellow,Red);) c- [3 Q, {+ N, f8 X
- u32tostr(Init_Args.FATsectors, &buf[0]);
5 i1 G6 U, J; Z' A9 H. g. u - ILI9325_DisplayString_At(10,220,&buf[0],Yellow,Red); 0 t- Y* ]. j* K9 u H% T+ M, }
- ILI9325_DisplayString_At(10,240,"SectorsPerClust:",Yellow,Red);4 z, Z5 {# K2 ^) J2 b
- u32tostr(Init_Args.SectorsPerClust, &buf[0]);+ J8 S( c8 f" e
- ILI9325_DisplayString_At(10,260,&buf[0],Yellow,Red);) \7 P! S/ a* T1 E: N
- ILI9325_DisplayString_At(10,280,"FirstFATSector:",Yellow,Red);
1 h/ d& z: B1 L: [8 T, m - u32tostr(Init_Args.FirstFATSector, &buf[0]);: g/ k/ ^( B' D9 {, ]8 ?- a
- ILI9325_DisplayString_At(10,300,&buf[0],Yellow,Red);* y3 E- H' Y* u+ J7 v6 i/ H
- }+ ]. Z: r5 D: E$ x2 \( q" @
- else // 文件系统初始化失败
. J, N# m, R2 z! P K - {& e7 g: ^6 |# w) I1 T2 A/ e9 q
- ILI9325_DisplayString_At(10,80,"Fail to init FS, Err Code ",Yellow,Red); 6 @2 O" n( Y% J- b* ~0 `2 s
- }
复制代码运行程序后,其执行效果如图所示。 ! M: x- o4 b7 D8 \' o) }
3)显示图片显示 经过前面的准备,离实现数码相框的目标就十分接近了。要实现数码相框功能,必须能 读取文件、识别图像文件头信息、读取数据并实现色彩格式的转换等。 在目前的图片显示中,最常用到的24位色和16位色,由于TFT显示屏的色彩表现力只能达到16位,因此需要将24位色变为16位色来显示。即使是16位色,在存储时由于是按BGR顺序,故在显示时需转为RGB顺序,其转换方法如下: - if(len==24)2 u. C# } G( d+ S
- {* M" ~) m: f9 `/ z
- // 读取3字节数据合成RGB色彩值,24位色* F7 i: @6 g% }+ `' C
- dat=((buf[3*i+2]>>3)<<11)|((buf[3*i+1]>>2)<<5)|(buf[3*i]>>3);
! c. z: P8 _2 ? - ILI9325WriteReg(0x22,dat); }" r( E) V$ v) C8 a6 W7 K. V' i
- else
) A3 B" C$ ?/ ?/ E* ~! ^ - { // 读取2字节数据转为RGB顺序,16位色: O; v+ m& \2 p1 f0 |4 N
- dat=((buf[i*2+1]<<8) | (buf[i*2]));
6 t8 Y; k( Z' F3 O - ILI9325_WriteReg(0x22,(dat&0x7c00<<1)|(dat&0x03e0)<<1|(dat&0x001f));
3 D" l) `3 y; L8 {, u, g. S - }
复制代码实践说明znFAT是个不错的文件系统,通过移植可方便地在Nucleo-F411RE开发板上实现数码相框功能,其效果如图所示。 ' h3 T, ^' u6 Q# Y! q
5 J9 l \$ o( x2 r4 { |
辛苦了。偶尔快递会出问题,但是因为韵达快递帮用塑料包板子,其他快递不行,所以一直用的韵达。
收到了,不知怎的地址不对,要求改送也不理,只得自己到他们总部去取,他们服务太次!
噢,明白了。
谢谢分享