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

【经验分享】STM32显示软件取模图片

[复制链接]
STMCU小助手 发布时间:2022-4-23 16:31
一、软件取模参考( l! h: ]5 d$ g4 y9 @

% H2 `% _- Q8 K( d5 @
CPVR%{6U9LX_YL][1M_Y}61.png
; t- u# W, u" v  L+ c- A% k1 \: _3 z1 q+ u
二、软件代码
. z. m; j$ s+ U  R
9 U5 d# @- ~4 J4 A2 V3 k8 X
  1. //4096色/16位真彩色/18位真彩色/24位真彩色/32位真彩色
    6 x+ `) D- N9 m, `+ x; U: [
  2. //图像数据头结构体  
    # M; Z3 D. i+ H
  3. __packed typedef struct _HEADCOLOR4 {* {9 c! C* H+ ]
  4. {
    ! H7 F% X8 [" Y+ S
  5.    unsigned char scan;# l8 A9 ]# @, P7 Z4 i0 v4 v) x
  6.    unsigned char gray;
    ) O- {% F4 ]+ m; O2 R
  7.    unsigned short w;
    % E; q0 |* \" }0 T) h& T6 b
  8.    unsigned short h;
    ) q1 V  U6 v2 t; g( F! t( C% O) Q
  9.    unsigned char is565;
    . X& L& k1 Q) w
  10.    unsigned char rgb;+ f  o1 R9 |. J/ x6 K9 N6 Z* o
  11. }HEADCOLOR;  
    - @4 e( D0 L. {) H2 A: t# M
  12. //scan: 扫描模式             . a5 ^1 N4 y5 f; k
  13. //Bit7: 0:自左至右扫描,1:自右至左扫描。
    . Y% n9 L5 H, Q. t
  14. //Bit6: 0:自顶至底扫描,1:自底至顶扫描。
    5 ~. M% h4 W  [2 W7 w
  15. //Bit5: 0:字节内象素数据从高位到低位排列,1:字节内象素数据从低位到高位排列。
    ( P3 I. P9 X! i
  16. //Bit4: 0:WORD类型高低位字节顺序与PC相同,1:WORD类型高低位字节顺序与PC相反。 ' e' j; t+ `1 T$ w$ x. F
  17. //Bit3~2: 保留。
    ! A& x# r* `$ e3 O
  18. //Bit1~0: [00]水平扫描,[01]垂直扫描,[10]数据水平,字节垂直,[11]数据垂直,字节水平。 + G. f" r- G' Q9 C. x3 [
  19. //gray: 灰度值 3 h0 i2 R) ]8 D) _/ d
  20. //   灰度值,1:单色,2:四灰,4:十六灰,8:256色,12:4096色,16:16位彩色,24:24位彩色,32:32位彩色。
    0 v+ i, E1 P, \$ y- {3 F' f, s
  21. //w: 图像的宽度。         ' h  \0 U) u3 t/ m
  22. //h: 图像的高度。
    * h$ D0 h. ]; v) G$ `
  23. //is565: 在4096色模式下为0表示使用[16bits(WORD)]格式,此时图像数据中每个WORD表示一个象素;为1表示使用[12bits(连续字节流)]格式,此时连续排列的每12Bits代表一个象素。
    8 ?. ^. e8 ^$ }' y! H
  24. //在16位彩色模式下为0表示R G B颜色分量所占用的位数都为5Bits,为1表示R G B颜色分量所占用的位数分别为5Bits,6Bits,5Bits。) a' m$ F1 N4 G' \
  25. //在18位彩色模式下为0表示"6Bits in Low Byte",为1表示"6Bits in High Byte"。
    ) _2 ~  y, x0 e" @
  26. //在24位彩色和32位彩色模式下is565无效。          & @8 T9 n8 V9 D( y( _4 l/ \
  27. //rgb: 描述R G B颜色分量的排列顺序,rgb中每2Bits表示一种颜色分量,[00]表示空白,[01]表示Red,[10]表示Green,[11]表示Blue。( W. b# h0 c/ h6 r
  28. % ?# q& d. u* P( d9 J, l
  29. void image_display(u16 x,u16 y,u8 * imgx);//在指定位置显示图片! X9 ^' K1 W. X& q: B9 {
  30. void image_show(u16 xsta,u16 ysta,u16 xend,u16 yend,u8 scan,u8 *p);//在指定区域开始显示图片6 u$ |+ }, h8 u9 ?$ ?% y) ]
  31. u16 image_getcolor(u8 mode,u8 *str);//获取颜色
复制代码
  1. //从8位数据获得16位颜色
    , T! k+ |! a% |, Q2 W5 J/ {- F
  2. //mode:0,低位在前,高位在后.
    ) K' T9 u. U) _% d4 t0 P  i) R
  3. //     1,高位在前,低位在后.0 W8 C$ z) c/ D6 F+ i
  4. //str:数据8 H4 M9 }7 n5 J* N; `
  5. u16 image_getcolor(u8 mode,u8 *str): Y8 t- Y3 m+ o' L
  6. {( m0 c; }) w! S  S! I: i
  7.         u16 color;5 @1 V6 G$ y3 L" l5 N9 f- t2 f3 O. `
  8.         if(mode): C6 ?3 H5 u) y7 V" Q" r6 C! {
  9.         {9 U, u, g" W. f2 j2 Y+ e
  10.                 color=((u16)*str++)<<8;, }! D  v2 f' t- \0 x' O
  11.                 color|=*str;: k: i: u9 O: z, a2 z
  12.         }else: f) Q+ q0 h$ W0 y8 C+ t
  13.         {
    . Q% }: r& f6 A# x
  14.                 color=*str++;+ K/ z2 b; t8 C2 f- E% H' _
  15.                 color|=((u16)*str)<<8;  Q, u2 }6 @" K+ r; r6 q* V% c# S
  16.         }: X8 t- T8 L0 W  X
  17.         return color;        
    3 h! h7 Y- E$ N% I% A9 B" t$ ^& ~8 k
  18. }  R4 B* @% Q% N) B3 X
  19. //在液晶上画图(仅支持:从左到右,从上到下 or 从上到下,从左到右 的扫描方式!)           
    ' m/ Q  n  Z1 c5 o1 V
  20. //xsta,ysta,width,height:画图区域
    # I2 L: ?; |1 z. f$ ~9 X
  21. //scan:见image2lcd V2.9的说明.
    ) F+ A+ i" Q% r2 ~% c" A
  22. //*p:图像数据) [0 z* B! Q- |8 E6 @9 G! \9 _
  23. void image_show(u16 xsta,u16 ysta,u16 width,u16 height,u8 scan,u8 *p)
    # F7 a0 n7 ~/ U+ }
  24. {  
    7 ~( M& k) n$ a0 j) H' l6 y
  25.         u32 i;$ [, I" }9 e/ W! z5 q
  26.         u32 len=0;0 z. @% _2 O! v0 x: h) d5 V/ b
  27.         if((scan&0x03)==0)//水平扫描
    # `' Z6 P  A* |$ n4 V
  28.         {& e9 U1 l2 Y# ^
  29.                 LCD_Scan_Dir(L2R_U2D);//从左到右,从上到下  j$ R7 k5 |2 C: |0 t4 l
  30.                 LCD_Set_Window(xsta,ysta,width,height);
    ; }) r& a6 I4 S- a, s) T0 r! \! c
  31.                 LCD_SetCursor(xsta,ysta);//设置光标位置
    & a+ E" u7 I# L% v! W
  32.                                 
    ; y: A' ]% r- f5 v
  33.         }else  //垂直扫描
    5 k6 w# @. j$ O" @) O$ ~1 r# [
  34.         {  : e( w" e+ I$ p* J- q
  35.                 LCD_Scan_Dir(U2D_L2R);//从上到下,从左到右
    2 ]& Q, ]. b& w  c2 o- w' ]5 d
  36.                 LCD_Set_Window(xsta,ysta,width,height);
    8 B; @: s" T. y+ U
  37.                 LCD_SetCursor(xsta,ysta);//设置光标位置  
    4 t5 Z+ ~3 h" r$ i( D$ V7 J+ J
  38.         }) v4 Y  `- L; F( I7 a$ M/ C
  39.         LCD_WriteRAM_Prepare();           //开始写入GRAM
    + x/ {$ Q& l3 R/ ~
  40.         len=width*height;                        //写入的数据长度4 M  i. S" @3 j$ w7 W' J
  41.         for(i=0;i<len;i++)
    ( d# A/ l  `0 _$ b
  42.         {# e9 Z  M( s0 p5 X! R* x
  43.                 LCD_WR_DATA(image_getcolor(scan&(1<<4),p));
    # W) H+ @' h6 G' ]) y* c
  44.                 p+=2;, ]$ b& X8 I3 j' a
  45.         }           
    0 X( n+ g% V% y* a" v
  46.         LCD_Set_Window(0,0,lcddev.width,lcddev.height);              ( a! M& x+ Q% R! w" |4 }8 G& Y, W
  47. }  , r6 w( ]: }1 K6 O

  48. . S, a: Q" R4 h( `. \
  49. //在指定的位置显示一个图片
    . T' L9 H" l7 l
  50. //此函数可以显示image2lcd软件生成的任意16位真彩色图片.
    / s8 k) ^- o4 p  B5 ?7 {
  51. //限制:1,尺寸不能超过屏幕的区域.$ `$ Y, [/ g0 z4 }; H5 T
  52. //     2,生成数据时不能勾选:高位在前(MSB First)
    ; v$ i& Z5 H1 Q4 |+ v
  53. //     3,必须包含图片信息头数据% o7 ^5 U# I4 O7 |0 [9 `5 h
  54. //x,y:指定位置4 e3 y7 H! M. ]! |, }6 a
  55. //imgx:图片数据(必须包含图片信息头,"4096色/16位真彩色/18位真彩色/24位真彩色/32位真彩色”的图像数据头). C9 y- B- V' G5 C* \' w" h* w/ s6 i5 B
  56. //注意:针对STM32,不能选择image2lcd的"高位在前(MSB First)"选项,否则imginfo的数据将不正确!!
    9 v$ ?9 X/ u6 ?0 T9 h
  57. void image_display(u16 x,u16 y,u8 * imgx)+ |$ y7 h" S: J3 ?: o/ m+ @
  58. {
    3 y6 [( [3 P9 [3 t
  59.         HEADCOLOR *imginfo;
    $ N6 a" H/ d5 p
  60.          u8 ifosize=sizeof(HEADCOLOR);//得到HEADCOLOR结构体的大小/ [! J( y" w( m% s0 S
  61.         imginfo=(HEADCOLOR*)imgx;1 c! J- N$ Z, T. ^/ M" W9 p) i
  62.          image_show(x,y,imginfo->w,imginfo->h,imginfo->scan,imgx+ifosize);               
    % I: y3 [1 w- W/ E, e6 E; u
  63. }
复制代码

# O% z7 Y" p3 y) X  i2 }3 b8 j三、函数调用
- M( R, Z0 m% m  F3 s$ O4 i1 s/ e7 F
  1. int main(void)
    1 y) m6 j2 v/ l1 |- u9 [- K! @
  2. {
    0 ?: H! D6 r- x1 d9 N- s: t5 O
  3.         HEADCOLOR *imginfo;. i4 K1 G, s8 C( D- u# L' w
  4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组24 q6 r& Z( Q+ j6 i
  5.         delay_init(168);      //初始化延时函数
    3 ^: {$ S" ]* a2 h% D' m
  6.         uart_init(115200);                //初始化串口波特率为115200
    2 a0 h4 j: v: r  N$ J3 A# l. ^
  7.         imginfo=(HEADCOLOR*)gImage_image2;        //得到文件信息 ( [; m* X: J; z6 r- `7 e, G
  8.          LCD_Init();           //初始化LCD FSMC接口
    5 F) u+ J0 Z* f$ a+ x1 `

  9. & f. D: x, x2 W1 c6 x
  10.         1 E/ h% w  W* N4 I
  11.         image_display(0,400,(u8*)gImage_image2);//在指定地址显示图片
    ; t: q' h9 f! N- U
  12.           while(1)
    + y, J) B6 e+ W+ V* F1 r
  13.         {                 6 u- ?5 g5 ~4 t8 Y9 {8 m% {/ B

  14. 0 ^+ ^! G8 J4 z' o& k, `1 ^/ ]
  15.                 delay_ms(10);
    ( n3 I5 B! D; Y- z! k) N3 N2 S! g
  16.         } 0 p4 E5 m& _; y5 b
  17. }9 H! V0 \' o; ^: Z3 B
复制代码

6 z5 b4 ^' y. i) i5 S" L$ w5 J7 p5 j: K3 I7 ?

/ o1 [+ I. S8 [7 Z2 Y* {1 |) M
赞 收藏 评论0 发布时间:2022-4-23 16:31

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版