本帖最后由 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等的设置这里就不具体讲了,大家应该都会的哦~~好了,下面附上我的一部分代码供大家参考: void SPI_Configuration(void)8 O% L5 p: y5 A6 v { SPI_InitTypeDef SPI_InitStructure;. }5 o0 C6 L! o. Q7 g e5 A* q. _ SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主设备 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; 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! ` } 1 Y- G3 S6 b+ L1 b4 _5 g1 D void LCD_wr(u8 lcd_com,u8 lcd_data) //写入LCD数据或命令 { u8 lcd_data_msb,lcd_data_lsb; lcd_data_msb=0xf0&lcd_data; lcd_data_lsb=(0x0f&lcd_data)<<4; 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 发送数据--命令指令-- } if(lcd_com==1) //写数据* y+ n& |5 b. q6 T" K6 E { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET); //等待 SPI1 发送缓冲空 SPI_I2S_SendData(SPI1, 0xfa); //SPI1 发送数据--数据指令--9 `& ] Y) G1 t5 w) a* o: ]) A } delay(100); 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. y$ I7 T- f5 l; q8 b! ] SPI_I2S_SendData(SPI1, lcd_data_lsb); // SPI1 发送低4位数据+ G/ N+ {( l. [, x1 X delay(100); } $ 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---基本指令动作 delay (100);7 s7 @6 ^6 l; H8 o7 b LCD_wr(0,0x01); //清屏,地址指针指向00H delay (100); 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); //开显示,关游标 delay (100); } void delay (u16 ms) {- H7 B" h, J4 V, V- ^ u16 i,j; for(i=0;i<ms;i++) ) m3 z! z$ c1 f4 a for(j=0;j<100;j++) {;} }5 h* Q' M' u% ^; p void lcddisp(u8 *chn) T6 Y0 u8 H! w4 u+ j2 l6 t { u8 i,j; 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); delay (100); 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); }0 I& d/ I2 l+ K2 X) U. c } 3 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 可能有的人不会接线,我上传下我的接线,这里片选直接接了VCC,数据线只接了时钟-R/W和数据命令发送-E。就是图中的STD和SCLK。仅供参考 有图有真相哦8 ~& k4 y t1 f' y% _ i8 K 6 |) g7 K0 d9 L8 m' n 2 Y' G- `' F: B$ A" } 3 I5 V2 v+ O0 V: V- H |
12864å±SPIæ¥çº¿
STM32固件库分享,超全系列整理
小马哥STM32F103开源小四轴RoboFly全部资料大放送
【管管推荐】STM32经验分享篇
【MCU实战经验】+STM32F107的USB使用
基于STM32F103两轮平衡小车设计(开源)
STM32F107VCT6官方原理图和PCB
【福利】用STM32库的朋友有福了:STM32F10x_StdPeriph_Lib_V3.5.0chm...
基于STM32F10xx存储器和系统架构经验分享
基于STM32F1的CAN通信之BH1750
基于STM32F1的CAN通信之OLED
不好意思,当时主要是用于我的一个小项目,现在搞的比较复杂了,贴出来的主要是一些最基本的操作,用这些就可以控制比较复杂的变化。看看过些时候,我把一些简单的应用稍微总结一下,再另贴发代码吧
* G! f/ D) `8 j' g5 N& W: _% S; `
要把延时缩短,我感觉比51单片机的并行口还快呢!乱码的话,不知道,我的没出现,你再试试,我现在用的屏不是金鹏的,是淘宝上的杂牌,量大的话才28一个的,效果也很好,兼容金鹏的
是的,是ST7920的控制器,测试时是用的金鹏OCMJ4X8C,不过后来又买的杂牌的12864屏,和金鹏OCMJ4X8C完全兼容,感觉比金鹏还好用点,不过不知道是否耐用~~
看到你的液晶焊的软线,我后悔焊插针了
焊了20个脚
,这个只能用于平时测试
我也刚买了030的板子,过2个月也想把F1的移植到F0上面,不过固件库好像差别比较大
discovery与nucleo库函数有区别2 d% E3 P- B" M+ \& ]2 Z+ y
hal硬件抽象层函数库
用SPI驱动12864,不需要复位线,也基本不需要读取忙的状态,个别地方只要加入短暂的延时就行了。我只接了4根线:5V、0V、STD、SCLK。
你的17引脚RST没有连接,对吧?