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

STM32F103用SPI驱动12864屏  

[复制链接]
谦 发布时间:2015-1-11 14:14
本帖最后由 xnmc2013 于 2015-4-20 21:58 编辑 0 U; w/ J5 A2 S- I
1 h1 X2 j3 W. ]) A$ O  O4 [
      以前用51时,驱动12864屏用并口,但是感觉显示速度还是挺慢,现在用STM32F103ZE的SPI驱动,感觉还很快,而且很稳定。我试了金鹏OCMJ4*8C的,还试了刚买的一个杂牌的12864屏,显示都蛮快蛮好。我是用的V2版库文件,这里面关键是设置好SPI的一些参数,我都标住了中文解释。具体其他一些IO等的设置这里就不具体讲了,大家应该都会的哦~~好了,下面附上我的一部分代码供大家参考:
  r( G7 j' Z  d; q6 K  |- q2 D  }: X6 }- Q- O
     void SPI_Configuration(void)
; g6 I% v0 B& \, K6 \{! a, X; \! q3 L1 h& B& `$ M) z
  SPI_InitTypeDef   SPI_InitStructure;1 g5 f8 E' a% \3 B8 S

6 P- _8 N1 _% V- G) _# D  SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex;* Q( ~0 ^. s. y& R3 |! i+ a
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //主设备3 \8 l0 N, h5 _# [5 m% C: }$ i1 C' A
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        //位数据一帧& ]- @3 O. y1 m1 W0 d- j* [
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //时钟级性 SCK空闲时为1
! K6 j* g* Q8 r. `5 [  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                //数据采样从第2个时钟边沿开始
4 L. l! e5 t; e  E7 ?  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;+ P- C) ]) Q3 I3 s! i" N, S2 A
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;        //波特率控制 fclk/4/ y- n6 u( a1 j3 a( b+ Z8 h
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                //先发送MSB                                         / m( ^6 \3 `: Y, I- y2 I3 Y/ l
  SPI_Init(SPI1, &SPI_InitStructure);
% ?+ ?! f$ i' o; R2 F- [  SPI_Cmd(SPI1, ENABLE);
; c) [: l4 W8 o; Z9 C
- |4 z4 I1 y- H}9 ^! z5 H- X. _/ U' k+ i9 i

. i% s7 C9 z8 z7 I* Jvoid LCD_wr(u8 lcd_com,u8 lcd_data)                                         //写入LCD数据或命令) l* J  }% Q+ [& h
{% i0 V9 v* ~* C8 ^! ^/ o2 j# {1 |
        u8 lcd_data_msb,lcd_data_lsb;
7 r5 {/ U$ `: [% i7 J        lcd_data_msb=0xf0&lcd_data;8 ?2 F( h5 w* P% ~8 _; k; [4 Z. U
        lcd_data_lsb=(0x0f&lcd_data)<<4;* f% P+ C3 H- S; y5 a
        if(lcd_com==0)                                        //写命令: c8 Q+ r5 V1 p# c( ]4 O. G
        {
! c8 c  V% W- b2 q                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);        //等待 SPI1 发送缓冲空
7 _  b0 K, K$ p            SPI_I2S_SendData(SPI1, 0xf8);                        // SPI1 发送数据--命令指令-- % Q9 ~: n& |1 v, H$ Q
        }
0 E, [2 P! F* ~* g2 c( n        if(lcd_com==1)                                        //写数据
# f2 k  v1 P, G* L7 y2 W        {
# l& \8 ?) k0 V& L# {& y0 n                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);                //等待 SPI1 发送缓冲空
( J! l4 G6 M0 x; r$ D            SPI_I2S_SendData(SPI1, 0xfa);                    //SPI1 发送数据--数据指令--( d6 T, c+ Y& |& O& B
        }: b  ?; t; r( F! J# @
        delay(100);
3 ?# d. f; m& k; K7 Z        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);                //等待 SPI1 接收数据完毕, p% X" m  q3 _9 Z
        SPI_I2S_SendData(SPI1, lcd_data_msb);                   //SPI1 发送高4位数据5 V# ^& G3 l5 j$ ?9 v4 ^
        delay(100);
3 W. k$ ^5 P/ r; Q; M8 G        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);                //Wait for SPI1 Tx buffer empty8 r9 e+ J0 i2 O2 K" I- R  i6 {
        SPI_I2S_SendData(SPI1, lcd_data_lsb);            // SPI1 发送低4位数据+ u. b" F; g1 h/ t
        delay(100);) P: G3 k3 y: a
}        
3 I, u# A3 @- V: d8 Wvoid initlcd(void)                          //LCD初始化
% e4 k  k! G; h+ g! D( F{" z+ p8 k) @0 R
  LCD_wr(0,0x30);                  //30---基本指令动作 / Y" p' E: a& d/ T. B
  delay (100);* K! }0 {+ @# D9 e0 p) l4 W0 P  t
  LCD_wr(0,0x01);                  //清屏,地址指针指向00H+ i" f6 }% L+ |9 |4 ?& o) h
  delay (100);+ L# n' M& X+ A) u
  LCD_wr(0,0x06);                  //光标的移动方向
  v5 x: }( u5 f# v3 F  delay (100);. y9 b( k; A( i5 H* A- [3 K' j5 q
  LCD_wr(0,0x0c);                  //开显示,关游标
6 ?2 M- p2 d* n2 `" d( H  delay (100);        
$ u6 @9 _2 G7 Q/ ^% N; c7 i}1 y: C+ v  c! g" }& G! r
void delay (u16 ms)# G8 }$ m+ I2 {* F5 `
{  w9 w) e7 F% ]3 B+ g
  u16 i,j;- d2 J: u1 J, U6 Y8 {6 f
  for(i=0;i<ms;i++) : L% w  J% G2 d7 e7 E6 B; ~: c
  for(j=0;j<100;j++) {;}( w% W3 O. U2 r7 V. m
}
' x- \7 M. f8 R9 d' s8 M# I, [void lcddisp(u8 *chn)                          
5 ?6 A# S: D* K" y3 s3 x# j0 |{
2 ^! {7 J5 C- ?/ B' q5 m; z  u8 i,j;. Y& r* r* @% f7 w3 V2 \# k
  LCD_wr(0,0x30);
! {- a# U2 w4 ^& G& D  delay (100);
4 }. {) ~! l, F4 k* k$ h& W  LCD_wr(0,0x80);
: u( G' K& V# Z0 d/ q0 K9 v  delay (100);
7 Q/ l+ R7 p; y( k  for (j=0;j<4;j++)) V. z8 m- i2 v! \9 I& a  N3 `: n6 U
  {9 `! G2 k1 X; k! n, U! [
    for (i=0;i<16;i++)
5 s+ U3 L6 k) i0 h, D* u; B3 j            LCD_wr(1,chn[j*16+i]);
- W: ~6 }) @, X9 N  T$ d3 j/ n                delay (100);
, @( a' W; E4 ~0 m9 G! Z2 U; {6 \  }% A- X8 p, t8 K1 r
}; C% o2 H3 V* r4 s
# l4 T7 [6 t' V( u. A3 S0 a

4 L9 C: _/ j, \' j8 Y2 [: p+ o# ^: h6 K
希望能帮助需要用到的人哦,我也是花了很长时间才搞好的% P: A) b. O+ D! C; y. j3 W

0 m+ g4 Y, O- o. ?! c- ]可能有的人不会接线,我上传下我的接线,这里片选直接接了VCC,数据线只接了时钟-R/W和数据命令发送-E。就是图中的STD和SCLK。仅供参考' \& a* A* \* g/ ?0 b
有图有真相哦" n( A8 D" w* Q: n4 V: l! d8 R8 z; B

+ J9 q# H& b0 ~ IMG_20150111_151609.jpg + |  T# K' I! v# [5 @: E/ D

) N4 K( g- N2 i' @ IMG_20150111_151622.jpg 9 ?/ M- E6 h  D  Q# A
, [# N. i' r7 C; e- s
5 t1 M& }3 @2 m; Z7 P6 e  S1 J
3 K# N: M- ^/ \. M) F, X5 ]( Q) X

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) }. d) u0 O- Y$ j: ^" w
你好,能发一下你的打包代码吗?谢谢分享。

) s/ y! X; s6 a% N; U) d* x不好意思,当时主要是用于我的一个小项目,现在搞的比较复杂了,贴出来的主要是一些最基本的操作,用这些就可以控制比较复杂的变化。看看过些时候,我把一些简单的应用稍微总结一下,再另贴发代码吧
谦 回答时间:2016-6-1 20:43:23
sdtazzf 发表于 2016-5-27 14:29
; [+ g9 h& I- q  \咨询楼主:为什么显示很慢啊?还有乱码。

& F" _8 N% |2 {+ M3 Z5 A
% P/ E% q4 v# V要把延时缩短,我感觉比51单片机的并行口还快呢!乱码的话,不知道,我的没出现,你再试试,我现在用的屏不是金鹏的,是淘宝上的杂牌,量大的话才28一个的,效果也很好,兼容金鹏的
谦 回答时间:2015-4-15 21:52:30
michael83 发表于 2015-4-15 10:086 Q+ f6 Q- K$ B$ Q
谢谢。非常棒的消息。! G; F' b9 q' @" n8 i) n
想问,你的12864的核是st7920吗?谢啦。
1 h  @& R+ T( v$ e) U
是的,是ST7920的控制器,测试时是用的金鹏OCMJ4X8C,不过后来又买的杂牌的12864屏,和金鹏OCMJ4X8C完全兼容,感觉比金鹏还好用点,不过不知道是否耐用~~
黄小狼 回答时间:2015-1-11 15:02:55
楼主是好人呀,嘿嘿,我的屏也是12864,不过驱动是别人写好的
wamcncn 回答时间:2015-1-11 15:48:11
本帖最后由 wambob 于 2015-1-11 15:54 编辑 6 Z# @1 J8 ^7 w3 m" \1 W3 X& v8 O
& @. l7 o0 z2 r# c0 d8 U$ @
看到你的液晶焊的软线,我后悔焊插针了
$ {/ C" B' b2 z  E5 Z/ t焊了20个脚: f' |7 X- P+ B
谦 回答时间:2015-1-11 15:52:16
wambob 发表于 2015-1-11 15:48
% g) w, ^" h6 X看到你的液晶焊的软线,我后悔焊插针了

0 Y$ G8 ~+ G' p5 l,这个只能用于平时测试
kevin0129 回答时间:2015-1-11 16:01:54
我也准备用SPI驱动12864,不过我的板子是072的!
谦 回答时间:2015-1-11 16:40:35
kevin0129 发表于 2015-1-11 16:01
) G; S4 z( p8 z( q$ c/ H我也准备用SPI驱动12864,不过我的板子是072的!

& Q- f* L8 A5 J1 i# v9 g我也刚买了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
不错的# o0 I4 u  N8 G7 Q. @/ k5 B+ b9 b, |
discovery与nucleo库函数有区别% z! V+ {0 ^/ x+ m$ k0 l
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
' z1 {) @4 Y. T( A8 B' R- Xspi怎么有一个复位线?还有读数据的函数呢?

- i4 Y- C/ ~6 k# l& P+ h8 z) H用SPI驱动12864,不需要复位线,也基本不需要读取忙的状态,个别地方只要加入短暂的延时就行了。我只接了4根线:5V、0V、STD、SCLK。
yceast 回答时间:2015-1-11 21:47:56
谢谢分享
caizhiwei 回答时间:2015-1-11 21:48:37
两线的SPI 可能是省掉了CS,高明啊,,!
  s1 w# j( J$ i" s你的17引脚RST没有连接,对吧?
1234下一页

所属标签

相似技术帖

官网相关资源

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