你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Nucleo-F411RE+TFT2.4寸显示屏+SDHC卡+znFAT 实现数码相框功能

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

5 J9 l  \$ o( x2 r4 {
图片1.png
图片2.jpg

评分

参与人数 1 ST金币 +20 收起 理由
zero99 + 20

查看全部评分

赞 收藏 6 评论17 发布时间:2016-3-31 20:22

举报

17个回答
沐紫 回答时间:2016-4-1 14:39:59
jinglixixi 发表于 2016-4-1 14:14
) y/ L1 l  _0 G8 @2 |, Z. u- m( t收到了,不知怎的地址不对,要求改送也不理,只得自己到他们总部去取,他们服务太次! ...
. O- Y4 k9 v! c7 @; m, `
辛苦了。偶尔快递会出问题,但是因为韵达快递帮用塑料包板子,其他快递不行,所以一直用的韵达。
jinglixixi 回答时间:2016-4-1 14:14:24
沐紫 发表于 2016-4-1 08:52: [3 _" J1 G+ e$ O3 W! x
谢谢分享!楼主的L073开发板收到没有?
' d% j, s, |6 Y( @2 S
收到了,不知怎的地址不对,要求改送也不理,只得自己到他们总部去取,他们服务太次!
jinglixixi 回答时间:2016-4-4 09:45:02
沐紫 发表于 2016-4-1 14:39' T, y7 U$ r6 J0 f* Y: M5 p
辛苦了。偶尔快递会出问题,但是因为韵达快递帮用塑料包板子,其他快递不行,所以一直用的韵达。 ...

) J9 g4 L+ [. n! ^1 e噢,明白了。
suoma 回答时间:2016-3-31 22:13:26
谢谢分享学习一下
沐紫 回答时间:2016-4-1 08:52:38
谢谢分享!楼主的L073开发板收到没有?
sfee2002 回答时间:2016-4-1 14:17:13
不错,不错
disheng4688 回答时间:2016-4-1 14:47:07
/ r6 @( `8 k0 Z, P9 |
谢谢分享
power568 回答时间:2016-4-1 15:59:27
谢谢楼主分享...
qhqlove 回答时间:2016-4-1 18:06:11
这个不错,写的挺详细的,支持一个!!!!!
Ljmp 回答时间:2016-4-3 14:55:01
可以的,反正都可以用!!!
clizze 回答时间:2016-4-7 13:52:07
谢谢楼主分享...
zhulikai 回答时间:2016-11-4 13:45:30
液晶显示板什么品牌的
2 Y2 y) D  i. e1 d' T  s
zbber 回答时间:2016-11-4 19:22:01
不错,不错
谦 回答时间:2016-11-4 20:17:25
学习~~~~~~~~
" R$ M1 D* H, x' r ST.JPG 与非.JPG 4 q1 Y/ Y$ W1 K" D* I& z. t
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版