|
本帖最后由 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等的设置这里就不具体讲了,大家应该都会的哦~~好了,下面附上我的一部分代码供大家参考: 6 K |- q2 D }: X6 }- Q- O void SPI_Configuration(void) {! a, X; \! q3 L1 h& B& `$ M) z SPI_InitTypeDef SPI_InitStructure;1 g5 f8 E' a% \3 B8 S 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 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据采样从第2个时钟边沿开始 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); SPI_Cmd(SPI1, ENABLE); }9 ^! z5 H- X. _/ U' k+ i9 i void 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; 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 { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET); //等待 SPI1 发送缓冲空 SPI_I2S_SendData(SPI1, 0xf8); // SPI1 发送数据--命令指令-- % Q9 ~: n& |1 v, H$ Q } if(lcd_com==1) //写数据 { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET); //等待 SPI1 发送缓冲空 SPI_I2S_SendData(SPI1, 0xfa); //SPI1 发送数据--数据指令--( d6 T, c+ Y& |& O& B }: b ?; t; r( F! J# @ delay(100); 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); 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 } void initlcd(void) //LCD初始化 {" 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); //光标的移动方向 delay (100);. y9 b( k; A( i5 H* A- [3 K' j5 q LCD_wr(0,0x0c); //开显示,关游标 delay (100); }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 } void lcddisp(u8 *chn) { u8 i,j;. Y& r* r* @% f7 w3 V2 \# k LCD_wr(0,0x30); delay (100); LCD_wr(0,0x80); delay (100); 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++) LCD_wr(1,chn[j*16+i]); delay (100); }% A- X8 p, t8 K1 r }; C% o2 H3 V* r4 s # l4 T7 [6 t' V( u. A3 S0 a 2 [: p+ o# ^: h6 K 希望能帮助需要用到的人哦,我也是花了很长时间才搞好的 % P: A) b. O+ D! C; y. j3 W可能有的人不会接线,我上传下我的接线,这里片选直接接了VCC,数据线只接了时钟-R/W和数据命令发送-E。就是图中的STD和SCLK。仅供参考' \& a* A* \* g/ ?0 b 有图有真相哦" n( A8 D" w* Q: n4 V: l! d8 R8 z; B
, [# 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æ¥çº¿
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:雨露均沾·逢7狂欢】之五:STM32系统时钟PLL故障排除1例
【福利三:雨露均沾·逢7狂欢】之三:AI帮我查BUG
福利三:雨露均沾·逢7狂欢】之二:STM32F407VG串口通信乱码故障的排除
基于STM32F103的I2C主从机通信
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
TFT LCD 与 FSMC 的硬件连接大容量 STM32F10xxx FSMC 接口
单片机:初学者该了解的STM32F103基础知识
2025软件工具兔哥知道
STM32之继电器模块
微信公众号
手机版
不好意思,当时主要是用于我的一个小项目,现在搞的比较复杂了,贴出来的主要是一些最基本的操作,用这些就可以控制比较复杂的变化。看看过些时候,我把一些简单的应用稍微总结一下,再另贴发代码吧
要把延时缩短,我感觉比51单片机的并行口还快呢!乱码的话,不知道,我的没出现,你再试试,我现在用的屏不是金鹏的,是淘宝上的杂牌,量大的话才28一个的,效果也很好,兼容金鹏的
是的,是ST7920的控制器,测试时是用的金鹏OCMJ4X8C,不过后来又买的杂牌的12864屏,和金鹏OCMJ4X8C完全兼容,感觉比金鹏还好用点,不过不知道是否耐用~~
& @. l7 o0 z2 r# c0 d8 U$ @
看到你的液晶焊的软线,我后悔焊插针了
焊了20个脚: f' |7 X- P+ B
我也刚买了030的板子,过2个月也想把F1的移植到F0上面,不过固件库好像差别比较大
discovery与nucleo库函数有区别% z! V+ {0 ^/ x+ m$ k0 l
hal硬件抽象层函数库
用SPI驱动12864,不需要复位线,也基本不需要读取忙的状态,个别地方只要加入短暂的延时就行了。我只接了4根线:5V、0V、STD、SCLK。
你的17引脚RST没有连接,对吧?