本帖最后由 xnmc2013 于 2015-4-20 21:58 编辑 以前用51时,驱动12864屏用并口,但是感觉显示速度还是挺慢,现在用STM32F103ZE的SPI驱动,感觉还很快,而且很稳定。我试了金鹏OCMJ4*8C的,还试了刚买的一个杂牌的12864屏,显示都蛮快蛮好。我是用的V2版库文件,这里面关键是设置好SPI的一些参数,我都标住了中文解释。具体其他一些IO等的设置这里就不具体讲了,大家应该都会的哦~~好了,下面附上我的一部分代码供大家参考:! y! d) V8 ?) @8 Y6 M; M void SPI_Configuration(void)" E, H+ o, A4 B! E/ r4 ?: B { SPI_InitTypeDef SPI_InitStructure; 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个时钟边沿开始 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); SPI_Cmd(SPI1, ENABLE); }$ M$ V* j' \; \ void LCD_wr(u8 lcd_com,u8 lcd_data) //写入LCD数据或命令 { u8 lcd_data_msb,lcd_data_lsb;8 W `8 m9 e: F( m' v0 I9 [ T lcd_data_msb=0xf0&lcd_data; lcd_data_lsb=(0x0f&lcd_data)<<4; if(lcd_com==0) //写命令 {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 发送数据--命令指令-- }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 } delay(100);4 m" A) J- D `, j4 u while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET); //等待 SPI1 接收数据完毕 SPI_I2S_SendData(SPI1, lcd_data_msb); //SPI1 发送高4位数据 delay(100); 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 { LCD_wr(0,0x30); //30---基本指令动作 . p' v( b Y; n delay (100);* `2 r" ^7 `$ F LCD_wr(0,0x01); //清屏,地址指针指向00H delay (100);: s2 h/ e' r- @3 R LCD_wr(0,0x06); //光标的移动方向 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 } void 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++) 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) {- [( X. Z- p7 ?- X u8 i,j; LCD_wr(0,0x30); 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 { 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); } } , y' _ W/ k9 Y3 U# A0 Q$ e 7 ^% t+ v9 q+ @ 希望能帮助需要用到的人哦,我也是花了很长时间才搞好的 , 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 ^ & ?3 G$ c5 a7 S* B, c |
12864å±SPIæ¥çº¿
小马哥STM32F103开源小四轴RoboFly全部资料大放送
STM32固件库分享,超全系列整理
【MCU实战经验】+STM32F107的USB使用
基于STM32F103两轮平衡小车设计(开源)
STM32F107VCT6官方原理图和PCB
【福利】用STM32库的朋友有福了:STM32F10x_StdPeriph_Lib_V3.5.0chm...
基于STM32F10xx存储器和系统架构经验分享
基于STM32F1的CAN通信之BH1750
基于STM32F1的CAN通信之OLED
基于STM32F1的CAN通信之之串口IAP
不好意思,当时主要是用于我的一个小项目,现在搞的比较复杂了,贴出来的主要是一些最基本的操作,用这些就可以控制比较复杂的变化。看看过些时候,我把一些简单的应用稍微总结一下,再另贴发代码吧
5 G' @8 a7 ?) M
要把延时缩短,我感觉比51单片机的并行口还快呢!乱码的话,不知道,我的没出现,你再试试,我现在用的屏不是金鹏的,是淘宝上的杂牌,量大的话才28一个的,效果也很好,兼容金鹏的
是的,是ST7920的控制器,测试时是用的金鹏OCMJ4X8C,不过后来又买的杂牌的12864屏,和金鹏OCMJ4X8C完全兼容,感觉比金鹏还好用点,不过不知道是否耐用~~
看到你的液晶焊的软线,我后悔焊插针了
焊了20个脚
,这个只能用于平时测试
我也刚买了030的板子,过2个月也想把F1的移植到F0上面,不过固件库好像差别比较大
discovery与nucleo库函数有区别& c5 s! |( c7 \( }. s2 D
hal硬件抽象层函数库
用SPI驱动12864,不需要复位线,也基本不需要读取忙的状态,个别地方只要加入短暂的延时就行了。我只接了4根线:5V、0V、STD、SCLK。
你的17引脚RST没有连接,对吧?