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

STM32F103用SPI驱动12864屏  

[复制链接]
发布时间:2015-1-11 14:14
本帖最后由 xnmc2013 于 2015-4-20 21:58 编辑 & n4 @5 C- t& ~" c! i; @$ K
' r; N3 P: C; o
      以前用51时,驱动12864屏用并口,但是感觉显示速度还是挺慢,现在用STM32F103ZE的SPI驱动,感觉还很快,而且很稳定。我试了金鹏OCMJ4*8C的,还试了刚买的一个杂牌的12864屏,显示都蛮快蛮好。我是用的V2版库文件,这里面关键是设置好SPI的一些参数,我都标住了中文解释。具体其他一些IO等的设置这里就不具体讲了,大家应该都会的哦~~好了,下面附上我的一部分代码供大家参考:
6 k+ l% r" y( }- ~) B
' w: u1 ~2 v5 j: [6 ~% }     void SPI_Configuration(void)8 O% L5 p: y5 A6 v
{
; a# _: N/ B' J% |. K$ @  SPI_InitTypeDef   SPI_InitStructure;. }5 o0 C6 L! o. Q7 g  e5 A* q. _

: Z% y) T# \" h* P5 B! q  SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex;
5 J- R7 m( Z( P' {! V  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //主设备
+ v% q9 Z1 Y0 F  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        //位数据一帧# ~9 J( w  o, V! W4 d
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //时钟级性 SCK空闲时为18 f" M7 J, [- C2 `2 d1 Z
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                //数据采样从第2个时钟边沿开始/ ]0 V3 @4 ]* L2 J% f) W1 O% d
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
2 a' {' R& |' M7 B' p" L  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;        //波特率控制 fclk/41 o& E2 n- c3 ?/ P# U
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                //先发送MSB                                         4 u% a3 z( `' ^5 Z
  SPI_Init(SPI1, &SPI_InitStructure);+ F! P& _  e5 Z% y( H$ {, i
  SPI_Cmd(SPI1, ENABLE);0 G3 c$ s) G9 e. K3 `: H3 S0 C
  j- T& j5 g$ [# [9 i0 K  G! `
}
, `  ]9 Q/ f( l8 ]: E1 Y- G3 S6 b+ L1 b4 _5 g1 D
void LCD_wr(u8 lcd_com,u8 lcd_data)                                         //写入LCD数据或命令
6 o, [/ t! ^- t{
; C# y- {, j$ _! G        u8 lcd_data_msb,lcd_data_lsb;
/ }( [7 S: E. v) N; G        lcd_data_msb=0xf0&lcd_data;
' b6 V4 ^& t! T5 L7 F) n# E        lcd_data_lsb=(0x0f&lcd_data)<<4;
* a; k$ b1 o- I5 i  c2 o        if(lcd_com==0)                                        //写命令$ m) ]) z$ Q3 Y- o8 F) P
        {3 h/ O( @- S9 H  T1 l! f# D% j
                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);        //等待 SPI1 发送缓冲空9 O% B1 r; F* `4 s  x, _
            SPI_I2S_SendData(SPI1, 0xf8);                        // SPI1 发送数据--命令指令--
" z2 P4 x+ \) S/ N9 S3 A; ], p        }
3 D4 {7 t' V4 X$ u! Y  p$ d        if(lcd_com==1)                                        //写数据* y+ n& |5 b. q6 T" K6 E
        {
0 j& V: Z% b' G  G- J                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);                //等待 SPI1 发送缓冲空
  B7 E: p9 M1 j1 i3 o            SPI_I2S_SendData(SPI1, 0xfa);                    //SPI1 发送数据--数据指令--9 `& ]  Y) G1 t5 w) a* o: ]) A
        }
2 @( a/ i. {6 A$ s# ~5 k) E/ g        delay(100);
7 \$ o  j, O# Q9 h/ n; [" y        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);                //等待 SPI1 接收数据完毕
+ w9 Q7 _& v! c; z        SPI_I2S_SendData(SPI1, lcd_data_msb);                   //SPI1 发送高4位数据
+ s- I3 U# y! ?# c( r        delay(100);
" `, y# F+ ^: N# x$ t( `) o        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);                //Wait for SPI1 Tx buffer empty. y$ I7 T- f5 l; q8 b! ]
        SPI_I2S_SendData(SPI1, lcd_data_lsb);            // SPI1 发送低4位数据+ G/ N+ {( l. [, x1 X
        delay(100);
0 {( A6 R+ i/ |9 y# w}        $ P7 N  U- ^; V6 o
void initlcd(void)                          //LCD初始化  O% M/ h" Q( D2 R# U1 v) l
{' e& s: `  R5 V
  LCD_wr(0,0x30);                  //30---基本指令动作
7 R) C0 n& g9 u$ L1 I  delay (100);7 s7 @6 ^6 l; H8 o7 b
  LCD_wr(0,0x01);                  //清屏,地址指针指向00H
7 b" \! F+ I# x+ D: k( U/ r  delay (100);
# Z$ Q  I. H# [; y9 r  LCD_wr(0,0x06);                  //光标的移动方向1 Q" X1 v7 h% A+ R' J
  delay (100);! p  Q. a2 H- G8 M1 _" Q
  LCD_wr(0,0x0c);                  //开显示,关游标
! f/ s: M: I% Q  delay (100);        
, M0 i  n8 b- Y7 w  ^}
3 \3 l8 H% I2 l0 {5 Y( Fvoid delay (u16 ms)
' j! Y8 D% F& A+ |! S. [& ~{- H7 B" h, J4 V, V- ^
  u16 i,j;
5 E4 {7 |" m6 w0 T) e  for(i=0;i<ms;i++) ) m3 z! z$ c1 f4 a
  for(j=0;j<100;j++) {;}
7 J; o2 z" P. ], d& g}5 h* Q' M' u% ^; p
void lcddisp(u8 *chn)                            T6 Y0 u8 H! w4 u+ j2 l6 t
{
- b' K9 `% |# A' F3 e" X  u8 i,j;
2 q1 |4 p8 |$ n7 b, n  LCD_wr(0,0x30);8 E1 Z- l2 y$ S6 `
  delay (100);8 Z( z) [2 ?% X! j; Z6 y, _. B3 p
  LCD_wr(0,0x80);
: S3 g. \0 o5 A' n- |  delay (100);
; Z# c/ B. ^( I: L( l( C. A; q! u( ?5 S  for (j=0;j<4;j++)3 f$ C* {  s2 f
  {1 q; Y+ C# N: T% d9 u
    for (i=0;i<16;i++). I, p* z8 m- [. p1 R/ E
            LCD_wr(1,chn[j*16+i]);0 N( B4 R0 {+ p) P$ W0 y
                delay (100);
# u) `$ \3 M) _, r/ p  }0 I& d/ I2 l+ K2 X) U. c
}
! t' K; o1 A0 ~5 k( L7 p. j3 L' X+ o+ z+ ]! H( o1 x
2 d8 v7 ?' B7 {2 c
2 W5 v$ t7 S# P, d8 O* E( I; H
希望能帮助需要用到的人哦,我也是花了很长时间才搞好的0 [1 A7 \/ c+ m/ ?/ J% y

4 g) q3 r6 p# |2 z! Q, U% ]可能有的人不会接线,我上传下我的接线,这里片选直接接了VCC,数据线只接了时钟-R/W和数据命令发送-E。就是图中的STD和SCLK。仅供参考
/ {, Q* F' k2 W4 f! u有图有真相哦8 ~& k4 y  t1 f' y% _  i8 K

# q2 T0 B0 M/ R- j) ?. r IMG_20150111_151609.jpg 9 x- m, ~: R. N
6 |) g7 K0 d9 L8 m' n
IMG_20150111_151622.jpg
3 t3 f& ^# u& r1 z/ t* S* _2 Y' G- `' F: B$ A" }
3 I5 V2 v+ O0 V: V- H

( |; T, u/ p! D

12864屏SPI接线

12864屏SPI接线
1 收藏 14 评论56 发布时间:2015-1-11 14:14

举报

56个回答
回答时间:2015-4-15 21:56:38
michael83 发表于 2015-4-15 10:38
! ]* n' @2 @* \+ l你好,能发一下你的打包代码吗?谢谢分享。
, I; V; t3 g! s' u4 [6 S, I
不好意思,当时主要是用于我的一个小项目,现在搞的比较复杂了,贴出来的主要是一些最基本的操作,用这些就可以控制比较复杂的变化。看看过些时候,我把一些简单的应用稍微总结一下,再另贴发代码吧
回答时间:2016-6-1 20:43:23
sdtazzf 发表于 2016-5-27 14:29" I  y3 X+ e$ ?' g) q
咨询楼主:为什么显示很慢啊?还有乱码。

; w/ O4 X2 o: e2 I4 N* G! f/ D) `8 j' g5 N& W: _% S; `
要把延时缩短,我感觉比51单片机的并行口还快呢!乱码的话,不知道,我的没出现,你再试试,我现在用的屏不是金鹏的,是淘宝上的杂牌,量大的话才28一个的,效果也很好,兼容金鹏的
回答时间:2015-4-15 21:52:30
michael83 发表于 2015-4-15 10:08
+ _7 ]9 i, i2 R" B5 ]谢谢。非常棒的消息。0 s, g8 l# E, F, W/ I% w% }) O  ~
想问,你的12864的核是st7920吗?谢啦。

8 V! U6 }& `: i2 h是的,是ST7920的控制器,测试时是用的金鹏OCMJ4X8C,不过后来又买的杂牌的12864屏,和金鹏OCMJ4X8C完全兼容,感觉比金鹏还好用点,不过不知道是否耐用~~
黄小狼 回答时间:2015-1-11 15:02:55
楼主是好人呀,嘿嘿,我的屏也是12864,不过驱动是别人写好的
wamcncn 回答时间:2015-1-11 15:48:11
本帖最后由 wambob 于 2015-1-11 15:54 编辑 7 o* q9 n3 v% M1 f, p. x+ J

! T  ]7 W5 W9 M6 X+ t* N看到你的液晶焊的软线,我后悔焊插针了
- n9 C; b/ M7 L# A. I焊了20个脚
7 e$ N$ S; e; X+ x6 u, s
回答时间:2015-1-11 15:52:16
wambob 发表于 2015-1-11 15:480 {8 u0 |+ `0 C7 w# \' q
看到你的液晶焊的软线,我后悔焊插针了
6 |5 c, E! E& c: x; l/ a
,这个只能用于平时测试
kevin0129 回答时间:2015-1-11 16:01:54
我也准备用SPI驱动12864,不过我的板子是072的!
回答时间:2015-1-11 16:40:35
kevin0129 发表于 2015-1-11 16:01
' [  v  S  h9 n5 S我也准备用SPI驱动12864,不过我的板子是072的!
$ H0 p, O' }9 s- J+ C+ d. ^* l2 \
我也刚买了030的板子,过2个月也想把F1的移植到F0上面,不过固件库好像差别比较大
huaxi90 回答时间:2015-1-11 16:58:30
楼主好人,代码可以参考下,哈哈
manxueqian 回答时间:2015-1-11 17:05:24
谢谢分享!
kqh1120 回答时间:2015-1-11 17:19:18
学习了啊
大秦正声 回答时间:2015-1-11 17:57:55
不错的
9 c2 Y, ^& L# h, vdiscovery与nucleo库函数有区别2 d% E3 P- B" M+ \& ]2 Z+ y
hal硬件抽象层函数库
abend 回答时间:2015-1-11 18:07:13
st的hall库质量堪忧,估计是印度那帮阿三搞的
caizhiwei 回答时间:2015-1-11 18:23:15
spi怎么有一个复位线?还有读数据的函数呢?
回答时间:2015-1-11 18:58:36
caizhiwei 发表于 2015-1-11 18:23+ k2 W6 E. i0 n) h6 ?( ]- \( q8 k: E
spi怎么有一个复位线?还有读数据的函数呢?

7 ^2 i% v9 O: c7 C用SPI驱动12864,不需要复位线,也基本不需要读取忙的状态,个别地方只要加入短暂的延时就行了。我只接了4根线:5V、0V、STD、SCLK。
yceast 回答时间:2015-1-11 21:47:56
谢谢分享
caizhiwei 回答时间:2015-1-11 21:48:37
两线的SPI 可能是省掉了CS,高明啊,,!+ S, i0 {  D. _! |( w9 L
你的17引脚RST没有连接,对吧?
1234下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版