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

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)
    5 b/ I5 O" n6 Q
  2. {( Q6 B$ J. T3 I5 k
  3.   ILI9325_RS_HIGH();     // 写入寄存器时用ILI9325_RS_LOW();- v, D4 f' {) G6 r1 z- W
  4.   ILI9325_CS_LOW();
    5 t; y" S- L4 U: \+ S; A+ X# _
  5.   GPIOC->ODR &= 0xff00;
    $ }# ~9 [/ ^. t  y3 k! q; F
  6.   GPIOC->ODR |=(Data>>8);
    ) R- ^' ~: [) P" ^! _- e
  7.   ILI9325_WR_LOW();
    - \& ?% W3 Q2 m7 n2 o' a1 M$ _
  8.   ILI9325_WR_HIGH();
    $ E- M) \# x5 x
  9.   GPIOC->ODR &= 0xff00;        - V- w7 x# N' E# [+ Q  A$ t; q
  10.   GPIOC->ODR |=((Data)&(0x00ff));
    ( w( `4 J5 w. C  P
  11.   ILI9325_WR_LOW();
      q6 h" a' t7 p- G& B
  12.   ILI9325_WR_HIGH();
    ' r, u4 O( P- y1 _7 [
  13.   ILI9325_CS_HIGH();) n# `' ^3 G: ~2 R1 u7 x
  14. }
复制代码
其它修改变动不大,在主函数调用函数ILI9325_Clear() 即可进行验证,该该函数内容如下:
  1. void ILI9325_Clear(unsigned short COLOR)
    3 d8 i. q% ]& v
  2. {
    ; q4 v. }$ S$ V. D& t4 @
  3.   u16 i=0,j=0;
    1 i* ~. w0 Z9 t; p3 {1 O
  4.   ILI9325_SetCursor(0, 0);
      n! v" g8 [4 p2 J, `% E
  5.   for(i=0;i<320;i++)
    . o- }5 B' Q* h0 F
  6.   {
    , g/ S7 y# L5 M$ T
  7.     for(j=0;j<240;j++)7 U! @1 C: C  v* X( a8 [
  8.     {
    + _$ ?9 _7 @5 N
  9.       ILI9325_WriteReg(0x22,COLOR);
    * L3 a& v) x; E4 {: M- w9 x
  10.     }
    : I) _$ X% C0 i; X- f( j
  11.   }  
    # \, p: T6 y; X. c. C7 a7 w
  12. }
复制代码
2)显示SDHC卡信息读取
为了读写SDHC卡,是采用SPI的方式,其引脚分配是:
PA12---SD_SCL   PA13---SD_CS   PA14---SD_DI  PA15---SD_DO
由于程序中配备相应的字符库,因此可显示英文的提示信息。
显示SDHC卡信息的程序如下:
  1. GPIO_Configuration();' P1 ~8 }6 d/ u+ l5 t% l
  2.    znFAT_Device_Init(); // 存储设备初始化
    , j8 n4 E( ?; d% Q! g$ ^& ]
  3.    ILI9325_DisplayString_At(10,20,"SD OK ",Yellow,Red);: @8 l. ]8 v3 j9 Q
  4.    znFAT_Select_Device(0,&Init_Args); //选择设备' A5 ~4 O% S% a" b: R- M6 S
  5.    res=znFAT_Init();   // 文件系统初始化         
    1 v: Z+ O: S6 C. U' O; w: |
  6.    ILI9325_DisplayString_At(10,40,"FAT OK ",Yellow,Red);
    ) e  y$ p4 z9 U+ H& \
  7.    if(!res)           // 文件系统初始化成功3 \$ [: y4 c9 I
  8.    {
    9 g8 z9 k' ?; U( P1 p9 O9 ~
  9.          ILI9325_DisplayString_At(10,60,"Suc. to init FS ",Yellow,Red);: C' X5 S7 |6 U& E* v: N0 A
  10.          ILI9325_DisplayString_At(10,80,"BPB_Sector_No:",Yellow,Red);
    2 I8 x( d5 d. G9 D
  11.          u32tostr(Init_Args.BPB_Sector_No, &buf[0]);& p, z8 A* x7 T4 A# Z
  12.          ILI9325_DisplayString_At(10,100,&buf[0],Yellow,Red);
    / a( H. f! a% {3 \$ D( A" N1 A
  13.          ILI9325_DisplayString_At(10,120,"Total_SizeKB:",Yellow,Red);: J; t; U: j( a# b2 _$ @
  14.          u32tostr(Init_Args.Total_SizeKB, &buf[0]);
      A1 [8 r3 m/ u
  15.          ILI9325_DisplayString_At(10,140,&buf[0],Yellow,Red); 4 z2 M+ n" X7 R& R7 S
  16.          ILI9325_DisplayString_At(10,160,"BytesPerSector:",Yellow,Red);
    ; |* W4 Y  x5 ^6 I3 @$ g* s
  17.          u32tostr(Init_Args.BytesPerSector, &buf[0]);9 n7 [8 m. G$ V
  18.          ILI9325_DisplayString_At(10,180,&buf[0],Yellow,Red);; m$ f" j- D$ g" |2 u) {
  19.          ILI9325_DisplayString_At(10,200,"FATsectors:",Yellow,Red);! O9 g: k/ n7 E
  20.          u32tostr(Init_Args.FATsectors, &buf[0]);6 [$ D& g: z* x
  21.          ILI9325_DisplayString_At(10,220,&buf[0],Yellow,Red);
    / ]3 Z% E$ \' i" w# H8 p3 w! H
  22.          ILI9325_DisplayString_At(10,240,"SectorsPerClust:",Yellow,Red);
    9 k, y: G% w  o' p( s
  23.          u32tostr(Init_Args.SectorsPerClust, &buf[0]);
    1 y! c/ q( S4 `( {8 t2 {0 L  B
  24.          ILI9325_DisplayString_At(10,260,&buf[0],Yellow,Red);/ N- F  \  }- F2 S1 j! |, R9 Z
  25.          ILI9325_DisplayString_At(10,280,"FirstFATSector:",Yellow,Red);
    ! X8 q- m4 I4 d9 Z4 F7 n/ b! N
  26.          u32tostr(Init_Args.FirstFATSector, &buf[0]);
    " z0 u6 s1 i6 x7 x1 @* o0 Y/ u
  27.          ILI9325_DisplayString_At(10,300,&buf[0],Yellow,Red);
    " t5 f5 [8 \3 ]6 ~/ C4 g
  28.          }/ Z& L% T; J5 z
  29.   else            // 文件系统初始化失败
    # l0 r8 ^/ y. B6 c' `
  30.   {$ N% l! y5 v/ x- |
  31.            ILI9325_DisplayString_At(10,80,"Fail to init FS, Err Code ",Yellow,Red);  
    ; v; l- C9 d% L; t) p) z
  32.   }
复制代码
运行程序后,其执行效果如图所示。

! `6 q7 L" A7 c, g* b8 g3 U9 c1 |
3)显示图片显示
经过前面的准备,离实现数码相框的目标就十分接近了。要实现数码相框功能,必须能
读取文件、识别图像文件头信息、读取数据并实现色彩格式的转换等。
    在目前的图片显示中,最常用到的24位色和16位色,由于TFT显示屏的色彩表现力只能达到16位,因此需要将24位色变为16位色来显示。即使是16位色,在存储时由于是按BGR顺序,故在显示时需转为RGB顺序,其转换方法如下:
  1.    if(len==24)
    / c. R/ s9 Y- @' x( I' Y, ?
  2.                  {
    , e4 J9 g9 j* q1 o) l
  3.                    //  读取3字节数据合成RGB色彩值,24位色
    5 T: y* L: W3 ?  n
  4.                    dat=((buf[3*i+2]>>3)<<11)|((buf[3*i+1]>>2)<<5)|(buf[3*i]>>3);! b* ~2 B# J. W) c: R' A8 Z
  5.                    ILI9325WriteReg(0x22,dat);             }
    0 Q' X1 O' M4 k6 Q' ~& [/ l- z  H
  6.                  else  X, W8 y  v9 S* I0 c. w
  7.                  {  //  读取2字节数据转为RGB顺序,16位色9 d' h$ ]( X5 N( F/ w
  8.                         dat=((buf[i*2+1]<<8) | (buf[i*2]));                                                5 F9 C" `- J9 y- x+ D" m
  9.                         ILI9325_WriteReg(0x22,(dat&0x7c00<<1)|(dat&0x03e0)<<1|(dat&0x001f));
    0 O) G3 n; P1 G+ n0 p( D
  10.                  }
复制代码
实践说明znFAT是个不错的文件系统,通过移植可方便地在Nucleo-F411RE开发板上实现数码相框功能,其效果如图所示。

. c+ s/ U4 i( g) b' y* k( G

: t3 ^7 z4 H; e( F( Z0 t7 R5 |* I
图片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# J8 e" o' n4 \% v; r- u
收到了,不知怎的地址不对,要求改送也不理,只得自己到他们总部去取,他们服务太次! ...
' b/ X5 I8 Z9 H' R4 t0 ]1 ~9 k
辛苦了。偶尔快递会出问题,但是因为韵达快递帮用塑料包板子,其他快递不行,所以一直用的韵达。
jinglixixi 回答时间:2016-4-1 14:14:24
沐紫 发表于 2016-4-1 08:522 C, \% h( W; b* x7 a& I
谢谢分享!楼主的L073开发板收到没有?
% ], V0 H, u1 Y# M5 e
收到了,不知怎的地址不对,要求改送也不理,只得自己到他们总部去取,他们服务太次!
jinglixixi 回答时间:2016-4-4 09:45:02
沐紫 发表于 2016-4-1 14:39
) k7 Q8 {2 a9 g" T辛苦了。偶尔快递会出问题,但是因为韵达快递帮用塑料包板子,其他快递不行,所以一直用的韵达。 ...

; h9 I/ j, {) V9 u噢,明白了。
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
; l1 U" H3 R' _4 U
谢谢分享
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
液晶显示板什么品牌的
, v" `  Q$ r5 D8 a, b3 W
zbber 回答时间:2016-11-4 19:22:01
不错,不错
谦 回答时间:2016-11-4 20:17:25
学习~~~~~~~~
0 ~9 _  ]2 Q6 s6 p  f0 ` ST.JPG 与非.JPG / o, e; f) U3 G  W# f! x: p/ O
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版