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

STM32F103用SPI驱动12864屏  

[复制链接]
发布时间:2015-1-11 14:14
本帖最后由 xnmc2013 于 2015-4-20 21:58 编辑 ! H: A3 e& w( w/ r
+ g. M7 _8 T' j
      以前用51时,驱动12864屏用并口,但是感觉显示速度还是挺慢,现在用STM32F103ZE的SPI驱动,感觉还很快,而且很稳定。我试了金鹏OCMJ4*8C的,还试了刚买的一个杂牌的12864屏,显示都蛮快蛮好。我是用的V2版库文件,这里面关键是设置好SPI的一些参数,我都标住了中文解释。具体其他一些IO等的设置这里就不具体讲了,大家应该都会的哦~~好了,下面附上我的一部分代码供大家参考:: q# @( v7 u% d, D! T6 ^1 s  l

& j4 \3 T0 h& W% S- p$ b     void SPI_Configuration(void)5 @8 E7 Q' }" |4 Y) q- r
{
! l6 c! a2 ^' h9 l  SPI_InitTypeDef   SPI_InitStructure;
( j, D8 x9 {, I0 k4 @5 D
1 y! z/ D. y) b, [0 Q  SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex;
( N4 i8 ?3 C* `( i2 U  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //主设备
0 S7 D/ i  U7 i5 U+ L/ w  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        //位数据一帧/ v' x! Q% M! ]
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //时钟级性 SCK空闲时为1  F7 O5 y- I  J8 H
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                //数据采样从第2个时钟边沿开始
& u) W- X: Q8 C$ j: n  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;4 y( u% J: @, u/ H5 N
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;        //波特率控制 fclk/4
3 E2 r6 i6 N# d+ r/ f; x0 O/ e* o  Q  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                //先发送MSB                                         
( l5 Q! ~7 P' R$ q; f  SPI_Init(SPI1, &SPI_InitStructure);7 y  g, P1 I* L( p# h" n0 n! [
  SPI_Cmd(SPI1, ENABLE);" K3 G7 F6 O+ v$ ^
- o2 s. J4 q/ B# f; u/ h
}
3 }$ t! q! n2 c8 Y- V$ ?1 i- i& k; ]3 P; a
void LCD_wr(u8 lcd_com,u8 lcd_data)                                         //写入LCD数据或命令
& x" T/ ~. o3 L; _3 m1 M) H& n{: u' M  t; t# H/ }: u& |5 V: v
        u8 lcd_data_msb,lcd_data_lsb;- `! {/ P7 I2 e+ k8 ?
        lcd_data_msb=0xf0&lcd_data;
7 c0 C" f+ I" F        lcd_data_lsb=(0x0f&lcd_data)<<4;
9 q1 D5 ?5 X- ~0 N        if(lcd_com==0)                                        //写命令
9 P4 [6 ^) o# o0 J        {
3 o& U) {4 }7 c" z( t0 [                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);        //等待 SPI1 发送缓冲空3 _$ P& `$ f5 G0 I! v$ i
            SPI_I2S_SendData(SPI1, 0xf8);                        // SPI1 发送数据--命令指令-- . O; ?# [( g' n* g5 v) Y/ e
        }
* {0 z( F& i: L        if(lcd_com==1)                                        //写数据2 b& `3 ~6 Z* A1 M1 ]+ @
        {
4 d" B% v3 _) ^6 |                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);                //等待 SPI1 发送缓冲空
+ M0 s6 g6 ]" k7 r            SPI_I2S_SendData(SPI1, 0xfa);                    //SPI1 发送数据--数据指令--
: F! _7 c, F" P/ y# v4 f! R        }! {6 T1 R/ B5 G, h/ o
        delay(100);: ?; J/ ~, e6 w
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);                //等待 SPI1 接收数据完毕
9 n; ~/ @4 l+ l* N        SPI_I2S_SendData(SPI1, lcd_data_msb);                   //SPI1 发送高4位数据
8 V4 B& A' R. U# G7 _- b; N        delay(100);
( j" j& [: F4 F3 g        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);                //Wait for SPI1 Tx buffer empty* T9 ^! s+ m& M% r3 K" o2 c
        SPI_I2S_SendData(SPI1, lcd_data_lsb);            // SPI1 发送低4位数据
9 f. O+ J& i6 E3 k8 u3 ?- H4 _        delay(100);$ x) v- @' v0 c9 K
}        ) T- Q9 h$ f9 L" X
void initlcd(void)                          //LCD初始化
  T0 M5 I3 O; L% H{, ^  \+ V' _2 O
  LCD_wr(0,0x30);                  //30---基本指令动作 5 t2 q$ \# K8 V5 m
  delay (100);1 ?; N% J9 _  |5 }2 R; A
  LCD_wr(0,0x01);                  //清屏,地址指针指向00H
2 c0 }+ y0 R) b/ s1 Z& F  delay (100);
& d, j) o4 |" p  r7 y' p  LCD_wr(0,0x06);                  //光标的移动方向
6 @/ H& b; t" N5 b6 ]) [  delay (100);; B9 F5 C5 p& x' k) m
  LCD_wr(0,0x0c);                  //开显示,关游标: t  r4 T" L2 P! [' W, Z" j
  delay (100);        + `8 ~% f) l! }( _, ]5 B
}
; H2 r: u1 ^: h6 t' `. G' T# `$ i2 zvoid delay (u16 ms)# I9 G1 h5 j- S, p; o/ z& I. Y
{! }7 t. u+ O9 i4 ?" q9 l
  u16 i,j;. O1 U9 B- j/ Z
  for(i=0;i<ms;i++) % k/ F( X& K' s+ A& M, J7 q* @
  for(j=0;j<100;j++) {;}
- q" `0 Z$ Y+ w! ^}0 d4 N* l& _+ F0 E! j$ z
void lcddisp(u8 *chn)                          
2 }* T! J9 ]1 M  V2 F( ~{
6 C$ S) x7 o) P* p0 F  u8 i,j;) K: M* S' k1 W7 ~' [
  LCD_wr(0,0x30);* r/ K4 Z+ F, D+ e0 _! ^, F! W
  delay (100);
/ n% Y2 {/ P# f0 w  LCD_wr(0,0x80);8 u# ]0 _+ c5 Z8 {8 t
  delay (100);
/ |) ?% f2 \. n: H4 C% K/ N  for (j=0;j<4;j++)# H" j9 J  w+ t2 S+ c. v1 P
  {
0 g4 O& Q" d) h/ I" x% ~) a    for (i=0;i<16;i++)) Y( k$ Y  j! T5 T" I0 @& ?+ q
            LCD_wr(1,chn[j*16+i]);! w& h- @4 [9 v
                delay (100);
$ P+ O* Q: p: X) C0 a/ c6 y  }8 p3 `& @3 l" r0 q; Q# p7 U+ U+ M
}. A9 g/ z  c+ y: {1 g
& S- C7 ?) E! x1 B

$ m% `& B. y( v5 s# k# \! W; v
. {& L  \# c% y2 a& ^希望能帮助需要用到的人哦,我也是花了很长时间才搞好的
) A! H; Q# p  N) u# G
- `+ f, U8 U9 M; S6 u; O" q可能有的人不会接线,我上传下我的接线,这里片选直接接了VCC,数据线只接了时钟-R/W和数据命令发送-E。就是图中的STD和SCLK。仅供参考% ]- ^' I2 H3 q: ]
有图有真相哦  C: X9 v+ I$ u' x, R

' }) n2 R$ O8 t. X; M IMG_20150111_151609.jpg , l+ F' O" O5 s, ]
, f: {  C! z& [
IMG_20150111_151622.jpg
" i% E2 h+ M7 E
5 ^, t9 I2 {, G
" h  F- l4 q" c2 H: ^
" P1 D  V! ?+ i2 o3 `7 A

12864屏SPI接线

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

举报

56个回答
回答时间:2015-4-15 21:56:38
michael83 发表于 2015-4-15 10:384 K+ X! {- c6 s2 R7 A  A, }. ]1 f
你好,能发一下你的打包代码吗?谢谢分享。
& G; |' R0 o+ L/ Y$ w
不好意思,当时主要是用于我的一个小项目,现在搞的比较复杂了,贴出来的主要是一些最基本的操作,用这些就可以控制比较复杂的变化。看看过些时候,我把一些简单的应用稍微总结一下,再另贴发代码吧
回答时间:2016-6-1 20:43:23
sdtazzf 发表于 2016-5-27 14:29
* k* u: J6 l' ~3 ]咨询楼主:为什么显示很慢啊?还有乱码。
0 x5 W' W! p" v: I! G/ M' y' N- [

$ {0 q$ T& |) o# I, e; h! G8 K要把延时缩短,我感觉比51单片机的并行口还快呢!乱码的话,不知道,我的没出现,你再试试,我现在用的屏不是金鹏的,是淘宝上的杂牌,量大的话才28一个的,效果也很好,兼容金鹏的
回答时间:2015-4-15 21:52:30
michael83 发表于 2015-4-15 10:081 [1 Z3 P% z# G. y- e7 x
谢谢。非常棒的消息。
. V, e# W4 {  D4 {/ B% m; K想问,你的12864的核是st7920吗?谢啦。
! a' m! @/ g: K9 \" W6 |
是的,是ST7920的控制器,测试时是用的金鹏OCMJ4X8C,不过后来又买的杂牌的12864屏,和金鹏OCMJ4X8C完全兼容,感觉比金鹏还好用点,不过不知道是否耐用~~
黄小狼 回答时间:2015-1-11 15:02:55
楼主是好人呀,嘿嘿,我的屏也是12864,不过驱动是别人写好的
wamcncn 回答时间:2015-1-11 15:48:11
本帖最后由 wambob 于 2015-1-11 15:54 编辑   J* F3 H' F2 C( p1 [; T! \, R

% Z. c. z9 l& p3 N看到你的液晶焊的软线,我后悔焊插针了+ y$ Z7 @5 \5 c" m; ^
焊了20个脚) b9 ]5 E! j0 {3 w$ A
回答时间:2015-1-11 15:52:16
wambob 发表于 2015-1-11 15:48
0 Y$ @2 E, N, F: p5 y' i看到你的液晶焊的软线,我后悔焊插针了
* T$ ?/ y9 c  V' e' J+ P1 e" o
,这个只能用于平时测试
kevin0129 回答时间:2015-1-11 16:01:54
我也准备用SPI驱动12864,不过我的板子是072的!
回答时间:2015-1-11 16:40:35
kevin0129 发表于 2015-1-11 16:013 b5 q& h; H; c8 ^
我也准备用SPI驱动12864,不过我的板子是072的!

% R. w# p3 |. a# k2 ?# e我也刚买了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
不错的, i! Z$ {. j# f
discovery与nucleo库函数有区别# B6 Z  v0 v1 S$ {- r, Z
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$ `! ~4 u# I0 ^; A* F& S
spi怎么有一个复位线?还有读数据的函数呢?
1 X! u7 w: X7 q& {
用SPI驱动12864,不需要复位线,也基本不需要读取忙的状态,个别地方只要加入短暂的延时就行了。我只接了4根线:5V、0V、STD、SCLK。
yceast 回答时间:2015-1-11 21:47:56
谢谢分享
caizhiwei 回答时间:2015-1-11 21:48:37
两线的SPI 可能是省掉了CS,高明啊,,!0 Q8 `4 A$ x! O
你的17引脚RST没有连接,对吧?
1234下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版