本帖最后由 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 void SPI_Configuration(void)5 @8 E7 Q' }" |4 Y) q- r { SPI_InitTypeDef SPI_InitStructure; SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主设备 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个时钟边沿开始 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;4 y( u% J: @, u/ H5 N SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //波特率控制 fclk/4 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //先发送MSB 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 } - i& k; ]3 P; a void LCD_wr(u8 lcd_com,u8 lcd_data) //写入LCD数据或命令 {: 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; lcd_data_lsb=(0x0f&lcd_data)<<4; if(lcd_com==0) //写命令 { 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 } if(lcd_com==1) //写数据2 b& `3 ~6 Z* A1 M1 ]+ @ { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET); //等待 SPI1 发送缓冲空 SPI_I2S_SendData(SPI1, 0xfa); //SPI1 发送数据--数据指令-- }! {6 T1 R/ B5 G, h/ o delay(100);: ?; J/ ~, e6 w 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* T9 ^! s+ m& M% r3 K" o2 c SPI_I2S_SendData(SPI1, lcd_data_lsb); // SPI1 发送低4位数据 delay(100);$ x) v- @' v0 c9 K } ) T- Q9 h$ f9 L" X void initlcd(void) //LCD初始化 {, ^ \+ 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 delay (100); LCD_wr(0,0x06); //光标的移动方向 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 } void 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++) {;} }0 d4 N* l& _+ F0 E! j$ z void lcddisp(u8 *chn) { u8 i,j;) K: M* S' k1 W7 ~' [ LCD_wr(0,0x30);* r/ K4 Z+ F, D+ e0 _! ^, F! W delay (100); LCD_wr(0,0x80);8 u# ]0 _+ c5 Z8 {8 t delay (100); for (j=0;j<4;j++)# H" j9 J w+ t2 S+ c. v1 P { 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); }8 p3 `& @3 l" r0 q; Q# p7 U+ U+ M }. A9 g/ z c+ y: {1 g & S- C7 ?) E! x1 B 希望能帮助需要用到的人哦,我也是花了很长时间才搞好的 可能有的人不会接线,我上传下我的接线,这里片选直接接了VCC,数据线只接了时钟-R/W和数据命令发送-E。就是图中的STD和SCLK。仅供参考% ]- ^' I2 H3 q: ] 有图有真相哦 C: X9 v+ I$ u' x, R , f: { C! z& [ |
12864å±SPIæ¥çº¿
STM32固件库分享,超全系列整理
小马哥STM32F103开源小四轴RoboFly全部资料大放送
【MCU实战经验】+STM32F107的USB使用
基于STM32F103两轮平衡小车设计(开源)
STM32F107VCT6官方原理图和PCB
【福利】用STM32库的朋友有福了:STM32F10x_StdPeriph_Lib_V3.5.0chm...
基于STM32F10xx存储器和系统架构经验分享
基于STM32F1的CAN通信之BH1750
基于STM32F1的CAN通信之OLED
基于STM32F1的CAN通信之之串口IAP
不好意思,当时主要是用于我的一个小项目,现在搞的比较复杂了,贴出来的主要是一些最基本的操作,用这些就可以控制比较复杂的变化。看看过些时候,我把一些简单的应用稍微总结一下,再另贴发代码吧
要把延时缩短,我感觉比51单片机的并行口还快呢!乱码的话,不知道,我的没出现,你再试试,我现在用的屏不是金鹏的,是淘宝上的杂牌,量大的话才28一个的,效果也很好,兼容金鹏的
是的,是ST7920的控制器,测试时是用的金鹏OCMJ4X8C,不过后来又买的杂牌的12864屏,和金鹏OCMJ4X8C完全兼容,感觉比金鹏还好用点,不过不知道是否耐用~~
看到你的液晶焊的软线,我后悔焊插针了+ y$ Z7 @5 \5 c" m; ^
焊了20个脚) b9 ]5 E! j0 {3 w$ A
,这个只能用于平时测试
我也刚买了030的板子,过2个月也想把F1的移植到F0上面,不过固件库好像差别比较大
discovery与nucleo库函数有区别# B6 Z v0 v1 S$ {- r, Z
hal硬件抽象层函数库
用SPI驱动12864,不需要复位线,也基本不需要读取忙的状态,个别地方只要加入短暂的延时就行了。我只接了4根线:5V、0V、STD、SCLK。
你的17引脚RST没有连接,对吧?