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

STM32F103用SPI驱动12864屏  

[复制链接]
发布时间:2015-1-11 14:14
本帖最后由 xnmc2013 于 2015-4-20 21:58 编辑
5 `* c" {4 X* t! ]# A
/ r. \3 `  Y; a+ @3 q4 G# s      以前用51时,驱动12864屏用并口,但是感觉显示速度还是挺慢,现在用STM32F103ZE的SPI驱动,感觉还很快,而且很稳定。我试了金鹏OCMJ4*8C的,还试了刚买的一个杂牌的12864屏,显示都蛮快蛮好。我是用的V2版库文件,这里面关键是设置好SPI的一些参数,我都标住了中文解释。具体其他一些IO等的设置这里就不具体讲了,大家应该都会的哦~~好了,下面附上我的一部分代码供大家参考:! y! d) V8 ?) @8 Y6 M; M

+ l9 O+ i" s2 ]0 H; E+ u     void SPI_Configuration(void)" E, H+ o, A4 B! E/ r4 ?: B
{
% j' s) Q% K* S+ t& \) M  SPI_InitTypeDef   SPI_InitStructure;
3 m) r, q" T9 ^1 i4 M
9 z. o* R  {) A1 J  SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex;- a" t3 L) K* L3 w/ u
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //主设备$ i/ ], M* N  T! [- X  i6 I" b
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        //位数据一帧9 [; v! o9 ^+ m7 Z
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //时钟级性 SCK空闲时为1( F2 q" u5 `( u3 [4 y( c; e# e( d
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                //数据采样从第2个时钟边沿开始
! Z, H" W% B$ l/ J9 U3 z6 Q  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;4 M/ ?/ ^5 B- o$ ]2 O. w
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;        //波特率控制 fclk/4/ o' O1 O4 }, ]* B1 R
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                //先发送MSB                                         * d4 a& ]! S% d2 b
  SPI_Init(SPI1, &SPI_InitStructure);
; t* e" z( ^( M; V+ }* `- [  SPI_Cmd(SPI1, ENABLE);
% I4 o% I. y+ ~8 a) o
' r+ |8 ^) e$ |$ p# {0 T}$ M$ V* j' \; \

4 e4 Y7 H* X* {" m1 d" N/ pvoid LCD_wr(u8 lcd_com,u8 lcd_data)                                         //写入LCD数据或命令
: L) t" @! |. Y( H1 k! j. b{
6 f2 k" T2 c+ c- Y9 k+ j( h        u8 lcd_data_msb,lcd_data_lsb;8 W  `8 m9 e: F( m' v0 I9 [  T
        lcd_data_msb=0xf0&lcd_data;
* ^1 Q- t$ m! \7 [& Z4 X        lcd_data_lsb=(0x0f&lcd_data)<<4;
# j- y* F% u- V% L) O4 b        if(lcd_com==0)                                        //写命令
8 U$ z2 s  v  \  ^9 O        {1 J# e4 V2 l* a5 G+ e; f
                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);        //等待 SPI1 发送缓冲空$ H3 I" p' A5 I( t/ U% T
            SPI_I2S_SendData(SPI1, 0xf8);                        // SPI1 发送数据--命令指令--
5 m" X/ w, u. }! {1 e3 b  Y8 o        }0 X. m. \" U* U; F3 B1 X2 @  n
        if(lcd_com==1)                                        //写数据7 T8 ~0 C$ c( W) q7 `
        {- J3 I( x* o: W7 w  W
                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);                //等待 SPI1 发送缓冲空( P$ h$ r6 ]' n) r1 L) f4 c
            SPI_I2S_SendData(SPI1, 0xfa);                    //SPI1 发送数据--数据指令--. S# j4 u/ f6 v
        }
4 c" ]1 p) Z& \        delay(100);4 m" A) J- D  `, j4 u
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);                //等待 SPI1 接收数据完毕
8 ]# c- A4 I& y# t  Z        SPI_I2S_SendData(SPI1, lcd_data_msb);                   //SPI1 发送高4位数据
; O+ o' c7 a9 y2 W' i        delay(100);
7 w, L1 T' M3 ~  Y6 l' H        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);                //Wait for SPI1 Tx buffer empty. V5 h9 Q7 I3 ~% x
        SPI_I2S_SendData(SPI1, lcd_data_lsb);            // SPI1 发送低4位数据% `' M; g6 r1 T8 e3 g
        delay(100);+ y$ g, x" ]. y" S1 H: [
}        * [. j2 d( H$ Q
void initlcd(void)                          //LCD初始化/ j  H: c5 G0 y3 T. R
{
4 Q7 |( m  q- K- ~  LCD_wr(0,0x30);                  //30---基本指令动作 . p' v( b  Y; n
  delay (100);* `2 r" ^7 `$ F
  LCD_wr(0,0x01);                  //清屏,地址指针指向00H
6 {3 |/ b1 V4 Y  delay (100);: s2 h/ e' r- @3 R
  LCD_wr(0,0x06);                  //光标的移动方向
" y1 x9 _8 \; {3 w  delay (100);0 j: z) g' v1 [9 y1 x
  LCD_wr(0,0x0c);                  //开显示,关游标  T3 O# L8 T/ l6 R  H/ \
  delay (100);        2 u$ S9 Q8 ~+ K3 G7 b
}
- Y/ V2 F4 T3 bvoid delay (u16 ms)7 i5 a) C2 |; r, Q% w0 K; W0 V
{" Z; ~; @3 w1 E( @0 _: X; D
  u16 i,j;2 z6 l9 B' E8 n: R. M
  for(i=0;i<ms;i++)
" h! e) i6 }! X) s0 e  for(j=0;j<100;j++) {;}5 h7 G5 G( z/ c9 i/ l7 r
}1 f" `5 n- o/ r, {8 R8 X
void lcddisp(u8 *chn)                          
0 p& @4 h/ P9 m% z) l2 R& o$ t{- [( X. Z- p7 ?- X
  u8 i,j;
7 ^$ z* d/ @, U) d( P  LCD_wr(0,0x30);
4 `; W9 E. l! B7 r5 p0 p, ?  delay (100);( _+ R- f" I; J: E- d4 z
  LCD_wr(0,0x80);3 G) g7 C- q0 e( B3 C
  delay (100);% l: T) G) m; m3 y
  for (j=0;j<4;j++)# F; O6 g2 A: o, g
  {
- H* @) U5 R' f5 N5 J* N9 Y8 V# |    for (i=0;i<16;i++)7 @1 L9 h( Q* i2 k7 \1 j) s
            LCD_wr(1,chn[j*16+i]);: t6 E  `1 P/ k1 @0 f
                delay (100);
8 N2 c, o9 u! k5 g2 ^8 ^  }
; B/ D( q6 h/ Y( _1 [% i$ G2 [}
; a0 j7 B. P6 u3 F6 m
( y7 P  F" }5 c3 z, y' _  W/ k9 Y3 U# A0 Q$ e
7 ^% t+ v9 q+ @
希望能帮助需要用到的人哦,我也是花了很长时间才搞好的
+ T3 j/ P5 D) T) [$ z) O, a- E, A, s; Z5 M6 W
可能有的人不会接线,我上传下我的接线,这里片选直接接了VCC,数据线只接了时钟-R/W和数据命令发送-E。就是图中的STD和SCLK。仅供参考: E4 Y, H- T5 e+ i4 c9 g8 @
有图有真相哦3 k( M- K0 Z% O" v/ ^" f
( q5 j) S3 T( h7 _) `& L9 q1 ^
IMG_20150111_151609.jpg 7 N: }$ l8 U+ M2 V4 f$ A3 p

& U& M4 }* i4 r* s IMG_20150111_151622.jpg
& o/ ?( R, C/ D; T/ L1 S
  P- m0 n& D4 M" _7 r( I+ w
4 B; Z" x0 z& m0 o: q& ?3 G$ c5 a7 S* B, c

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& D2 N8 `6 m你好,能发一下你的打包代码吗?谢谢分享。
9 n5 N# |2 i: L7 s
不好意思,当时主要是用于我的一个小项目,现在搞的比较复杂了,贴出来的主要是一些最基本的操作,用这些就可以控制比较复杂的变化。看看过些时候,我把一些简单的应用稍微总结一下,再另贴发代码吧
回答时间:2016-6-1 20:43:23
sdtazzf 发表于 2016-5-27 14:290 a$ e% h% n# _1 t- A' r6 l% x
咨询楼主:为什么显示很慢啊?还有乱码。

/ Y6 K# ]" k/ f0 ]; a5 G' @8 a7 ?) M
要把延时缩短,我感觉比51单片机的并行口还快呢!乱码的话,不知道,我的没出现,你再试试,我现在用的屏不是金鹏的,是淘宝上的杂牌,量大的话才28一个的,效果也很好,兼容金鹏的
回答时间:2015-4-15 21:52:30
michael83 发表于 2015-4-15 10:08
+ w$ k5 j+ Z: ~0 n. |谢谢。非常棒的消息。* x! ^3 f+ i. j, J
想问,你的12864的核是st7920吗?谢啦。

" @: _- T$ U2 G* F# v3 w% K2 L" x( ]是的,是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 j. u% C! N# D

& w( [% f6 |$ Q2 g( \! v  Q5 Z看到你的液晶焊的软线,我后悔焊插针了
1 U6 d0 e" _! `; T3 u/ K焊了20个脚
6 t( ]0 c# N2 E* t4 Y
回答时间:2015-1-11 15:52:16
wambob 发表于 2015-1-11 15:487 P' B4 ]. M, b4 C) O
看到你的液晶焊的软线,我后悔焊插针了

4 F4 U* y& m! W+ e9 D  ^4 e,这个只能用于平时测试
kevin0129 回答时间:2015-1-11 16:01:54
我也准备用SPI驱动12864,不过我的板子是072的!
回答时间:2015-1-11 16:40:35
kevin0129 发表于 2015-1-11 16:01
, {9 `+ \" O) D% ^/ m2 h我也准备用SPI驱动12864,不过我的板子是072的!
% P. R& b7 y' Y/ ?; m  F  R5 N
我也刚买了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
不错的
% @7 n7 l8 |$ a9 }8 Cdiscovery与nucleo库函数有区别& c5 s! |( c7 \( }. s2 D
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
+ D1 c5 L9 @' Z9 |% d* X+ yspi怎么有一个复位线?还有读数据的函数呢?

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